Rendu 3 ligne 345 inutile (Overflow)

Rendu 3 ligne 345 inutile (Overflow)

par Fouad Mahmoud,
Number of replies: 1

Bonjour,

En fait je ne comprend pas dans la correction du 3ème rendu pourquoi la boucle while qui recommence quand le nom du fichier est plus grand que 40 caractères est inutile. Chez moi si le nom est > 40 caractères la boucle while est parcourue et on redemande un nouveau nom. À la fin, tout marche mais il y a juste un stack smashing après que les diamants se dessinent. Ainsi si un overflow se produit en utilisant fscanf, pourquoi la boucle while serait-elle inutile dans ce cas?

In reply to Fouad Mahmoud

Re: Rendu 3 ligne 345 inutile (Overflow)

par Deleted user,

Bonjour,

Je vais répondre de manière générale car j'ignore ce que vous avez fait spécifiquement dans votre code. Dans le code de base fourni, un des problèmes de cette partie était un potentiel overflow au niveau du buffer lors du scanf. Il s'agissait d'un bug que vous pouviez observer en entrant plus de caractères qu'autorisés (il vous fallait peut-être lire +100 caractères pour que le bug se manifeste immédiatement).

Pour corriger ce bug, il fallait limiter le nombre de caractères lus au niveau de la lecture-même, c'est-à-dire directement dans scanf ou en le remplaçant par un fgets. Tester après coup avec strlen que le nombre de caractères du buffer ne dépasse pas la limite autorisée et reboucler en conséquence ne fait aucun sens car le mal aura déjà été fait en cas de buffer overflow: on aurait déjà écrit en dehors du buffer et tester le nombre de caractères lus deviendrait anecdotique.

Lors de la lecture d'un entier avec scanf par exemple, si un caractère inattendu est rencontré, celui-ci n'est pas consommé et demeure dans le flot d'entrée standard (stdin). Dans ce cas-là, pour s'en sortir, le recours à une boucle et le vidage de stdin deviennent nécessaire. Dans le cas d'une lecture d'une chaîne de caractères, le recours à une boucle est inutile car la gestion de l'erreur se fait au niveau du scanf, encore une fois en limitant le nombre de caractères à lire directement dans le format.

Est-ce plus clair ?