繁体   English   中英

是否保证格式错误的C或C ++程序在Visual Studio中的DEBUG配置下崩溃

[英]Is an ill formed C or C++ program guaranteed to crash under DEBUG configuration in Visual Studio

在我过去在Visual Studio中使用RELEASE配置在C和某些C ++上进行编码的许多时候,我遇到了一些滑溜的bug,这些漏掉了我的视线,并且该代码尽管调用了未定义的行为,但似乎可以正常工作。 但是,经过几次运行后,很明显该程序由于不同的异常结果和/或崩溃而出现了错误。

因此,我决定通过在代码仍处于开发阶段时选择DEBUG配置来避免麻烦,并安全起见。

但是,这是否可以保证在代码调用任何类型的未定义行为的情况下程序会停止运行?

不。处理定义不明确的行为是程序员的责任。

仅C语言中UB的已记录病例摘要列表长达15页。 未记录的案例甚至更多-也就是说,所做的事情超出了标准中提到的范围。 更不用说C ++了,在C ++中,定义不明确的行为列表可能会作为单独的详细出版物进行分发。

然后,每一个UB案例都大相径庭,其中许多仅在运行时出现,结果可能是任何事情。 编译器只能提供很多帮助,并不是指出潜在的运行时错误。 然后,VS C编译器最初几乎没有遵循该标准。

实际上,对于检测UB而言,调试版本可能比发行版本更差。 诸如VS之类的工具倾向于将调试版本中的所有内存(包括本地内存)清零,从而使错误不被察觉。 由于在调试模式下没有/没有优化,某些错误将永远不会显现出来。

要清除未定义的行为,可以使用外部静态/动态分析工具和编码标准,例如MISRA或CERT。 但是最终,它总是归结为语言知识。 为了使早期发现错误,一些坚强的C或C ++资深人士能发表意见的代码审查非常有价值。

不能。无法保证行为未定义的代码将崩溃。

当然,选择DEBUG配置将增加在运行时检测到一些未定义行为的机会(尽管这可能导致其他行为未被检测到)。 特别是,如果你不使用原始数组和指针,而是使用STL,那么DEBUG版本拥有有效使用更多检查。 (我假设您正在使用Microsoft库,因为gcc / clang不太倾向于使用术语DEBUG和RELEASE。)

如果使用STL,使用UB编译代码也很困难(尽管不是不可能),或者内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM