ulimit设置正确的分段错误

LPs*_*LPs 2 c stack segmentation-fault

我试图在这个问题上帮助OP .

我发现下面的代码会导致分段错误,即使堆栈设置为2000 KB也是如此.

int main ()
{
   int a[510000];
   a[509999] = 1;
   printf("%d", a[509999]);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,数组是510000 x 4bytes = 2040000bytes.

使用ulimit命令将堆栈设置为2000 KB(2048000字节):

  • ulimit -s 2000
  • ulimit -Ss 2000

根据这些数字,应用程序有空间存储数组,但随机返回分段错误.

有任何想法吗?

Art*_*Art 5

有几个原因导致你无法做到这一点.有些东西已经在使用堆栈的一部分了.

main不是你堆栈上的第一件事.有一些函数由真正的入口点,动态链接器等调用,它们在main之前,它们都可能使用了一些堆栈.

另外,可能存在通常放在堆栈顶部以设置执行的东西.我知道的许多系统都将argv和所有环境变量中的所有字符串放在堆栈顶部(这就是为什么main不是入口点,通常在main之前运行的代码设置环境变量而argv为main).

最重要的是,如果您的系统这样做,可以故意浪费掉一部分堆栈以增加ASLR的随机性.

在调试器中运行程序,在main处添加断点,查找堆栈寄存器的值并检查其上方的内存(请记住,除非您处于一个奇怪的架构上,否则堆栈会逐渐减少).我打赌你会在那里找到很多指针和字符串.我刚刚在linux系统上做了这个,因为我怀疑我的所有环境变量都存在.

Unix上的资源限制(ulimit)的目的从来没有真正地将事情微观管理到一个字节/微秒,它们只是为了阻止你的程序完全疯狂并用它取下整个系统.看到它们不是红灯,在正确的道路上停下标志,将它们视为跑道区域和赛道上的防撞栏.