free qui debloque

free qui debloque - C - Programmation

Marsh Posté le 23-07-2006 à 15:35:53    

Bonjour,
 
Voila je vient d'ecrire une fonction toute simple pour un programme C et sa seg fault.
 
Donc jai utiliser gdb pour savoir se qui se passait et gdb me dit:
 
Program received signal SIGSEGV, Segmentation fault.
0x400bec1b in free () from /lib/libc.so.6
 
free() qui seg fault  :??: cest bien la premiere fois que sa me le fait.
 
voila ma fonction (strdup mais qui copie que n caractere de la chaine de depart)
 
char    *strndup(char *str, int n)
{
  int   i;
  int   max;
  char  *new;
 
  if (!str)
    return (NULL);
  max = (n > strlen(str)) ? (strlen(str)) : (n);
  if (!(new = malloc((max + 1) * sizeof(*new))))
    return (NULL);
  for (i = 0; i < max; i++)
    new[i] = str[i];
  new[i] = '\0';
  return (new);
}
 
et apres je fait un free(str); dans apres l'apel a cette fonction et la seg fault.
 
Jai beau regarder ma fonction je voit pas l'erreur.
 
Si quelqu'un a une idee merci.

Reply

Marsh Posté le 23-07-2006 à 15:35:53   

Reply

Marsh Posté le 23-07-2006 à 17:32:09    

Peut-etre parcque l'erreur n'est pas dans ta fonction http://forum-images.hardware.fr/icones/message/icon10.gif

Reply

Marsh Posté le 23-07-2006 à 18:38:51    

et en remplacant  
 
if (!(new = malloc((max + 1) * sizeof(*new))))  
 
par  
 
if (!(new = malloc((max + 1) * sizeof(char)))  
 
cela donne quoi ?

Reply

Marsh Posté le 23-07-2006 à 19:03:39    

Approfondis la remarque de SBAM.

Reply

Marsh Posté le 23-07-2006 à 19:26:53    

+1
 
Je demande à voir l'initialisation de str [:doc petrus]


Message édité par Elmoricq le 23-07-2006 à 19:27:01
Reply

Marsh Posté le 23-07-2006 à 20:04:10    

str = NULL ;) sinon, rassurer moi juste sur le faite que free sa peut pas seg fault et apres jpense que je vai finir par trouver

Reply

Marsh Posté le 23-07-2006 à 20:22:28    

En règle générale, la probabilité qu'une fonction de la libc soit buggée par rapport au code que l'on écrit est trèèèès faible.
 
Et je demandais surtout le type et la façon dont tu initialisais str avant de passer le paramètre à la fonction. :o


Message édité par Elmoricq le 23-07-2006 à 20:23:08
Reply

Marsh Posté le 23-07-2006 à 20:46:50    

de toute maniere, si j'envoie par hasard une mauvaise adresse a free, il me pete un warning mais il seg fault pas normalement, non ???

Reply

Marsh Posté le 23-07-2006 à 21:23:14    

La programmation en C ne doit jamais être du "par hasard" !
Tu dois ABSOLUMENT donner à free l'adresse allouée par malloc/realloc

Reply

Marsh Posté le 23-07-2006 à 21:30:55    

sundevil a écrit :

de toute maniere, si j'envoie par hasard une mauvaise adresse a free<...>


Comportement indéterminé. Tout peut arriver.
 


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

Marsh Posté le 23-07-2006 à 21:30:55   

Reply

Marsh Posté le 23-07-2006 à 21:32:33    

joneal a écrit :

et en remplacant  
 
if (!(new = malloc((max + 1) * sizeof(*new))))  
 
par  
 
if (!(new = malloc((max + 1) * sizeof(char)))  
 
cela donne quoi ?


Pareil. Ne pas critiquer du code qu'on ne comprend pas. Plutôt demander une explication...
 
http://mapage.noos.fr/emdel/notes.htm#malloc


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

Marsh Posté le 23-07-2006 à 21:33:29    

sundevil a écrit :

de toute maniere, si j'envoie par hasard une mauvaise adresse a free, il me pete un warning mais il seg fault pas normalement, non ???


Ah non, free ne "pète pas un warning", non.[:petrus75]


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 23-07-2006 à 21:45:14    

ok bon, bah je vais continuer a chercher.

Reply

Marsh Posté le 23-07-2006 à 21:49:32    

+1 avec SBAM, ton code a l'air correct (bien que pas vraiment optimisé et un peu moche, mais c'est un autre pb), cherche ailleurs dans ton code, notamment partout où str est utilisé entre ton strndup et ton free.


Message édité par el muchacho le 23-07-2006 à 21:51:56

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 23-07-2006 à 22:07:33    

Comment appelles-tu strndup ?  
Tu fais bien un free du pointeur retourné par strndup, pas du premier argument fourni à strndup ?

Reply

Marsh Posté le 23-07-2006 à 22:33:14    

ouai je fait un free du retour de strndup

Reply

Marsh Posté le 23-07-2006 à 22:39:04    

Tu as l'air d'avoir un comportement indéterminé dû sans doute à un dépassement de taille d'une variable, tableau, chaîne de caractères, pas facile à trouver sans bout de code.

Reply

Sujets relatifs:

Leave a Replay

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