Рассмотрим две несколько разные версии одного и того же кода:
struct s
{
int dummy[1];
};
volatile struct s s;
int main(void)
{
s;
return 0;
}
и
struct s
{
int dummy[16];
};
volatile struct s s;
int main(void)
{
s;
return 0;
}
Вот что я получаю с gcc 4.6.2 для них:
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl _s, %eax
xorl %eax, %eax
leave
ret
.comm _s, 4, 2
и
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
xorl %eax, %eax
leave
ret
.comm _s, 64, 5
Обратите внимание на отсутствие доступа к s
во втором случае.
Является ли это ошибкой компилятора или я просто имею дело со следующим утверждением стандарта C, и разработчики gcc просто выбрали такую странную определенность для реализации и все еще играют по правилам?:
Что представляет собой доступ к объекту, который имеет тип с изменчивой квалификацией, определяется реализацией.
В чем причина этой разницы? Я бы, естественно, ожидал, что вся структура будет доступна (или не будет доступна, я не уверен), независимо от ее размера и того, что внутри него.
P.S. Что делает ваш компилятор (не-gcc или new gcc) в этом случае? (пожалуйста, ответьте на этот последний вопрос в комментарии, если это единственная часть, которую вы собираетесь адресовать, поскольку это не основной вопрос, который задают, но более интересный вопрос).