Ich habe über Buffer Overflow gelesen. Ich habe etwas Seltsames über die Speicherzuweisung von lokalen Variablen im Stack gefunden.
int f1 ()
{
char string1[12];
char string2[4];
}
Hier erfolgt die Zuweisung im Stack.
Jetzt, in GCC werden 4 Bytes für string2 zugewiesen, aber wenn ich eine andere Größe als eine Zweierpotenz (bis zu 16) deklariere, werden vom Compiler 16 Bytes zugewiesen. Das heißt, wenn ich string2 in 3, 5, 6, 7,..., 15 Bytes allokiere, dann werden durch den Compiler 16 Bytes zugewiesen, aber wenn ich eine Zweierpotenz wie 1, 2, 4, 8,... zuweise, dann wird genau dieselbe Größe zugewiesen. Wenn ich mehr als 16 Bytes (nicht als Zweierpotenz) zuweise, dann werden 32 Bytes zugewiesen (ich vermute bis zu 32 Bytes).
Währenddessen, in Visual Studio, werden 9 Bytes allokiert, wenn ich 1 Byte zuweise, 12 Bytes werden allokiert, wenn ich 2-4 Bytes zuweise, und 16 Bytes werden allokiert, wenn ich 5-8 Bytes zuweise, vom Compiler.
Kennt jemand den Grund für diese Art der Zuweisung???
Zumindest in Visual Studio erhalte ich bei einem Buffer Overflow einen Debug-Fehler, aber in GCC passiert nichts. GCC gibt nur eine Segmentation Fault aus, wenn ein zu großer Overflow auftritt.