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?

  1. AEinschließlich des abschließenden '\0' werden 9 Byte geschrieben, und 1 Byte außerhalb von name wird überschrieben (undefiniertes Verhalten)
  2. BMit genau 8 Zeichen passt sie in name, und ABCDEFGH wird korrekt ausgegeben
  3. 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).

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Was trifft in C auf die Dereferenzierung eines NULL-Zeigers zu (wenn *p gelesen wird, während p NULL ist)?
  2. char habe 1 Byte und int 4 Byte, und int werde wie in üblichen Umgebungen an Adressen ausgerichtet, die ein Vielfaches von 4 sind. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  3. uint32_t sei ein vorzeichenloser 32-Bit- und uint8_t ein vorzeichenloser 8-Bit-Ganzzahltyp, und die Umgebung sei Little-Endian. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  4. Welche Ausgabe erzeugt der obige Code, der 9 in ein 3-Bit-Bitfeld schreibt, bei der Ausführung?
  5. Welche Ausgabe erzeugt der obige Code, der das mit #define definierte Makro SQUARE verwendet, bei der Ausführung?