6.7优化和编译器警告

当优化选项打开,GCC可以产生在没有使用优化时不能产生的额外警告信息。

作为优化程序的一部分,编译器会检查所有使用的变量和他们内部的值--这被叫做数据流分析。它是其他优化类型的基础,例如指令调度。数据流分析的额外作用是编译器可以检查没有初始化就使用的变量。

‘-Wuninitialized’选项(包含在’-Wall’选项中)检查那些没有初始化的变量。当编译程序时使用优化使能了数据流分析后这个选项才会起作用。下面的程序例子包含了一个这样的变量:

int

sign (int x)

{

int s;

if (x > 0)

s = 1;

else if (x < 0)

s = -1;

return s;

}

这个函数在大多数情况下运行正确但是有一个bug当x为0的时候--在这种情况下返回值s变量没有被定义。

单独使用’-Wall’选项编译程序不会产生任何警告信息,因为没有优化选项时数据流分析没有使能:

$ gcc -Wall -c uninit.c

为了产生警告信息,必须同时使用’-Wall’和优化选项编译程序。经验上优化等级’-O2’会产生一个很好的警告信息:

$ gcc -Wall -O2 -c uninit.c

uninit.c: In function ‘sign’:

uninit.c:4: warning: ‘s’ might be used uninitialized

in this function

这时编译器正确的检查出来变量s可能没有初始化就使用。

注意GCC通常会找到很多未初始化的变量,但是偶尔会错过一些情况或者产生错误的警告信息。后面一种情况,通常可以使用一种更加简单的方法重写相关代码从而移除警告信息和提高代码可阅读性。