Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1859 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur de Segmentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de Segmentation

n°1378417
paowz
Posté le 31-05-2006 à 21:26:24  profilanswer
 

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.

 

mood
Publicité
Posté le 31-05-2006 à 21:26:24  profilanswer
 

n°1378425
paowz
Posté le 31-05-2006 à 21:48:42  profilanswer
 

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. }

n°1378428
Joel F
Real men use unique_ptr
Posté le 31-05-2006 à 21:50:33  profilanswer
 

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

n°1378431
Sve@r
Posté le 31-05-2006 à 21:54:13  profilanswer
 

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.
n°1378510
paowz
Posté le 01-06-2006 à 00:26:09  profilanswer
 

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..

n°1379240
Sve@r
Posté le 01-06-2006 à 18:54:11  profilanswer
 

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.
n°1380146
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-06-2006 à 18:38:22  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur de Segmentation

 

Sujets relatifs
Erreur de segmentation incompréhensibleerreur de segmentation
"erreur de segmentation" avec les threads sous linux en C++Erreur de segmentation
erreur de segmentation sur stringErreur Segmentation
Erreur de segmentationerreur de segmentation
erreur de segmentation pourtant simpleproblème d'erreur de segmentation
Plus de sujets relatifs à : Erreur de Segmentation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR