检查堆栈分配是否失败?

时间:2011-05-28 20:50:41

标签: c stack c99 allocation

有没有办法纠正失败的静态分配或程序运行时出现分段或总线故障失败?

Post的灵感来自C99如何允许像char text[n];

这样疯狂的东西

编辑:谢谢。我现在明白粗体部分不是静态alloc。那么只是为了检查,如果char text[1234];之类的东西失败了可能的恢复策略是否相同?

4 个答案:

答案 0 :(得分:3)

char text[n]在堆栈上分配一个可变大小的数组。它只涉及将堆栈指针递增n

如果发生堆栈溢出,用户空间进程可以做的事情不多 - 操作系统要么向进程发送信号并终止它,要么调整堆栈大小。

答案 1 :(得分:1)

你可能会捕捉到信号,但你无能为力。当然,在使用它之前检查n以确保它具有合理的价值可以立即解决这个问题。

答案 2 :(得分:1)

永远不要检查您不知道如何处理的错误情况。

说真的,你打算做什么?只允许从信号处理程序调用的函数的一小部分(参见man 7 signal),而printf和longjmp(longjmp是我能想到从这样的问题中恢复的唯一方法)不是一个他们如果你要重新执行这个过程,你可能会有一个保姆来完成这项工作并避免混乱。

请注意,根据man alloca,您实际上并没有被告知“分配”失败,当您尝试访问不良内存时,您只需获得一个SIGSEGV,当然这可能不会发生在文本中[ ]数组,或者甚至根本不在分配text []的函数中。

虽然以上两段基于Linux,但总体理论适用于所有平台。

使用malloc并进行清洁处理。要理智。

[编辑]

实际上有一种方法可以尝试这样做,那就是通过计算堆栈的开始(主要的记录堆栈)和堆栈限制(希望操作系统不会耗尽页面)。然后,在进行大堆栈分配之前,您可以计算出距离最终的距离。在分配之前给自己一个慷慨的摆动空间并失败。

答案 3 :(得分:0)

这是堆栈分配而不是静态。故障模式是堆栈溢出。堆栈溢出最合理的策略是将其视为终端。

设计你的代码,使它不会溢出堆栈,而不是试图让它适应堆栈溢出。