【发布时间】:2017-08-09 02:49:30
【问题描述】:
我有以下功能(简化示例):
QByteArray DecompressBytes(const QByteArray& content){
/* function body (with other return expressions) */
do { return content; } while(content.size() != 0);
}
添加了最后一行用于测试,替换了使用的宏。 Visual Studio 没有看到这段代码有问题,但是 g++ 生成了
警告:控制到达非空函数的结尾 [-Wreturn-type]
将最后一行更改为 return content; 会删除警告。
我的问题:为什么编译器会以这种方式运行以及代码的形式应该是什么以避免任何警告?
最后一行曾经是ASSERT_FAIL("must be unreachable", content),ASSERT_FAIL 扩展为do { ... } while(false) 模式,用另一个宏替换while 以禁止非布尔表达式,因此生成的表达式类似于do { qt_assert_x("", "", 42); return content; } while(::helper::bool_verify(false));。
g++ 版本 5.3.0,与 MinGW(标准 Qt 设置)一起使用。
更新:在尝试注释代码的不同部分(因为上面的纯示例不允许重现问题)之后,出现了一些非常奇怪的东西:
QByteArray DecompressBytes(const QByteArray& content){
QByteArray decompressed; //no 'unused variable' warning
do { return content; } while(content.size() != 0);
} //produces warning above
QByteArray DecompressBytes2(const QByteArray& content){
//QByteArray decompressed;
do { return content; } while(content.size() != 0);
} //doesn't produce warning
std::vector<char> DecompressBytes3(const std::vector<char>& content){
std::vector<char> decompressed; //no 'unused variable' warning
do { return content; } while(content.size() != 0);
} //does produce warning
std::vector<char> DecompressBytes4(const std::vector<char>& content){
int decompressed; //unused variable warning is given
do { return content; } while(content.size() != 0);
} //doesn't produce warning
不确定所有这些意味着什么。
【问题讨论】:
-
我打了一个答案,但仔细检查你的例子,我很惊讶 g++ 在这种情况下发出警告。
-
实际上它应该引发另一个警告,
content.size() != 0不可访问。所以这段代码还是有问题的。 -
可能是 gcc 在 do..while 的流控制分析中没有特殊情况。条件可能是假的,所以循环可能不会运行......至少这是其他循环的有效推理。
-
@Slava 我相信我已经解释了
while()中的非常量表达式的来源。另外,我不记得曾经用这个习语看到过“无法访问的代码”警告。 -
@Abstraction 您的解释并没有使该代码不被破坏。我还说它应该发出警告,但它没有义务这样做。
标签: c++ gcc gcc-warning