VS2013的奇怪行为

时间:2015-01-20 06:41:55

标签: c++ visual-studio-2013

最近我在发布模式下遇到了程序崩溃,而在调试模式下运行正常。

通过深入检查我的代码,我发现在功能结束时忘记了return true,导致崩溃。该函数应在失败时返回false,否则返回true。

我在徘徊是否这是编译器的缺陷(vs 2013),因为它(可能)在函数末尾添加了return true语句,但是在发布时没有。因此,程序员将花费大量时间来调试故障,但程序员应该责备。

:)

2 个答案:

答案 0 :(得分:4)

在应该返回值的函数的末尾流动是未定义的行为。未定义的行为意味着编译器可以执行任何操作并仍然符合要求。发出警告信息是合规的。不发出警告信息是合规的。擦除硬盘:这也符合要求。对我来说幸运的是,还没有发生。我曾多次不幸地调用未定义的行为。

这是未定义行为的一个原因是因为存在一些奇怪的情况,其中流分析无法确定函数是否返回值。另一个原因是您可能已经使用程序集以一种在您的计算机上正常工作的方式设置返回值。第三个原因是编译器必须进行流量分析才能做出此决定;除非启用优化,否则许多编译器都不会这样做。

也就是说,在闭括号之前缺少返回通常会触发编译器检查函数是否返回值。当它发出警告时,编译器对你很好。

您收到了警告消息而忽略了它 - 从不这样做。使用设置为相当高级别的标志进行编译并解决每个警告。代码应始终编译干净。总是

答案 1 :(得分:0)

C和C ++是宽容语言。当程序员编写编译器可编译的代码时,即使它看起来很奇怪,编译器也会发出警告。警告意味着您正在撰写可能包含错误的内容,但会做出决定

它允许自愿进行某些优化。例如,您始终可以将2D数组用作一维数组,这是其他语言无法实现的。但是如果你不确定你是否知道为什么要强迫编译器使用它不喜欢的东西,那么对应的永远不会忽略警告

结论:一旦他忽略了最终导致错误的警告,程序员就应该受到责备; - )