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 ?

  1. A9 octets sont écrits, '\0' de fin compris, ce qui écrase 1 octet hors de name (comportement indéfini)
  2. BElle fait exactement 8 caractères : elle tient dans name et ABCDEFGH s'affiche correctement
  3. 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).

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. En C, quelle description de ce qui se passe lorsqu'un pointeur NULL est déréférencé (lecture de *p alors que p vaut NULL) est correcte ?
  2. On considère un environnement courant où char fait 1 octet et int 4 octets, et où les int sont placés à des adresses multiples de 4. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  3. uint32_t et uint8_t sont des types entiers non signés de 32 bits et de 8 bits, et l'environnement est petit-boutiste (little-endian). Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  4. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui stocke 9 dans un champ de bits de 3 bits ?
  5. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise la macro SQUARE définie par #define ?