加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

是否有可能在Linux上预测C中的堆栈溢出?

发布时间:2020-12-14 01:24:35 所属栏目:Linux 来源:网络整理
导读:某些条件可能导致x86 Linux系统上的堆栈溢出: 在堆栈上构造my_big_object [HUGE_NUMBER].走过它最终导致SIGSEGV. alloca()例程(如malloc(),但使用堆栈,自动释放自己,如果它太大,也会使用SIGSEGV).更新:alloca()未按我原先的说法正式弃用;它只是气馁. 有没
某些条件可能导致x86 Linux系统上的堆栈溢出:

>在堆栈上构造my_big_object [HUGE_NUMBER].走过它最终导致SIGSEGV.
> alloca()例程(如malloc(),但使用堆栈,自动释放自己,如果它太大,也会使用SIGSEGV).更新:alloca()未按我原先的说法正式弃用;它只是气馁.

有没有办法以编程方式检测本地堆栈是否足够大于给定对象?我知道堆栈大小可以通过ulimit调整,所以我希望有一种方法(但可能是非便携式).理想情况下,我希望能够做到这样的事情:

int min_stack_space_available = /* ??? */;
if (object_size < min_stack_space_available)
{
    char *foo = alloca(object_size);
    do_stuff(foo);
}
else
{
    char *foo = malloc(object_size);
    do_stuff(foo);
    free(foo);
}

解决方法

您可以通过查找进程堆栈空间的大小然后减去使用的数量来确定进程可用的堆栈空间.

ulimit -s

显示了linux系统上的堆栈大小.对于编程方法,请查看getrlimit().然后,要确定当前堆栈深度,请从一个到底部减去指向堆栈顶部的指针.例如(代码未经测试):

unsigned char *bottom_of_stack_ptr;

void call_function(int argc,char *argv) {
    unsigned char top_of_stack;
    unsigned int depth = (&top_of_stack > bottom_of_stack_ptr) ? 
        &top_of_stack-bottom_of_stack_ptr : 
        bottom_of_stack_ptr-&top_of_stack;

    if( depth+100 < PROGRAMMATICALLY_DETERMINED_STACK_SIZE ) {
        ...
    }
}

int main(int argc,char *argv) {
    unsigned char bottom_of_stack;
    bottom_of_stack_ptr = &bottom_of_stack;
    my_function();
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读