gcc的又一个BUG:优化abs出错?

测试代码:

#include <stdlib.h> 
#include <stdio.h> 

int main () { 
  int i=2; 
  if( (-2*abs (i-1)) == 
      (2*abs(i-1)) ) 
    printf ("OMG,-10==10 !!\n"); 
  else 
    printf ("nothing special here\n"); 
}

测试环境:
Freebsd 6.2, gcc 3.4和gcc 4.2
输出都是"OMG,-10==10 !!"。
为什么呢?
freebsd的libc的abs的实现在/usr/src/lib/libc/stdlib/abs.c,但是我在gdb中对这个函数下断点发现并没有进入这个函数。然后用gcc -S编译,查看源代码发现它并没有调用libc库的abs函数,而是被gcc优化掉了,尽管我是用gcc -O0编译。
核实了下,的确,gcc在其内部实现了abs函数,如果这样编译
gcc42 -o test1 test1.c -ggdb -fno-builtin
则就调用libc的abs函数,就没有问题了。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥