Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未初始化的警告需求-O2 < >我编译以下C++程序时,需要添加 -O2FLAG,以获得关于未初始化变量的警告。为什么呢 unsigned long fac(unsigned long n) { unsigned long product; while (n > 1) { product = product * n; n = n - 1; } return product; } ➜ a g++ --version g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)_C++_Gcc_Warnings - Fatal编程技术网

未初始化的警告需求-O2 < >我编译以下C++程序时,需要添加 -O2FLAG,以获得关于未初始化变量的警告。为什么呢 unsigned long fac(unsigned long n) { unsigned long product; while (n > 1) { product = product * n; n = n - 1; } return product; } ➜ a g++ --version g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)

未初始化的警告需求-O2 < >我编译以下C++程序时,需要添加 -O2FLAG,以获得关于未初始化变量的警告。为什么呢 unsigned long fac(unsigned long n) { unsigned long product; while (n > 1) { product = product * n; n = n - 1; } return product; } ➜ a g++ --version g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2),c++,gcc,warnings,C++,Gcc,Warnings,编辑:为了澄清问题,我当然启用了警告。未初始化的变量不是技术错误;x86/x64程序集中的内存可以取消初始化。从未初始化内存(可通过受保护/长模式限制读取)读取是有效的。您将获得未定义的值,但在技术上是有效的 它向您显示什么取决于编译器(因此,它是可用的选项)。更高级别的选项可能会将此视为错误并停止;但从技术上讲这是可能的。警告显示在-O2(或任何其他优化)模式下,同时启用选项-Wmaybe uninitialized。-Wmaybe uninitialized选项也会在-Wall和启用任何优化

编辑:为了澄清问题,我当然启用了警告。

未初始化的变量不是技术错误;x86/x64程序集中的内存可以取消初始化。从未初始化内存(可通过受保护/长模式限制读取)读取是有效的。您将获得未定义的值,但在技术上是有效的


它向您显示什么取决于编译器(因此,它是可用的选项)。更高级别的选项可能会将此视为错误并停止;但从技术上讲这是可能的。

警告显示在-O2(或任何其他优化)模式下,同时启用选项
-Wmaybe uninitialized
-Wmaybe uninitialized
选项也会在
-Wall
和启用任何优化模式时打开

原因如下:

-Wmaybe未初始化

对于自动(即局部)变量,如果存在来自函数的路径 已初始化的变量的用法,但存在其他变量 未初始化变量的路径,如果 它无法证明未初始化的路径未在运行时执行。 只有在优化编译时才可能出现这些警告,否则 GCC不跟踪变量的状态。这些警告是可选的,因为GCC可能无法确定 当代码正确时,尽管看起来有错误

接下来是一个上述场景如何发生的示例。

为了更深入地回答为什么这个问题,这样做主要是为了减少误报率和编译时间。生成这些警告的过程(可能未初始化的
-Wmaybe
flavor)在编译管道中运行得很晚(请参见
gcc/passs.def
;相应的
pass\u late\u warn\u uninitialized
过程在第338行左右)。GCC努力为该警告产生尽可能少的误报。要做到这一点,它需要更精确的计划信息。为了获得这些信息,需要事先进行一些分析/转换(例如,这特别有益)。而且其中一些成本太高,无法在
-O0
上启用

GCC开发是在开放的环境中完成的。所有重大决策通常在邮件列表和bugzilla中讨论。例如,请参见



这是否发生在
-Wall-Wextra
上?(你应该总是有两个命令。)是的,我应该指出。事实上,
-O1
优化级别就足够了(任何优化级别都可以)。@choeger:这能回答你的问题吗?OP几乎从未接受过答案(最后11个问题没有),他们有些像这样…:(@P.W不,它没有完全回答我的问题。我想知道原因。