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

标签 c arrays stack

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

最佳答案

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

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

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

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

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

相关文章:

c - 释放了 BST 但仍然出现内存泄漏 C

programming-languages - 如果不允许 LP 递归,那么可能会出现堆栈溢出的情况?

c++ - 在所有版本的 C 和 C++ 中,有符号、无符号、长整型和短整型都是有效类型吗?

Netbeans 中的 C pthread_barriers (cygwin)

c - 未知传感器值校准

java - Java中如何处理大数组

javascript - 如何唯一合并两个 JSON 文件?

c++ - 如何将数组传递给函数?

java - 使用堆栈在 java 中获取 infix/postfix 的错误输出

algorithm - 亚马逊采访 : Min stack