LINUX.ORG.RU

История изменений

Исправление zaz, (текущая версия) :

немного больше поковырял данный пример - в принципе modify возвращает 'a' только если влючена оптимизация по strict-aliasing (тоесть при сборке с -O3 -fno-strict-aliasing возвращаться будет 'b'). Но при этом строчка *(short *)test = 'b'; - обсолютно законна и корректа (мы можем приводить char* к short*). Однако компилятор видет что short* не может быть алиасом ни для global (struct global* не может быть приведен к short*), ни для global.a (int* не совместим с short*) а значит строчка

*(short *)test = 'b';
не может модифецировать переменную global (поскольку разрешена оптимизация по strict aliase), а занчит можно производить оптимизацию возвращаемого значения (вернуть константу 'a' вместо чтения из памяти значения global.a).

Например если заменить short* на int* или global*

((struct global*)(test))->a = 'b';
// OR
*((int*)test) = 'b';
то такое присвоение с точки зрения GCC может изменить состояние переменной global и при возврате значения он сгенерирует чтение из памяти вместо возврата константы 'a'.

Если ничего не напутал то както-так.

Исходная версия zaz, :

немного больше поковырял данный пример - в принципе modify возвращает 'a' только если влючена оптимизация по strict-aliasing (тоесть при сборке с -O3 -fno-strict-aliasing возвращаться будет 'b'). Но при этом строчка *(short *)test = 'b'; - обсолютно законна и корректа (мы можем приводить char* к short*). Однако компилятор видет что short* не может быть алиасом ни для global (struct global* не может быть приведен к short*), ни для global.a (int* не совместим с short*) а значит строчка

*(short *)test = 'b';
не может модифецировать переменную global (поскольку разрешена оптимизация по strict aliase), а занчит можно производить оптимизацию возвращаемого значения (вернуть константу 'a' вместо чтения из памяти значения global.a).

Если ничего не напутал то както-так.