简单的简短说明:
我需要展示"可以使用未初始化的" 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
答案 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,但你可能最终不得不做一些这样的描述。