Basis van programmeren in C

void save(const char *input) {
    char name[8];
    strcpy(name, input);
    printf("%s\n", name);
}

De string "ABCDEFGH" van 8 tekens werd aan de bovenstaande functie save doorgegeven. Wat gebeurt er?

  1. AEr worden 9 bytes geschreven, inclusief het afsluitende '\0', waardoor 1 byte buiten name wordt beschadigd (ongedefinieerd gedrag)
  2. BHet zijn precies 8 tekens, dus de string past in name en ABCDEFGH wordt correct afgedrukt
  3. Cstrcpy kort de string in tot 7 tekens zodat die in name past, en zet het afsluitende '\0' in het laatste element
Antwoord en toelichting tonen

Antwoord: A. Er worden 9 bytes geschreven, inclusief het afsluitende '\0', waardoor 1 byte buiten name wordt beschadigd (ongedefinieerd gedrag)

De string "ABCDEFGH" is inclusief het afsluitende '\0' 9 bytes. strcpy kent de grootte van de bestemming niet en kopieert alles tot en met '\0', dus schrijft het 1 byte voorbij het einde van de 8 bytes van name (een bufferoverloop). Het teveel kan andere variabelen op de stack of het retouradres beschadigen, en wordt ook misbruikt door aanvallen die lange invoer aanleveren om willekeurige code uit te voeren. Dit wordt voorkomen met een functie waaraan de te schrijven grootte wordt meegegeven, zoals snprintf(name, sizeof name, "%s", input).

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Welke beschrijving van wat er in C gebeurt als een NULL-pointer wordt gederefereerd (*p wordt gelezen terwijl p NULL is), is juist?
  2. Neem een gebruikelijke omgeving aan waarin char 1 byte en int 4 bytes is, en int op adressen wordt geplaatst die een veelvoud van 4 zijn. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
  3. uint32_t en uint8_t zijn integertypen zonder teken van 32 en 8 bits, en de omgeving is little-endian. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
  4. Wat is de uitvoer als de bovenstaande code, die 9 opslaat in een bitveld van 3 bits, wordt uitgevoerd?
  5. Wat is de uitvoer als de bovenstaande code, die de met #define gedefinieerde macro SQUARE gebruikt, wordt uitgevoerd?