【问题标题】:What signal is generated from *(int *)0='X';*(int *)0='X' 产生什么信号;
【发布时间】:2015-12-11 13:40:56
【问题描述】:

以下在 C 中究竟做了什么(或试图做什么)?

*(int *)0='X';

会产生什么信号?会是 SIGSEGV 吗?

【问题讨论】:

  • 是的,在大多数 POSIX 系统上,您将获得一个 SIGSEGV。附言-- 有什么特别的原因你不能编译它并自己测试吗?
  • 要生成信号,您必须显式生成它们。未定义的行为对此并不可靠。
  • @SamVarshavchik 测试不是获得有关 C 语言规定的明确答案的合适方法。未定义的行为有允许任何事情发生的烦人习惯。
  • @chux - 我的硬件坏了 - 我设计的 :)

标签: c


【解决方案1】:

*(int *)0='X'; 的行为是未定义

编译器可以随意做任何事情。 (i) 提出一个 SIGSEGV,(ii) 根本不编译该行是两种可能性。

要显式生成故障,请酌情使用raise(在<signal.h> 中定义)。

【讨论】:

    【解决方案2】:

    把它放到一个完整的程序中,segv.c:

    int
    main(
        void)
    {
        *(int *) 0 = 'X';
        return 0;
    }
    

    并编译:

    clang -Oz -Wno-error -s -o segv segv.c
    

    现在,当我在 64 位 GNU/Linux 系统上运行它时,我确实遇到了分段错误:

    fish: "./segv" terminated by signal SIGSEGV (Address boundary error)
    

    但是,如果您想生成分段错误,正如 cmets 中的某些人所指出的,您应该使用 raise(3) from signal.h

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多