Erreur de Segmentation

Erreur de Segmentation - C - Programmation

Marsh Posté le 31-05-2006 à 21:26:24    

Bonjour à tous,
 
Une erreur me chagrine en prog  C-Ansi sous unix, je n'arrive pas à m'en défaire.
voici le prototype de stat():
 
int stat(const char *
file_name, struct stat *buf);  
 
le deuxieme argument est un pointeur vers un buffer..ok..
 
Dans la doc, la structure stat est déclarée comme cela:
 
struct stat mon_buf;
 
..impliquant l'utilisation de la fonction stat() de cette manière:
 
int i = stat("....",&mon_buf);
 
Mais je déclare vers le tas, en passant par un pointeur, comme suit:
 
struct stat *mon_buf;
 
et je l'utilise comme ca:
 
int ret = stat("....",mon_buf);
 
Ca marche...mais...
 
...quand j'utilise ensuite la fonction strcmp(), fonction qui n'utilise aucun des champs renvoyés par la fonction stat(), je me retrouve avec une erreur de segmentation à l'exécution... alors qu'il n'y a aucun lien (en apparence du moins..)
 
Avez-vous une idée de ce qu'il peut se passer, à ce moment là ?  :wahoo:  
 
Cdt.

 

Reply

Marsh Posté le 31-05-2006 à 21:26:24   

Reply

Marsh Posté le 31-05-2006 à 21:48:42    

je vous colle un cas d'erreur de segmentation avant meme que les strcmp soient utilisés...
 
il apparaît lorsque j'utilise:
int i = stat(dir->d_name,st_dir);
 
avec

Code :
  1. st_dir

déclaré en pointeur vers la structure...
 
alors qu'en déclarant la structure sur la pile (struct stat st_dir) et en faisant:
int i = stat(dir->d_name,&st_dir);
 
.. ben ca marche...
 

Code :
  1. DIR* open_dir = opendir(s_path);
  2. struct dirent *dir;
  3. struct stat *st_dir;
  4. if(open_dir != NULL){
  5.    while((dir = readdir(open_dir)) != NULL){
  6.        int i = stat(dir->d_name,st_dir); // erreur de segmentation
  7.        stat(dir->d_name,st_dir);   // ok !!
  8.    }
  9.    closedir(open_dir);
  10. }
  11. else{
  12. ..
  13. }

Reply

Marsh Posté le 31-05-2006 à 21:50:33    

et genre alloué t'as mémoire ?? t'y pense de temps en temps ?

Reply

Marsh Posté le 31-05-2006 à 21:54:13    

paowz a écrit :

Mais je déclare vers le tas, en passant par un pointeur, comme suit:
 
struct stat *mon_buf;
 
et je l'utilise comme ca:
 
int ret = stat("....",mon_buf);
 
Ca marche...mais...


 
Au lieu d'utiliser une variable de type "struct stat", tu utilises un pointeur, ok. Mais es-tu certain que ce pointeur pointe vers une zone mémoire suffisamment grande pour stocker tout le contenu d'un "struct stat" ???
Lorsqu'on utilises un pointeur "<type> *pt", quel que soit le type, il ne faut jamais aller toucher à "*pt" si on n'a pas fait auparavant "pt=<qqchose>"
Exemples

Code :
  1. struct stat x;
  2. struct stat *pt;
  3. pt=&x;


Code :
  1. struct stat *pt;
  2. pt=malloc(struct stat);


 
Tu passes à la fonction "stat" une adresse d'un "struct stat". Il faut bien que tu comprennes que "stat()" va aller remplir la zone mémoire pointée par cette adresse !!!
 

paowz a écrit :

quand j'utilise ensuite la fonction strcmp(), fonction qui n'utilise aucun des champs renvoyés par la fonction stat(), je me retrouve avec une erreur de segmentation à l'exécution... alors qu'il n'y a aucun lien (en apparence du moins..)


Comme tu le dis, "en apparence". Ptet que "pt" va pointer vers une zone utilisée par la variable que tu utilises dans "strcmp()". En utilisant "pt" sans garantir sa valeur, tu es entré dans un "no-man's land" de comportements indéfinis.
Ce genre de truc peut très bien fonctionner parce que, par chance, "pt" pointe vers une zone libre. Puis, 6 mois plus tard, tu rajoutes juste printf("Hello\n" ); et là, t'as un superbe "memory fault" parce cette ligne est située pile poil dans la zone pointée par "pt". Mais va donc retrouver l'erreur 6 mois après. Et toi, tu reviens ici ouvrir un nouveau topic pour dire que "printf()" est buggé !!!


Message édité par Sve@r le 31-05-2006 à 22:01:09

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-06-2006 à 00:26:09    

Ok..merci, Sve@r.
Ma connerie était d'envoyer des données vers un pointeur qui n'a même pas été initialisé..donc forcément, on peut pas savoir où ca pointe..
C'est très clair :)
 
mais comment se fait-il que:

Code :
  1. stat(dir->d_name,st_dir);   // ok !!


..marchait ?
Ca devait être un simple hasard, vraisemblablement..

Reply

Marsh Posté le 01-06-2006 à 18:54:11    

paowz a écrit :

Ca devait être un simple hasard, vraisemblablement..


Exactement. D'où le terme "comportement imprévisible"...

Message cité 1 fois
Message édité par Sve@r le 01-06-2006 à 18:57:08

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-06-2006 à 18:38:22    

Sve@r a écrit :

Exactement. D'où le terme "comportement imprévisible"...


"Comportement Indeterminé" (Undefined Behaviour ou UB)est le terme exact...


Message édité par Emmanuel Delahaye le 02-06-2006 à 18:39:12

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed