История изменений
Исправление 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';
Например если заменить short* на int* или global*
((struct global*)(test))->a = 'b';
// OR
*((int*)test) = 'b';
Если ничего не напутал то както-так.
Исходная версия 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';
Если ничего не напутал то както-так.