Linux   发布时间:2022-05-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否有可能在Linux上预测C中的堆栈溢出?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
某些条件可能导致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;
}

大佬总结

以上是大佬教程为你收集整理的是否有可能在Linux上预测C中的堆栈溢出?全部内容,希望文章能够帮你解决是否有可能在Linux上预测C中的堆栈溢出?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: