Je travaille sur ce qui peut être vu comme un interpréteur C qui détecte tous les comportements indéfinis dans le programme qu'il interprète. En utilisant cet interpréteur pour trouver des bogues dans une application C open-source héritée, j'étais ...

3
Pascal Cuoq 14 mars 2021 à 21:12

1 réponse

Meilleure réponse

Les deux C99 (§7.19.8.2) et C11 (§7.21.8.2) définir fread() avec la description suivante:

La fonction fread lit, dans le tableau pointé par ptr, jusqu'à nmemb éléments dont la taille est spécifiée par size, à partir du flux pointé par {{X4} }. Pour chaque objet, size des appels sont faits à la fonction fgetc et les résultats sont stockés, dans l'ordre de lecture, dans un tableau de unsigned char superposant exactement l'objet. L'indicateur de position de fichier pour le flux (s'il est défini) est avancé du nombre de caractères lus avec succès. Si une erreur se produit, la valeur résultante de l'indicateur de position de fichier pour le flux est indéterminée. Si un élément partiel est lu, sa valeur est indéterminée.

Ce dernier élément devrait dissiper vos doutes:

Si un élément partiel est lu, sa valeur est indéterminée.

Ainsi, même si toutes les implémentations que vous voyez semblent se comporter "bien", vous ne pouvez pas vous fier à cela, car c'est un comportement dépendant de l'implémentation que la norme ne définit pas. Un programme qui souhaite lire un élément partiel (si le fichier en contient un) doit utiliser un size de 1 et vérifier la valeur de retour. En effet, si un programme ne fait pas cela et lit à la place avec size > 1 et nmemb = 1, il n'aurait même pas la capacité de faire la distinction entre les données initialisées et unitialisées dans le tampon dans le cas d'un dernier partiel élément.

5
Marco Bonelli 14 mars 2021 à 18:28