VS2013 的奇怪行为
Strange behavior of VS2013
最近我的程序在发布模式下崩溃而在调试模式下运行良好。
通过深入检查我的代码,我发现我忘记了在函数末尾 return true
,这导致了崩溃。该函数在失败时应该 return 为假,否则,它 return 为真。
我在想这是否是编译器的缺陷(与 2013 相比),因为它(可能)为我在函数末尾添加了 return true
语句,但是在发布时它没有。因此,程序员将花费大量时间来调试错误,尽管,程序员应该责备。
:)
C 和 C++ 是容错语言。当程序员编写的代码即使看起来 很奇怪 编译器也可以编译时,编译器会发出警告。警告意味着您正在编写可能包含错误的内容,但您做出决定。
它允许自愿进行某些优化。例如,您始终可以将二维数组用作一维数组,这在其他一些语言中是做不到的。但是对应的是如果你不确定你为什么要强迫编译器做它不喜欢的事情,永远不要忽略警告
结论:一旦他忽略了最终导致错误的警告,程序员就应该受到责备;-)
从应该 return 值的函数末尾流出是未定义的行为。未定义的行为意味着编译器可以做任何事情并且仍然是兼容的。发出警告信息是合规的。不给出警告消息是合规的。擦除硬盘驱动器:这也是合规的。对我来说幸运的是,这还没有发生。我不幸调用了很多很多次未定义的行为。
这是未定义行为的一个原因是因为在某些奇怪的情况下,流分析无法确定函数 return 是否是一个值。另一个原因是您可能已经使用程序集以一种在您的计算机上工作得很好的方式设置了 return 值。第三个原因是编译器必须进行流分析才能做出此决定;除非启用优化,否则许多编译器不会这样做。
也就是说,在右大括号前缺少 return 通常会触发编译器检查函数 return 是否有值。编译器在发出警告时对你很好。
您收到一条警告消息并忽略了它 -- 永远不要那样做。将标志设置为合理的高级别进行编译,并解决每一个警告。代码应该始终编译干净。总是。
最近我的程序在发布模式下崩溃而在调试模式下运行良好。
通过深入检查我的代码,我发现我忘记了在函数末尾 return true
,这导致了崩溃。该函数在失败时应该 return 为假,否则,它 return 为真。
我在想这是否是编译器的缺陷(与 2013 相比),因为它(可能)为我在函数末尾添加了 return true
语句,但是在发布时它没有。因此,程序员将花费大量时间来调试错误,尽管,程序员应该责备。
:)
C 和 C++ 是容错语言。当程序员编写的代码即使看起来 很奇怪 编译器也可以编译时,编译器会发出警告。警告意味着您正在编写可能包含错误的内容,但您做出决定。
它允许自愿进行某些优化。例如,您始终可以将二维数组用作一维数组,这在其他一些语言中是做不到的。但是对应的是如果你不确定你为什么要强迫编译器做它不喜欢的事情,永远不要忽略警告
结论:一旦他忽略了最终导致错误的警告,程序员就应该受到责备;-)
从应该 return 值的函数末尾流出是未定义的行为。未定义的行为意味着编译器可以做任何事情并且仍然是兼容的。发出警告信息是合规的。不给出警告消息是合规的。擦除硬盘驱动器:这也是合规的。对我来说幸运的是,这还没有发生。我不幸调用了很多很多次未定义的行为。
这是未定义行为的一个原因是因为在某些奇怪的情况下,流分析无法确定函数 return 是否是一个值。另一个原因是您可能已经使用程序集以一种在您的计算机上工作得很好的方式设置了 return 值。第三个原因是编译器必须进行流分析才能做出此决定;除非启用优化,否则许多编译器不会这样做。
也就是说,在右大括号前缺少 return 通常会触发编译器检查函数 return 是否有值。编译器在发出警告时对你很好。
您收到一条警告消息并忽略了它 -- 永远不要那样做。将标志设置为合理的高级别进行编译,并解决每一个警告。代码应该始终编译干净。总是。