gpt4 book ai didi

c - 使用 setrlimit() 设置堆栈大小并引发堆栈溢出/段错误

转载 作者:IT王子 更新时间:2023-10-28 23:54:37 24 4
gpt4 key购买 nike

在下面给出的示例中,我尝试将堆栈大小设置为 1kb。

为什么现在可以在 foo() 中分配大小为 8kb 的整数数组?

#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 字符串 + arg 字符串加上在 setup_arg_pages 上分配的一些额外页面所需的大小(2.6.33 中的 20 页 12 、 128 2.6.34 3 上的知识库)。

总结:

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);
}

结果是:

$./rl
foo: 42
$./rl -l
limiting stack size
Segmentation fault
$

关于c - 使用 setrlimit() 设置堆栈大小并引发堆栈溢出/段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com