Solidot报道GCC在Linux平台下有一个BUG。但是原文中说只有Linux平台有这个问题是不正确的,经过令狐的实际测试,在HP-UX(GCC 4.0.2),LINUX(UBUNTU,GCC 4.1.2),WINDOWS(GCC 3.4.5)下都存在在这个问题。
为了调查研究一下这个问题究竟是如何造成的,我们一帮人展开了一番讨论,经过对汇编代码的分析,结果看来是GCC的代码优化实现有问题。
测试的C源程序如下:
int main () {
int i=2;
if( -10*abs (i-1) == 10*abs(i-1) )
printf ("OMG,-10==10 in linux!/n");
else
printf ("nothing special here/n");
}
在X86 Linux平台下的汇编代码片段如下:
19 mov DWORD PTR [%ebp-8], 2
20 mov %edx, DWORD PTR [%ebp-8]
21 mov %eax, %edx
22 sal %eax, 2
23 add %eax, %edx
24 add %eax, %eax
25 sub %eax, 10
26 mov %edx, %