projprog/C7.md
2021-10-18 08:24:56 +02:00

29 lines
1.8 KiB
Markdown

C7
=
### Exercice 1
Le code affiche le caractère `a` qui a pour code ascii 97 = 48(code ascii du `0`) + 49 (code ascii du `1`)
### Exercice 2
Ce code incrémente la variable `c` jusqu'à ce que sa valeur dépasse sa taille théorique. Alors l'incrément lui donne la valeur 0 (`11111111 + 00000001 -> 00000000` en non signé). Les caractères correspondants sont ensuite affichés.
Le processeur aurait pû aussi planter lors de l'appel à la somme créant un `overflow`.
Pour c<128, le programme nous affiche la liste de certains caractères `ASCII` avec leurs codes associés.
### Exercice 3
En C, une chaine de caractères est typiquement est une suite de caractères terminée par le caractère nul (`\0`). La chaine de caractères `"toto"` a donc une taille mémoire de 5. Essayer de l'afficher plantera ou du moins, ne produira probablement pas le résultat demandé, car ce dernier caractère ne sera pas trouvé.
`gcc` autorise au moins cette construction, même si elle est dangereuse.
### Exercice 4
En C, une chaine de caractère a le type `char*`. C'est donc un pointeur vers une case mémoire de type `char` (taille 1 octet). Pour lire la chaine, il faut lire les caractères et incrémenter le pointeur (passer à l'octet suivant) jusqu'à tomber sur le caractère nul (`\0` correspond à l'octet nul).
### Exercice 5
Ce programme est problématique puisque si le pseudo est plus grand que 10 caractères, scanf essaiera d'écrire des octets d'autres variables, pouvant mener a des Segfault ou des attaques par *buffer overflow*.
Un autre problème est aussi que `scanf` arrête sa lecture à la lecture du premier espace. Donc si l'utisateur a un espace dans son pseudo, scanf ne récuperera que la premiere partie et récuperera la seconde plus tard, bref c'est la mouise.