Bonjour,
voir : http://c.developpez.com/faq/?page=fi...dir_list_POSIX
Ca serait mieux de tester le retour non NULL de opendir avant de continuer non ?
Version imprimable
Bonjour,
voir : http://c.developpez.com/faq/?page=fi...dir_list_POSIX
Ca serait mieux de tester le retour non NULL de opendir avant de continuer non ?
l'auteur (LFE) ne s'est pas connecté depuis le 30/04/2008.
Si quelqu'un d'autre peut apporter cette modification ?
Je trouve que le test de rep n'est pas vraiment nécessaire car si rep = NULL car on peut passer NULL à readdir et closedir si je ne me trompe.
Oui peut être mais je trouve plus propre de faire un test explicite mais si implicitement cela ne va pas planter.
De plus, c'est du code dans la FAQ, donc autant être clair avec les éventuels débutants qui liront ce code.
Dans l'exemple (mal écrit) du très officiel opengroup qui gère POSIX.1, le test est fait. D'autre part, rien dans la doc n'indique que le comportement est défini avec NULL. Il est donc indéfini.
http://www.opengroup.org/onlinepubs/...s/readdir.html
Le fait que la fonction échoue et que errno doit être positionné à EINVAL si jamais une valeur invalide a été passée en paramètre ne l'implique t-il pas ? NULL est une des valeurs les plus invalides que je connaisse ...Citation:
Envoyé par Emmanuel Delahaye
Je pense que c'est surtout pour montrer que opendir retourne NULL en cas d'échec, pas parce que readdir serait incapable de tester si le paramètre qu'on lui a passé vaut NULL. Enfin, c'est juste une théorie ...Citation:
Envoyé par Emmanuel Delahaye
Je pense pas.
En tout cas chez moi ca produit une erreur de segmentation. Donc je suis plutot d'accord avec Emmanuel.
C'est d'ailleurs pour ca que j'ai fait ce post.
Petit test simple :
résultat :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <sys/types.h> #include <dirent.h> #include <stdio.h> int main () { DIR *dir = NULL; readdir(dir); printf("OK \n"); return 0; }
Citation:
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
[New process 7673]
#0 0xb7e22725 in readdir () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0 0xb7e22725 in readdir () from /lib/tls/i686/cmov/libc.so.6
#1 0x080483c7 in main ()
Et en plus t'es sous Linux ?
De : man readdir
Mais bon, les règles sont faites pour être enfreintes :lol:. La mise à jour s'impose donc.Citation:
NOM
readdir - Consulter un répertoire.
SYNOPSIS
struct dirent * readdir (DIR * dir);
VALEUR RENVOYÉE
La fonction readdir() renvoie un pointeur sur une structure dirent, ou NULL lorsqu'une erreur se produit, ou lorsque la fin du répertoire est atteinte.
ERREURS
EBADF : Le flux répertoire dir est invalide.
CONFORMITÉ
SVID 3, POSIX, BSD 4.3
Il y a une différence entre "un répertoire invalide", qui est une chaine de caractères valide désignant un répertoire inconnu, ou contenant des caractères interdits, et une chaine invalide (non terminée par un 0 ou NULL) qui provoque un comportement qui n'est pas décrit par la doc, qui est donc par définition "indéterminé".
Corrigé.
Lien (rappel) : Comment énumérer les fichiers d'un dossier (POSIX) ?
Merci à tous.