什么是使C++程序崩溃的最简单方法?

347

我正在尝试编写一个与另一个容易崩溃的进程(不在我的控制范围内)交互的Python程序。不幸的是,我正在交互的程序甚至不能可靠地崩溃!因此,我想制作一个快速的C++程序来有意地崩溃,但实际上我并不知道最好和最短的方法是什么,是否有人知道在这之间应该放些什么:

int main() {
    crashyCodeGoesHere();
}

为了让我的C++程序可靠地崩溃


6
您可以使用内联汇编来尝试执行特权指令:asm { cli; }; - Nate Koppenhaver
@aitchnyu 我认为每个问题的答案可用性存在差异。(顺便说一下:我没有为任何一个问题投票) - Andrew Barber
有没有在已经传播异常的情况下再抛出异常的评论?请检查我下面的答案并发表评论。 - Abhinav
6
Redis使用*((char*)-1) = 'x';代码来引发崩溃,以便进行调试。更多细节请参阅我的答案 - Shafik Yaghmour
我通过搜索测试用例来寻找一个崩溃报告系统的问题。我需要在正常运行时强制触发崩溃以调用崩溃报告和堆栈转储发送。谢谢! - Cory Trese
这个程序在所有系统上都应该始终崩溃。int *p = (int *)-1; *p = 1;。这是因为在任何系统上都不存在地址2 ^ 64 - 1,至少现在是这样(假设指针长度为8字节)。 - user16083509
31个回答

2
int main(int argc, char *argv[])
{
    char *buf=NULL;buf[0]=0;
    return 0;
}

2

如果您的系统不支持只读内存块,写入只读内存将导致分段错误。

int main() {
    (int&)main = 0;
}

我已经在Windows 7上使用MingGW 5.3.0和Linux Mint上的GCC进行了测试。我认为其他编译器和系统也会产生类似的效果。


1

或者另一种方式,因为我们正在跟随潮流。

一个可爱的无限递归片段。保证让你的堆栈崩溃。

int main(int argv, char* argc)
{
   return main(argv, argc)
}

打印输出:

分段错误(核心已转储)


13
如果你不知道的话,直接调用main是未定义行为。此外,尾递归并不一定会导致堆栈溢出。如果您想要“保证”,则必须在递归调用后执行某些操作,否则编译器可能将递归优化成无限循环。 - fredoverflow

0

在GCC或clang中使用__builtin_trap(),或在MSVC中使用__debugbreak()。不处理这些断点/陷阱将导致未处理的断点异常/崩溃。 其他建议使用abort()或exit():这些可能会被其他线程处理,使得更难看到传播崩溃的线程的堆栈。


0
一种时髦的做法是使用纯虚函数调用:
class Base;

void func(Base*);

class Base
{
public:
   virtual void f() = 0;
   Base() 
   {
       func(this);
   }
};

class Derived : Base
{
   virtual void f()
   {
   }
};

void func(Base* p)
{
   p->f();
}


int main()
{
    Derived  d;
}

使用gcc编译后,程序输出:

调用了纯虚函数

未捕获异常的终止调用

中止 (核心已转储)


0
#include <thread>

void intentionalCrash()
{
    auto noop = [](){return;};
    // Thread t1 is in a joinable state.
    // When program returns t1 will be out of scope.
    // Destructing a joinable thread creates a crash.
    std::thread t1(noop);
}

int main()
{
    intentionalCrash();
    return 0;
}

0

一个简单的缓冲区溢出代码,将导致程序崩溃

int main()
{
    int n[0];
    n[2] = 0;
}

0
void main()
{

  int *aNumber = (int*) malloc(sizeof(int));
  int j = 10;
  for(int i = 2; i <= j; ++i)
  {
      aNumber = (int*) realloc(aNumber, sizeof(int) * i);
      j += 10;
  }

}

希望这个崩溃。干杯。


0
int main()
{
    int *p=3;
    int s;
    while(1) {
        s=*p;
        p++;
    }
}

2
希望能够得到一些澄清 :) - olyv
1
指针 p 将超出程序的地址空间,这将导致内存错误,因为一个进程无法访问另一个进程的内存。这将导致程序崩溃。指针 p 指向其地址空间中的一个随机位置,如果无限递增并取消引用,则最终会指向另一个程序(进程)的地址空间。因此,它会在一段时间后崩溃。 - sc_cs
或者,假设它可能会发生整数溢出并绕过,无限运行。我会尝试使用long longsize_t,并从相应的最大值或接近最大值的位置开始,以更快地崩溃。尽管即使在这种情况下也不能保证一定会崩溃。 - Patrick Roberts

0

你可以在你的C++代码中使用汇编语言 code 但是 INT 3 只适用于x86系统,其他系统可能有其他的陷阱/断点指令。

int main()
{
    __asm int 3;

    return 0;
}

INT 3会引起中断并调用操作系统设置的中断向量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接