バッファオーバーフローについて読んでいました。スタック上のローカル変数のメモリ割り当てについて奇妙なことが 1 つ見つかりました
int f1 ()
{
char string1[12];
char string2[4];
}
ここでは、スタック上で割り当てが行われています。
現在、GCCでは string2 に 4 バイトが割り当てられていますが、2 の累乗以外 (最大 16) を宣言すると、コンパイラによって 16 バイトが割り当てられます。つまり、string2 を 3,5,6,7,....,15 バイトに割り当てると、コンパイラによって 16 バイトが割り当てられますが、1,2,4,8 のように 2 の累乗で割り当てると...次に、まったく同じサイズが割り当てられます。16 バイト以上 (2 の累乗ではない) を割り当てると、32 バイトが割り当てられます (最大 32 バイトだと思います)。
一方、Visual Studio では、1 バイトを割り当てると 9 バイトが割り当てられ、2 ~ 4 バイトの場合は 12 バイトが割り当てられ、5 ~ 8 バイトの場合は 16 バイトがコンパイラによって割り当てられます。
なぜこの種の割り当てを知っている人はいますか?
少なくとも Visual Studio では、バッファ オーバーフローが発生するとデバッグ エラーが発生しますが、gcc では何も起こりません。GCC は、大きすぎるオーバーフローが発生した場合にのみ、セグメンテーション違反を提供します。