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

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】:

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

【讨论】:

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