Le programme suivant est-il un programme C valide?Case d'angle de bibliothèque standard C
#include <stdio.h>
int main()
{
fwrite("x", 1, 1, stderr);
fflush(stderr);
fgetc(stderr);
fwrite("y", 1, 1, stderr);
return 0;
}
Notez que j'essaie de lire depuis stderr.
Quand je compile dans Visual C++ 2008, et l'exécuter, je reçois la sortie suivante:
xy
ce qui est logique. Toutefois, lorsque je redirige stderr vers un fichier (test.exe 2> foo.txt
), j'obtiens une fenêtre "Échec de l'assertion de débogage" avec le message suivant: "Comptage de flux incohérent: vidage entre lecture et écriture consécutives". L'ajout d'un fflush
entre la lecture et l'écriture résout le problème. (Cela se produit dans la version de débogage Dans les versions de version, la deuxième écriture échoue silencieusement).
Ce comportement est-il correct ou s'agit-il d'un bogue de la bibliothèque du
? Je ne pouvais pas trouver nulle part aucune règle décrivant quand lecture ou d'écriture sont illégales en C.
La lecture d'un flux de sortie est un comportement indéfini. Et que diable voulez-vous qu'il fasse? –
On note que ce ne serait pas un bogue de compilateur mais un bogue d'implémentation de bibliothèque. –
@NeilButterworth - Je ne crois pas que la lecture d'un flux de sortie devrait provoquer UB. Selon l'Opengroup, cela devrait simplement faire échouer 'fgetc' et mettre errno dans' EBADF' (voir http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html) –