在发布中抛出断言但不是调试 - 一定是编译器错误?

Posted

技术标签:

【中文标题】在发布中抛出断言但不是调试 - 一定是编译器错误?【英文标题】:Assertion thrown in Release but not debug - necessarily a compiler bug? 【发布时间】:2016-11-25 09:02:59 【问题描述】:

这不是关于我的代码的具体问题,而是更高级的问题。

我有在发布和调试模式下编译的 C++ 代码(都打开了断言)

库中没有检查调试等的代码(通过 prerocsssor 定义或宏)。

在调试模式下运行不会导致任何断言。在 Release 或 RelWithDebInfo 中运行每次都会抛出一个断言。

这是否一定意味着 MSVC 编译器/优化器中存在错误?此外,更一般地说:Release 和 Debug 之间的程序行为差异是否总是构成编译器中的错误。

注意:clang 可以很好地运行此代码,而不会在 Release 和 Debug 中抛出断言。

【问题讨论】:

没有例子很难说,这可能是与未初始化的变量有关的问题。或完全不同的东西。您是否使用 Visual Studio 中设置的最高警告级别编译代码? 如果您在调试器中运行 RelWithDebInfo(可能因为您有调试信息),断言在哪里发生?使用某些编译器或构建配置使某些工作正常工作,但在其他情况下却不行,这通常更多地表明您做了导致未定义行为的事情,而不是编译器或库中的错误。 【参考方案1】:

这种事情几乎从来都不是编译器错误。如果您的代码因为杂散指针而覆盖数据,当您使用不同的选项进行编译时,它可能会覆盖不同的数据,从而产生截然不同的结果。

【讨论】:

以上是关于在发布中抛出断言但不是调试 - 一定是编译器错误?的主要内容,如果未能解决你的问题,请参考以下文章

测试 Mocha 中抛出的错误 [重复]

http.put 在使用 Chrome 但不是 IE 的 Angular 2 / Web API 中抛出错误

Solidity 编译器在代码中抛出 DeclarationError

调用可以抛出,但错误不能从全局变量初始化器中抛出

为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)

加载视图时,ASP.NET MVC 在控制台(浏览器开发工具)中抛出错误“jQuery tDatePicker 不是函数”