为什么有些语句会在“中生成警告”;“释放”;但不在“中”;“调试”;使用GCC进行模式编译? 我使用GCC编译一些C++代码,而代码在使用“调试”配置时编译得很好,它在“发布”配置中发出警告。编译选项的唯一区别是:
“调试”:为什么有些语句会在“中生成警告”;“释放”;但不在“中”;“调试”;使用GCC进行模式编译? 我使用GCC编译一些C++代码,而代码在使用“调试”配置时编译得很好,它在“发布”配置中发出警告。编译选项的唯一区别是:,c++,gcc,gcc-warning,C++,Gcc,Gcc Warning,“调试”:g++-O0-g3… “发布”:g++-O3… 我在“发布”版本中看到的消息: 为什么警告不同?一些警告是基于“流分析”生成的,这是编译器在某些优化步骤中执行的操作 您可能应该修复这些警告 网站上有关于这种行为的错误报告。尝试将--no warn unused result添加到您的“Release”配置文件中。为什么这很重要?检查返回值。@chris-首先,重要的是b/c我感兴趣的是真正理解这个问题,而不仅仅是绕过它。其次,这不是我的代码,而是从网上下载的一个包的一部分,所以我不愿意
g++-O0-g3…
“发布”:g++-O3…
我在“发布”版本中看到的消息:
为什么警告不同?一些警告是基于“流分析”生成的,这是编译器在某些优化步骤中执行的操作
您可能应该修复这些警告 网站上有关于这种行为的错误报告。尝试将--no warn unused result添加到您的“Release”配置文件中。为什么这很重要?检查返回值。@chris-首先,重要的是b/c我感兴趣的是真正理解这个问题,而不仅仅是绕过它。其次,这不是我的代码,而是从网上下载的一个包的一部分,所以我不愿意更改它。这并不是真正绕过一个问题去注意一个合乎逻辑的编译器警告。如果它读不到你所期望的,你就没有办法知道。作为其他人编写的代码,他们应该努力使其健壮,并且在编译时不会发出警告。谢谢。这不是我的代码,而是从网上下载的软件包的一部分,所以我不愿意更改它。奇怪的是,这两个
fread()
调用位于if else
语句的两个分支中,因此其中一个应该被计算(除非whileif
被优化掉,但情况似乎并非如此)。然后,紧接着在fread()
-s之后出现fclose()
语句。为什么在这些(或数千个未被检查的stdlib函数调用中的任何其他stdlib函数调用)上没有警告?@ysap,因为fread
具有附加属性。你永远不知道你从输入中得到了什么,所以当你不检查时它会警告你。谢谢。哇,这太“深”了。这份报告确实把事情联系了起来。我没有深入阅读bug报告线程,但其中有一些深思熟虑的论点。使用该标志是一个坏主意。大多数有缺陷的C程序的问题是未检查的结果。您不想隐藏这些问题。
../src/xml.cpp: In static member function ‘static Z<char>* XML::ReadToZ(const char*, XMLTransform*, XMLTransformData*)’:
../src/xml.cpp:5034: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
../src/xml.cpp:5041: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
/* 5034 */ fread((*y).operator char *(),1,S,fp);
/* 5041 */ fread(yy.operator char *(),1,S,fp);