阅读有关缓冲区溢出的信息,我遇到了下面给出的示例代码:-
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
我猜它来自着名的为了乐趣和利润而粉碎堆栈的文章。(参考:http: //insecure.org/stf/smashstack.html)
文章说,要为 buffer1 和 buffer2 分配空间,需要 20 个字节(buffer1 为 8 个字节,buffer2 为 12 个字节),因为内存地址只能以字大小的倍数访问(在这种情况下,1 个字 = 4 个字节)。
但我记得内存是字节可寻址的,即我一次可以从内存中访问 1 个字节。我将此与处理器的位数联系起来。例如,32 位处理器可以访问 2^32 个内存位置,并且由于 1 个内存位置保存 1 个字节(8 位),因此 32 位处理器的总可寻址内存等于 (2^32)/(1024*1024*1024) = 4096 MB = 4GB。
既然在上面的例子中,buffer1 和 buffer2 都是 char 类型,假设需要 1 个字节,那么为什么我们不能分别为 buffer1 和 buffer2 分配 5 个字节和 10 个字节呢?
为什么内存访问限制为字长的倍数?