没有"可以使用未初始化的"何时禁用优化

时间:2014-09-15 09:53:49

标签: c++ c gcc optimization

简单的简短说明:

我需要展示"可以使用未初始化的" for -O0 optimization

我遇到原因警告问题"可能在此功能中使用未初始化"何时关闭优化。

我的代码是这样的:

 int i = i;

这显然是错误的。如果关闭编译器优化 - 没有警告,但如果我将优化转为-O1 warring出现。

当禁用-O选项的优化时,我需要显示此警告。

当然有gcc警告选项:

-Wall -Wextra -Winit-self -Wuninitialized -Werror

我阅读了章节3.10 Options That Control Optimization,关闭优化并手动添加所有-f标志,这些标志应该为-O1级别打开:

-fauto-inc-dec          
-fcprop-registers           
-fdce           
-fdefer-pop           
-fdelayed-branch           
-fdse           
-fguess-branch-probability           
-fif-conversion2           
-fif-conversion           
-fipa-pure-const           
-fipa-reference           
-fmerge-constants
-fsplit-wide-types           
-ftree-builtin-call-dce           
-ftree-ccp           
-ftree-ch           
-ftree-copyrename           
-ftree-dce           
-ftree-dominator-opts           
-ftree-dse           
-ftree-forwprop           
-ftree-fre           
-ftree-phiprop           
-ftree-sra           
-ftree-pta           
-ftree-ter           
-funit-at-a-time

和其他:

-fdefer-pop
-fthread-jumps
-fcprop-registers
-fomit-frame-pointer

没有警告。

拜托,你能告诉我我错过了哪面旗帜吗? 我必须使用的编译器是gcc-4.5.4

1 个答案:

答案 0 :(得分:4)

我认为你需要:

  

-Wuninitialized -Winit-self

那个。即使使用-O0,仍会产生关于自我初始化的警告(至少对于gcc 4.7.2):

pax> cat x.c
#include <stdio.h>

int main (void) {
    int i = i;
    return 0;
}

pax> gcc -O0 -Wuninitialized -Winit-self -o x x.c
x.c: In function ‘main’:
x.c:4:6: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]

如果您无法为您的gcc版本发生这种情况,那么可能是另一种方式。您可以更改构建内容的方式,以便首先在-O1进行检查,并且只有在它们通过时才进行-O0构建。这样的Makefile应该是一个好的开始:

x: x.c
    gcc -O1 -Wuninitialized -Winit-self -Werror -o x x.c
    gcc -O0 -o x x.c

第一次编译会将警告视为错误,因此,如果发现自我初始化,make进程将完全停止。

如果没有警告,请继续使用-O0继续构建可执行文件。

这可能需要进行调整才能实现,因此只有自我初始化会停止进程并且它们可能会有点棘手。但是,如果您需要这种行为,请记住这一点,并且您无法说服当前的编译器在该优化级别将其提供给您。

一种方法是简单地使用-Werror,而是捕获编译器的输出并专门搜索字符串is used uninitialized,并向您的{返回错误代码{1}}进程。这有点像kludge,但你可能最终不得不做一些这样的描述。