Включение строгих предупреждений о псевдонимах в g ++ - PullRequest
6 голосов
/ 18 декабря 2011

Как правильно включить строгие предупреждения о псевдонимах в g ++?VC ++ 10 реализует эти правила?

Ответы [ 3 ]

4 голосов
/ 18 декабря 2011

Используйте -fstrict-aliasing для g++.Я также использую -Wstrict-aliasing=2, чтобы увидеть предупреждения, связанные с возможными нарушениями строгих правил наложения имен.

3 голосов
/ 18 декабря 2011

Они включаются автоматически -O2, потому что он должен использовать их для выполнения некоторых оптимизаций. Определенно объедините его с предупреждением (-Wall делает свое дело), ​​чтобы убедиться, что вы не создаете потенциально глючный код. В противном случае вы можете использовать -fstrict-aliasing, как показано в другом ответе, чтобы включить их.

Однако я не уверен насчет VC ++ 10.

1 голос
/ 18 декабря 2011

VC ++ 10 включает правило строгого алиасинга с / O1 и выше. Я использую тестовую программу (со значением счетчика 6) в главе «ПРЕИМУЩЕСТВА ДЛЯ СТРОГО ПРАВИЛА ПОВЕСТКИ ДНЯ» в здесь . И получите следующий код asm. Вы можете видеть, что загрузка b выполняется только один раз.

00A910AE  movzx       edx,word ptr [edx+2]  //Load of b
00A910B2  xor         eax,eax  
00A910B4  xor         ecx,ecx  
00A910B6  add         dword ptr [esp+eax*4+34h],edx  //Loop start
00A910BA  add         eax,1  
00A910BD  adc         ecx,edi  
00A910BF  jne         main+76h (0A910C6h)  
00A910C1  cmp         eax,6  
00A910C4  jb          main+66h (0A910B6h)  //Loop end

Но похоже, что нет способа включить предупреждение за нарушение этого правила.

...