c++ - 未初始化的警告需要 -O2
问题描述
当我编译以下 C++ 程序时,我需要添加-O2
标志以获取有关未初始化变量的警告。这是为什么?
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(或任何其他优化)模式下,同时选项已-Wmaybe-uninitialized
打开。该-Wmaybe-uninitialized
选项也会在-Wall
启用任何优化模式的情况下打开。
根据GCC 文档,这样做的原因是:
-Wmaybe-uninitialized
对于自动(即局部)变量,如果存在从函数入口到使用已初始化变量的路径,但存在一些其他未初始化变量的路径,则编译器如果无法初始化则发出警告证明未初始化的路径不会在运行时执行。 这些警告只能在优化编译时出现,否则 GCC 不会跟踪变量的状态。这些警告是可选的,因为尽管看起来有错误,但 GCC 可能无法确定代码何时正确。
然后是一个例子,说明上述场景是如何发生的。
推荐阅读
- git - 已设置 ssh 时在推送时使用用户名/密码
- javascript - 通过仅使用选择器的子元素来恢复元素
- python - 从数据集中消除所有高于 95% 的数据
- android - 我在我的 android studio 项目中创建了片段,但我的 PlaceholderFragment.java 文件中出现错误,如下所示。我现在该怎么办?
- angular - Angular,spring,通过HTTP上传文件被发送两次(OPTION + POST)
- javascript - Liferay 问题 - Liferay 7.1 GA
- android - 如何在 Admob 上查找应用程序的包名?
- c - 如何在c中放置空格
- javascript - 无法在 ASP.NET 中使用 Javascript 动态添加输入类型按钮
- code-coverage - 为什么 Jacoco 报告在连续测试运行中显示不同的覆盖率?