我正在尝试编写一个与另一个容易崩溃的进程(不在我的控制范围内)交互的Python程序。不幸的是,我正在交互的程序甚至不能可靠地崩溃!因此,我想制作一个快速的C++程序来有意地崩溃,但实际上我并不知道最好和最短的方法是什么,是否有人知道在这之间应该放些什么:
int main() {
crashyCodeGoesHere();
}
为了让我的C++程序可靠地崩溃
int main(int argc, char *argv[])
{
char *buf=NULL;buf[0]=0;
return 0;
}
如果您的系统不支持只读内存块,写入只读内存将导致分段错误。
int main() {
(int&)main = 0;
}
我已经在Windows 7上使用MingGW 5.3.0和Linux Mint上的GCC进行了测试。我认为其他编译器和系统也会产生类似的效果。
或者另一种方式,因为我们正在跟随潮流。
一个可爱的无限递归片段。保证让你的堆栈崩溃。
int main(int argv, char* argc)
{
return main(argv, argc)
}
打印输出:
分段错误(核心已转储)
main
是未定义行为。此外,尾递归并不一定会导致堆栈溢出。如果您想要“保证”,则必须在递归调用后执行某些操作,否则编译器可能将递归优化成无限循环。 - fredoverflow在GCC或clang中使用__builtin_trap(),或在MSVC中使用__debugbreak()。不处理这些断点/陷阱将导致未处理的断点异常/崩溃。 其他建议使用abort()或exit():这些可能会被其他线程处理,使得更难看到传播崩溃的线程的堆栈。
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编译后,程序输出:
调用了纯虚函数
未捕获异常的终止调用
中止 (核心已转储)
#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;
}
一个简单的缓冲区溢出代码,将导致程序崩溃
int main()
{
int n[0];
n[2] = 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;
}
}
希望这个崩溃。干杯。
int main()
{
int *p=3;
int s;
while(1) {
s=*p;
p++;
}
}
long long
或size_t
,并从相应的最大值或接近最大值的位置开始,以更快地崩溃。尽管即使在这种情况下也不能保证一定会崩溃。 - Patrick Roberts你可以在你的C++代码中使用汇编语言 code
但是 INT 3
只适用于x86系统,其他系统可能有其他的陷阱/断点指令。
int main()
{
__asm int 3;
return 0;
}
INT 3
会引起中断并调用操作系统设置的中断向量。
asm { cli; };
。 - Nate Koppenhaver*((char*)-1) = 'x';
代码来引发崩溃,以便进行调试。更多细节请参阅我的答案。 - Shafik Yaghmourint *p = (int *)-1; *p = 1;
。这是因为在任何系统上都不存在地址2 ^ 64 - 1,至少现在是这样(假设指针长度为8字节)。 - user16083509