私は次の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 がスタック ポインタを 10 ではなく 16 バイト (ワード アラインメント) 下げていることがわかります。そのため、16 バイトを超える値を入力すると、スタックが破損し、main が戻ったときに segfault になる可能性があります。
興味深いこの動作は発生しますが、多くの文字を入力すると発生します。17 文字で失敗しない理由はありますか?