代码故意崩溃

时间:2012-11-21 21:22:55

标签: c++ coding-style crash assert

  

可能重复:
  What is the easiest way to make a C++ program crash?

我在代码库中经常看到一个构造,程序以某种方式进入无效状态,代码会故意做错,只是为了强制崩溃。它通常是这样的:

if(<something is wrong>)
{
    int *ptr = NULL;
    *ptr = 0;
}

这当然会导致空引用异常并以不可恢复的方式崩溃程序。我只是想知道这是否真的是最好的方法呢?首先,它读得不好。如果没有评论,您可能没有意识到此处发生的崩溃是有意的。其次,几乎没有办法从中恢复。它不会抛出异常,因此其他代码无法处理它。它只会使程序死亡,无法回溯。它也没有提供很多关于为什么它必须在这里崩溃的线索。它会在所有版本中崩溃,不像断言。 (我们确实有一个非常强大的断言系统,但并不总是在这种情况下使用。)

这是我们在整个地方使用的风格,我无法试图说服任何人。我只是好奇这个行业有多么普遍。

3 个答案:

答案 0 :(得分:4)

你不能以故意的方式“崩溃”程序,因为根据它的定义,崩溃就是当程序错误并且无法确定性行为时。

终止执行的标准方法是std::terminate;通常的方法是调用std::abort,它会针对进程引发一个不可阻塞的信号(自动导致std::terminate)并导致许多操作系统产生核心转储。

答案 1 :(得分:2)

你应该抛出一个异常,它基本上会以一种受控的方式故意导致崩溃。以下是this question的帮助示例。

throw string("something_went_wrong");

更好的是,错误被捕获或修复。断言也是一个不错的选择。

答案 2 :(得分:1)

我想这是在你没有调试的情况下触发核心转储的方法。核心转储然后为您提供足够的信息来分析问题。在“程序员错误”(或错误)的情况下,这比抛出异常更好,因为堆栈展开不允许您构建合理的核心转储。通过调用先前已注册(使用std :: set_terminate)生成核心转储或类似内容的函数的std :: terminate,可以以更优雅的方式实现类似的效果。有关详细说明,请参阅this article