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 ?
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 ?
Oui.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h> #include <dirent.h> int main (void) { DIR *rep = opendir ("."); if (rep != NULL) { struct dirent *ent; while ((ent = readdir (rep)) != NULL) { printf ("%s\n", ent->d_name); } closedir (rep); } return 0; }
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.
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
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 ...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 ...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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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 enfreintesNOM
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. La mise à jour s'impose donc.
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.
Partager