Grundlagen der Programmiersprache C
void save(const char *input) {
char name[8];
strcpy(name, input);
printf("%s\n", name);
}Der obigen Funktion save wird die Zeichenkette "ABCDEFGH" mit 8 Zeichen übergeben. Was passiert?
- AEinschließlich des abschließenden '\0' werden 9 Byte geschrieben, und 1 Byte außerhalb von name wird überschrieben (undefiniertes Verhalten)
- BMit genau 8 Zeichen passt sie in name, und ABCDEFGH wird korrekt ausgegeben
- Cstrcpy kürzt sie passend zur Größe von name auf 7 Zeichen und schreibt das abschließende '\0' in das letzte Element
Antwort und Erläuterung anzeigen
Antwort: A. Einschließlich des abschließenden '\0' werden 9 Byte geschrieben, und 1 Byte außerhalb von name wird überschrieben (undefiniertes Verhalten)
Die Zeichenkette "ABCDEFGH" umfasst einschließlich des abschließenden '\0' 9 Byte. strcpy kennt die Größe des Ziels nicht und kopiert alles bis einschließlich '\0'; daher schreibt es 1 Byte über das 8 Byte große name hinaus (Pufferüberlauf). Der überschüssige Teil kann eine andere Variable auf dem Stack oder die Rücksprungadresse überschreiben und wird auch für Angriffe genutzt, bei denen eine lange Eingabe von außen die Ausführung beliebigen Codes bewirkt. Verhindert wird das mit Funktionen, denen man die zu schreibende Größe angeben kann, etwa snprintf(name, sizeof name, "%s", input).
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C