段错误的最小 C/C++ 程序? [复制]

Posted

技术标签:

【中文标题】段错误的最小 C/C++ 程序? [复制]【英文标题】:Minimal C/C++ program that segfaults? [duplicate] 【发布时间】:2012-09-06 10:51:19 【问题描述】:

我正在尝试设置我的服务器处理核心转储的方式。为了测试它,我需要一个总是出现段错误的程序。

是否有一个总是出现段错误的简单示例程序?

【问题讨论】:

Coredump 或段错误?通常abort() 足以导致核心转储,而这实际上是真正的 程序的一部分。永远不会出现段错误。 这是 C 还是 C++?标签说 C,标题说两者。 @ShafikYaghmour :我的意思是最小的程序,用 C 或 C++ 编写的either,会出现段错误。如果需要,可以添加 C++ 标签。 【参考方案1】:

main() *(int *)0xdeadbeef = 37; 应该这样做。

【讨论】:

为什么是 37?应该是 42!【参考方案2】:

main;

是可移植的,5个字符的段错误。 这是一个变量声明 - 隐含 int 类型(从 B 语言复制的功能),0 是默认值。执行时,它会尝试执行一个数字(数字不可执行),并导致SIGSEGV

来源:https://codegolf.stackexchange.com/questions/4399/shortest-code-that-raises-a-sigsegv

【讨论】:

正确,但可悲的是没有任何形式的解释来解释它为什么这样做(我知道为什么,但不是每个人都这样做)【参考方案3】:

试试这个:

long* ptr = 0x0; //-- you can also use other random values and likely you will segfault
printf("%f", *ptr);

【讨论】:

【参考方案4】:

你可以试试:

main() 
char *p = NULL;
char c = *p;

【讨论】:

这可以被编译器的优化器消除。您希望指针指向一个 volatile 对象以使其正常工作。 @AlexeyFrunze : 只是不要打开优化 :)【参考方案5】:

这应该死:

int main() 
    char *die;
    printf("%d",(int *)die * 200);
    return 0;

编辑:

int main() 
    char *die;
    int killer = 200;
    while(1) 
       printf("%d",(int *)die * killer);
       killer = killer * killer;
    
    return 0;

【讨论】:

为什么要这样?它是 UB,所以它可能,但它也可以只打印任意数字。 啊,甚至不能用 gcc 编译。您必须将 char* 显式转换为整数才能编译(不确定编译器是否允许隐式转换,标准不允许,但我认为只需要诊断,而不是终止编译)。 现在它仍然是 UB,因为您使用的是未初始化指针的不确定值,但我不知道任何实际会崩溃的实现。您想如何导致崩溃的想法是什么? 那么你可能应该在某个地方取消引用指针。

以上是关于段错误的最小 C/C++ 程序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从共享内存段复制数据会导致客户端出现段错误(信号量和共享内存)

CUDA 矩阵加法段错误

准系统 SWIG python C 接口在 OSX+clang 上出现段错误,而不是在 Linux+gcc 中

C程序中常见的内存操作错误

atoi(str) 中的段错误

简单示例,VS如何调试C/C++程序