在堆栈中创建大内存

CHI*_*HID 1 c compiler-construction gcc

我试图在stack(int a[1000000000])中创建大量内存.它编译成功.但是在运行时它是Segfaulted.它非常适合程序段错误.我的问题是,为什么编译器不能事先检测到这个并抛出编译错误?我们为什么要等到程序运行?

此外,当我分配时int a[100],asm代码如下所示.

00000000004004b4 <main>:
  4004b4:       55                      push   %rbp
  4004b5:       48 89 e5                mov    %rsp,%rbp
  4004b8:       48 81 ec 18 01 00 00    sub    $0x118,%rsp (memory created for 100 bytes)
Run Code Online (Sandbox Code Playgroud)

如果我为大内存创建int a[1000000000],asm代码看起来不同.

00000000004004b4 <main>:
  4004b4:       55                      push   %rbp
  4004b5:       48 89 e5                mov    %rsp,%rbp
  4004b8:       49 bb 78 00 17 be 33    movabs $0xfffe9433be170078,%r11
  4004bf:       94 fe ff 
  4004c2:       4c 01 dc                add    %r11,%rsp
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?即为什么编译器没有处理这个?

谢谢

CHID

Eri*_*ert 9

为什么编译器不能事先检测到这个并产生编译错误或警告?

这个问题假设一个不正确的前提.技术上很少阻止编译器编写者这样做.你可能希望它是一个警告,而不是一个错误,但编译器编写者可以轻松地为一个函数使用的本地存储总量的不合理的巨大大小设置一个阈值,如果该大小是超标.

由于你的问题是基于一个错误的前提,它没有答案.问一个更好的问题.

好的,如果有可能那么为什么编译器编写者没有实现这个警告呢?

无论您的编译器是开源还是闭源,无论是开发人员还是志愿者,所有对软件的更改都需要时间精力.两者都供不应求.

编译器警告是功能,因此必须进行设计,指定,实施,测试,调试,发运和维护.所有这些事情在时间和精力上都是昂贵的,并且所有这些都消除其他功能的时间和精力.

如果您喜欢的编译器中不存在此功能,那是因为该编译器的开发人员有大约一百万个更好的事情要做.在这一百万件更好的事情中,今年他们可能会设法实施几十件.如果你想提倡你的特定功能建议将列表从当前的低位置上移,请开始调用编译器开发人员并向他们表明这是他们可能花费精力的最佳方式 - 创建一个警告一个明显是假的情况,并立即崩溃.你可能不会走得太远.

在考虑要实现哪些编译器警告时,像我这样的编译器编写者会仔细考虑要添加到编译器的警告.良好警告可识别以下情况:

  • 合法 ; 非法代码当然是一个错误.
  • 可检测到低误报率; 指示开发人员将正确的工作代码更改为损坏代码的警告是一个糟糕的警告
  • 误导 ; 程序员应该相信代码做了一件事实际上它做了另一件事
  • 似是而非 ; 程序员应该合理地在业务线程序中键入警告代码
  • 通过琐碎的测试无法检测到 ; 程序应该正常运行并做一些巧妙的错误.如果程序立即崩溃,那么警告只是在测试发现之前几秒发现错误,这不是很好的价值.

您的提案符合前两个标准.它可以说满足第三个.它毫不含糊地无法满足第四和第五个标准.因此,如果我是编译器开发人员,我会拒绝你的建议.我会花费宝贵的时间和精力来添加更有利于成本的功能.