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

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

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

【问题讨论】:

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

标签: c++ c linux segmentation-fault


【解决方案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,因为您使用的是未初始化指针的不确定值,但我不知道任何实际会崩溃的实现。您想如何导致崩溃的想法是什么?
    • 那么你可能应该在某个地方取消引用指针。
    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多