为什么有些语句在使用GCC进行“Release”编译时会产生警告,而在“Debug”模式下不会产生警告?

3
我正在使用gcc编译一些C++代码,当使用“Debug”配置进行编译时,代码可以正常编译,但在“Release”配置下会发出警告。编译选项的唯一差异是:
“Debug”:g++ -O0 -g3 ... “Release”:g++ -O3 ... 我在“Release”构建中看到的消息:
../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);

为什么警告信息不同?

2
为什么这很重要?检查返回值。 - chris
@chris - 首先,这很重要,因为我有兴趣真正理解问题,而不仅仅是绕过它。其次,这不是我的代码,而是从网络上下载的一个包的一部分,所以我不愿意改变它。 - ysap
1
遵循编译器发出的有逻辑意义的警告并不是回避问题。如果它无法读取您期望的内容,您就没有办法知道。作为他人编写的代码,他们应该付出努力使其健壮,并在编译时不产生警告。 - chris
2个回答

2

一些警告是基于"流分析"而生成的,这是编译器在某些优化步骤中执行的操作。

你可能应该修复这些警告!


谢谢。这不是我的代码,而是从网络下载的包的一部分,所以我不愿意更改它。奇怪的是,这两个 fread() 调用位于 if-else 语句的两个分支中,因此其中一个应该被评估(除非while if被优化掉了,但这似乎不是这种情况)。然后,在 fread() 后面立即出现 fclose() 语句。为什么这些函数调用没有警告(或其他数千个未被检查的stdlib函数调用)? - ysap
@ysap,因为fread有附加的属性。你从输入中得到的内容是未知的,所以当你不检查时它会发出警告。 - chris

1

关于这个行为,在GCC bugzilla上有一个错误报告。尝试在您的“发布”配置文件中添加--no-warn-unused-result。


谢谢。哇,这真是“深奥”。这份报告确实让事情有了背景。我没有深入阅读错误报告线程,但那里有一些深思熟虑的论点。 - ysap
使用那个标志是一个坏主意。大多数有缺陷的 C 程序问题在于未经检查的结果。您不希望隐藏这些问题。 - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接