当在函数中用作局部变量时,为什么数组不沿堆栈方向增长?

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

charmprefect 回答:当在函数中用作局部变量时,为什么数组不沿堆栈方向增长?

如果没有完全交换所有阵列的寻址模型,您将无法使用逐渐变小的堆栈来执行此操作。这是一个可行的实现选择,但与现有的ABI不兼容。

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

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

strcpy返回时,其返回地址可能已经存储了传递其地址的数组末尾而被破坏。

,

“堆栈的方向”是实现的功能,而不是语言的功能-语言规范甚至不假设存在堆栈。

数组索引通过向基地址添加非负偏移并取消对结果的引用来工作-数组必须始终朝增加的地址“向上”增长,而与堆栈的增长方向无关。

真正使数组操作安全(r)的唯一事情是C语言规范要求对所有数组访问进行边界检查,并在超出范围的访问上引发异常。当然,C语言规范还必须添加结构化异常处理(当前的信号处理方法将严重不足)。

这种加法是... 不太可能

本文链接:https://www.f2er.com/3155960.html

大家都在问