У меня вопрос о строгих правилах сглаживания, объединениях и стандарте. Предположим, у нас есть следующий код:
#include <stdio.h>
union
{
int f1;
short f2;
} u = {0x1};
int * a = &u.f1;
short * b = &u.f2;
int main()
{
u.f1 = 1;
*a += 1;
u.f2 = 2;
*b *= 2;
printf( "%d %hd\n", *a, *b);
return 0;
}
Теперь давайте посмотрим, как это работает:
$ gcc-5.1.0-x86_64 t.c -O3 -Wall && ./a.out
2 4
$ gcc-5.1.0-x86_64 t.c -O3 -Wall -fno-strict-aliasing && ./a.out
4 4
Мы видим, что строгое сглаживание разрывает зависимости. Более того, это кажется правильным кодом, не нарушающим правило строгого псевдонима.
- Получается, что в случае полей объединения объект, лежащий по адресу, совместим со всеми типами членов объединения?
- Если 1 верно, что компилятор должен делать с указателями на члены объединения? Это проблема стандарта, который разрешает такое поведение компилятора? Если нет - почему?
- Вообще говоря, иное поведение компилятора с корректным кодом недопустимо ни в коем случае. Так что, похоже, это тоже ошибка компилятора (особенно если обращение к полю объединения будет внутри функций, SA не нарушает зависимость).
-fno-strict-aliasing
или-O0
. - person supercat   schedule 21.06.2018