Bases de la programmation en C
void save(const char *input) {
char name[8];
strcpy(name, input);
printf("%s\n", name);
}La chaîne de 8 caractères "ABCDEFGH" est passée à la fonction save ci-dessus. Que se passe-t-il ?
- A9 octets sont écrits, '\0' de fin compris, ce qui écrase 1 octet hors de name (comportement indéfini)
- BElle fait exactement 8 caractères : elle tient dans name et ABCDEFGH s'affiche correctement
- Cstrcpy tronque la chaîne à 7 caractères pour l'adapter à la taille de name et place le '\0' de fin dans le dernier élément
Afficher la réponse et l'explication
Réponse : A. 9 octets sont écrits, '\0' de fin compris, ce qui écrase 1 octet hors de name (comportement indéfini)
La chaîne "ABCDEFGH" fait 9 octets en comptant le '\0' de fin. strcpy ne connaît pas la taille de la destination et copie tout jusqu'au '\0' : elle écrit 1 octet au-delà de la fin de name, qui fait 8 octets (débordement de tampon). Ce dépassement peut écraser d'autres variables sur la pile ou l'adresse de retour, et il est aussi exploité par des attaques qui fournissent une longue entrée pour faire exécuter du code arbitraire. On l'évite en utilisant une fonction qui prend la taille à écrire, comme snprintf(name, sizeof name, "%s", input).
Continuer : 9 autres questions sur Bases de la programmation en C