VS2013的奇怪行为
Strange behavior of VS2013
最近我的程序在发布模式下崩溃,而在调试模式下运行良好。
通过深入检查我的代码,我发现我忘记了在函数末尾使用return true
,这导致了崩溃。函数失败时应返回false,否则返回true。
我不确定这是否是编译器的缺陷(与2013相比(,因为它(可能(在函数末尾为我添加了return true
语句,但在发布时并没有。因此,程序员将花费大量时间调试故障,尽管这应该归咎于程序员。
:(
从本应返回值的函数末尾流出是未定义的行为。未定义的行为意味着编译器可以执行任何操作,并且仍然是兼容的。发出警告消息是符合要求的。不发出警告信息是符合要求的。擦除硬盘:这也是合规的。幸运的是,这还没有发生。不幸的是,我多次援引未定义的行为。
这是未定义行为的一个原因是,在某些奇怪的情况下,流分析无法决定函数是否返回值。另一个原因是,您可能使用程序集设置返回值的方式在您的计算机上运行良好。第三个原因是编译器必须进行流分析才能做出这个决定;除非启用优化,否则许多编译器不会执行此操作。
也就是说,在右大括号之前缺少返回通常会触发编译器检查函数是否返回值。编译器发出警告时对你很好。
你收到了一条警告信息却忽略了它——永远不要这样做。编译时将标志设置为合理的高级别,并处理每个警告。代码应始终编译干净。总是
C和C++是可容忍的语言。当程序员编写编译器可以编译的代码时,即使它看起来很奇怪,编译器也会发出警告。警告意味着您正在编写可能包含错误的内容,但您做出了决定。
它允许自愿进行某些优化。例如,您可以始终将二维数组用作一维数组,这在某些其他语言中是无法做到的。但对应的是如果您不确定为什么要强迫编译器执行它不喜欢的操作,则永远不要忽略警告
结论:一旦他忽略了最后导致错误的警告,程序员就应该受到谴责;-(
- xtr1common中的错误,尝试使用VS2019构建原始VS2013 C++项目时type_traits
- C++构建增强 1.57.0 VS2013 x64 本机工具命令提示符
- Build Boost Regex for Windows VS2013
- 在VS2013中使用devenv (C++)传递命令行参数argv
- 将VS2013 更新为VS2019会导致左值错误,想知道原因
- 从 VS2013 到 VS2017 std::async 不会启动新线程
- VS2013在构建容器应用程序时无法识别OCX控制的附加方法
- 我可以将Visual Studio 2015头文件编译成dll并在VS2013中使用它吗?
- 为什么添加constexpr使VS2013拒绝这一点
- <ratio> <memory> 从 VS2013 升级到 VS2017 时和之后出错
- 当构造函数在VS2013中调用自身时会发生什么?
- 在VS2013与VS2017的printf函数中使用宏
- WINAPI C/C++ -> 为什么二进制大小急剧增加?(从VS2013切换到VS 2015)
- 我可以将使用v120_xp工具集构建的静态库链接到使用VS2013中的v120工具集创建的EXE/DLL中吗
- 在VS2013中使用Qt
- <filesystem> VS2013 与 VS2012 中的不同行为
- 正在尝试引用已删除的函数(VS2013)
- 未解决的外部符号错误(VS2013 Express)
- 在C 中使用Nuget的libcurl(VS2013)
- VS2013中的高分辨率时钟