在 g++ 中启用严格别名警告的正确方法是什么?VC++ 10 是否实现了这些规则?
问问题
1265 次
3 回答
4
用于. -fstrict-aliasing
_ g++
我还用于-Wstrict-aliasing=2
查看与可能违反严格别名规则有关的警告。
于 2011-12-18T15:45:28.977 回答
3
它们是自动启用的,-O2
因为它需要使用它们来进行一些优化。绝对将它与警告结合起来(-Wall
可以解决问题),以确保您没有构建潜在的错误代码。否则,您可以使用-fstrict-aliasing
在另一个答案中看到的来启用它们。
但是,我不确定 VC++10。
于 2011-12-18T15:56:36.253 回答
1
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
但看起来没有办法启用违反此规则的警告。
于 2011-12-18T17:16:00.437 回答