gpt4 book ai didi

c - 如果我重复运行这个程序,为什么在 seg-fault 之前打印的最后一个数字会有所不同?

转载 作者:IT王子 更新时间:2023-10-29 00:34:25 24 4
gpt4 key购买 nike

问题是关于 linux 如何处理堆栈。为什么在运行此代码时出现段错误时不确定性?

#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>

void step(int n) {
printf("#%d\n", n);
step(n + 1);
}

int main() {
step(1);
return 0;
}

最佳答案

看起来不确定的结果是内核在启动新程序时使用的环境随机化策略的结果。让我们尝试下一个代码:

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

int main(int argc, char **argv) {
char c;
uintptr_t addr = (uintptr_t)&c;
unsigned pagesize = (unsigned)sysconf(_SC_PAGE_SIZE);
printf("in-page offset: %u\n", (unsigned)(addr % pagesize));
return 0;
}

在我的 64 位 Linux 上它给出了下一个输出:

$ ./a.out
in-page offset: 3247
$ ./a.out
in-page offset: 2063
$ ./a.out
in-page offset: 863
$ ./a.out
in-page offset: 1871

每次 c 在其堆栈页面中获得新的偏移量,并且知道内核总是为堆栈分配离散数量的页面 - 很容易看出每次程序分配的堆栈数量略有不同.因此,问题中描述的程序在每次调用时的帧堆栈数量都不是恒定的。

坦率地说,我不确定是内核调整了堆栈指针的初始值,还是动态链接器的一些技巧。无论如何 - 用户代码每次都会在随机环境中运行。

关于c - 如果我重复运行这个程序,为什么在 seg-fault 之前打印的最后一个数字会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45418565/

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