使用setrlimit()设置堆栈大小,并引发堆栈溢出 segfault

使用setrlimit()设置堆栈大小,并引发堆栈溢出 segfault,第1张

概述在下面给出的例子中,我尝试将stacksize设置为1kb. 为什么现在可以在foo()中的大小为8kb的堆栈上分配一个int数组? #include <stdio.h>#include <sys/resource.h>void foo(void);int main() { struct rlimit lim = {1024, 1024}; if (setrlimit(RLIMIT 在下面给出的例子中,我尝试将stacksize设置为1kb.

为什么现在可以在foo()中的大小为8kb的堆栈上分配一个int数组?

#include <stdio.h>#include <sys/resource.h>voID foo(voID);int main() { struct rlimit lim = {1024,1024}; if (setrlimit(RliMIT_STACK,&lim) == -1)  return 1; foo(); return 0;}voID foo() { unsigned ints[2048]; printf("foo: %u\n",ints[2047]=42);}
解决方法 该限制立即设置,但仅在尝试分配新堆栈或尝试扩展现有堆栈时进行检查.内核来源的RliMIT_STACK( or a LXR identifier search)的grep应该告诉你.

显然,堆栈的初始大小是文件名env strings arg字符串加上在setup_arg_pages上分配的额外页面(2.6.33 1,2中的20页,2.6.34 3中的128 Kb)所需要的.

综上所述:

initial stack size = MIN(size for filename + arg strings + env strings + extra pages,MAX(size for filename + arg strings + env strings,RliMIT_STACK))

哪里

size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages),RliMIT_STACK/4)

另外,Ingo Molnar的exec-shIEld补丁(Fedora,Ubuntu,…)的内核还有一个额外的EXEC_STACK_BIAS(“2MB以上的随机化效果”),请参见从acct_stack_growth()调用新函数over_stack_limit() [Ubuntu1],[Ubuntu2],[Ubuntu3]).

我已经编辑了原来的程序来显示:

#include <stdio.h>#include <sys/resource.h>voID foo(voID);int main(int argc,char *argv[]) {        struct rlimit lim = {1,1};        if (argc > 1 && argv[1][0] == '-' && argv[1][8]=='l') {                printf("limiting stack size\n");                if (setrlimit(RliMIT_STACK,&lim) == -1) {                        printf("rlimit Failed\n");                        return 1;                }        }        foo();        return 0;}voID foo() {        unsigned ints[32768];        printf("foo: %u\n",ints[2047]=42);}

其结果如下:

$./rlfoo: 42$./rl -llimiting stack sizeSegmentation fault$
总结

以上是内存溢出为你收集整理的使用setrlimit()设置堆栈大小,并引发堆栈溢出/ segfault全部内容,希望文章能够帮你解决使用setrlimit()设置堆栈大小,并引发堆栈溢出/ segfault所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1249773.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存