#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv) {
int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0)
printf("Changed!");
else
printf("Not changed!");
}
我正在尝试解决缓冲区溢出问题。
当程序计数器到达if(modified != 0) 时,基指针为 0x00007fffffffdfe0。
在基指针正下方,我看到 4 个字节包含整数 0,这很有意义。
但是,缓冲区并不在修改后的 int 正下方。
它看起来像 4 个字节的 0,然后 0x00007fff 在堆栈中,然后是我输入的 64 个字节的 As 紧随其后。
为什么 char buffer[64] 在 int 修改后没有立即出现?为什么会有“差距”?
我用 gcc -g -fno-stack-protector test1.c -o test1 编译它
谢谢
你已经有了一个普遍的答案。特别是对于您的平台 (GCC/Linux/x86_64),相关的 ABI (System V x86-64) 指定大小为 16 字节或更大的数组始终至少对齐 16 字节。正如@AdrianMole 在他的回答中所说,这是为了提高性能,特别是允许在阵列上使用 SSE 指令。
请参阅此处链接的 System V x86-64 psABI 1.0 版的第 15 页。
如果您使数组大小小于 16 字节,则不会发生这种情况。然而,还有一个 GCC 错误,它意外地将此规则应用于所有大于 16 位(即 2 个字节)的数组。这已在 GCC 7.1 中修复。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句