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?
- AEr worden 9 bytes geschreven, inclusief het afsluitende '\0', waardoor 1 byte buiten name wordt beschadigd (ongedefinieerd gedrag)
- BHet zijn precies 8 tekens, dus de string past in name en ABCDEFGH wordt correct afgedrukt
- 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).