gpt4 book ai didi

c++ - 禁用优化时没有 "may be used uninitialized"

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:12 26 4
gpt4 key购买 nike

简单来说:

我需要为 -O0 优化显示“可能未初始化使用”

当优化关闭时,我遇到了导致警告“可能在此函数中未初始化使用”的问题。

我的代码是这样的:

 int i = i;

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

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

当然还有gcc警告选项:

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

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

-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

最佳答案

我认为你需要:

-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,向您的 make 进程返回一个错误代码。这有点麻烦,但您最终可能不得不做一些类似的描述。

关于c++ - 禁用优化时没有 "may be used uninitialized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25845290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com