gpt4 book ai didi

c - 为什么数组在函数中用作局部变量时不会在堆栈方向上增长?

转载 作者:行者123 更新时间:2023-12-04 14:53:38 25 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我想知道如果数组以某种方式填充了值,它会在堆栈的方向上增长(因此如果数组是唯一一个局部变量,使得数组的第一个元素数组在堆栈帧指针/基指针之后的一个字节被寻址,第二个元素在堆栈帧指针/基指针之后的两个字节被寻址,...),它不会使 C 中的堆栈溢出更安全,因为返回地址不能被覆盖容易(数组必须填满几乎整个 RAM,因此程序会崩溃而不是执行一些恶意代码)?

最佳答案

如果不完全交换所有阵列的寻址模型,您就无法使用增长的堆栈来做到这一点。这是一个可行的实现选择,但与现有 ABI 不兼容。

您已经注意到,在某些方面,拥有向上增长的堆栈(其中向上是正数组索引的方向)在某些方面比拥有向下增长的堆栈更安全。然而,这并不是那么安全。考虑将具有自动存储功能的数组的地址传递给另一个函数时会发生什么。被调用者在堆栈中的位置将高于数组,因此数组的任何溢出都将溢出到被调用者的堆栈帧中,可能包括其返回地址。例如:

void foo()
{
char s[4];
strcpy(s, "hello world");
}

strcpy返回时,它的返回地址可能已被存储超过其地址传递给它的数组的末尾。

关于c - 为什么数组在函数中用作局部变量时不会在堆栈方向上增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58720630/

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