我有以下 C 代码:
int main()
{
char s[10];
scanf("%s", s);
}
编辑:为上层 C 程序生成的程序集如下:
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp
lea -0x10(%rbp),%rax
mov %rax,%rsi
mov $0x4005e4,%edi
mov $0x0,%eax
callq 400420 <__isoc99_scanf@plt>
leaveq
retq
如果用户输入超过数组的大小,将导致覆盖其他堆栈值。查看生成的程序集,我发现 gcc 将堆栈指针降低了 16 个字节而不是 10(字对齐)。所以,如果我输入超过 16 个字节,堆栈应该会损坏,并且在 main 返回时它应该可能只是段错误。
有趣的这种行为确实会发生,但如果我输入很多字符就会发生这种情况。为什么它不会在 17 个字符时失败?