[C] pointeur assigné à 0x1

timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

Je fais en ce moment un petit projet en traitement d'image et je galère un peu. Mon prog doit être adapté pour du temps réel et j'ai des petis soucis.
Le prog que j'ai fait en C sous cygwin marche bien seulement lorsque je le mets en boucle pas mal de fois ça plante en segmentation fault. Genre quand dans mon main je fais une boucle for sur 20000 itérations ça plante alors que par exemple pour 10000 tout passe bien.

J'ai pensé à une fuite de mémoire mais apparemment ça n'en est pas une car j'ai utilisé des macros pour écrire dans un fichier texte toutes les allocations et les désallocations et tout semble bon.

En utilisant gdb, j'ai pu observé quelquechose. La fonction dans laquelle ca plante doit désallouer une structure et apparemment celle aurait l'adresse 0x1 est ce normal ?

Je peux fournir mon code si vous voulez seulement il est un peu lourd y a pas mal de fichiers C et de fonctions qui s'appellent les unes les autres.

Merci d'avance.

11 réponses

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Salut,

Oui met nous un lien vers ton code...
0
timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
OK voila mon code

http://rapidshare.com/files/45360414/source_rep.rar.html
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
J'ai vu quelques problèmes :
- certaines fonctions devraient être déclarées dans tes headers qui ne le sont pas
- la fonction ApplyThreshold est sensée retourner un entier mais qui ne retourne rien (et ça, ça peut déclencher une segfault)
- il y a pas mal de comparaisons entier signé / non signé il faut vraiment faire gaffe de ce côté là aussi.

1) Recompile ton programme avec les options -W -Wall pour voir toutes les erreurs dont je te parle, je te conseille d'ailleurs de les utiliser systématiquement.
2) Corrige les warnings.
3) Fais un valgrind pour trouver les fuites mémoires liées à ton programme.
Si ça ne résout pas ton problème partage tes sources corrigées.

Bonne chance
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Même une fois le code source corrigé pour -W et -Wall, le problème subsiste.
J'ai testé avec cygwin comme timekill.
Histoire d'être sûr, je regarderai ça sous Linux ce soir.
0
timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
Merci les gars pour vos réponses rapides. Je vais essayer de faire les corrections que vous m'avez dites et je vais voir ce que ca donne.

As tu un comportement différent Kilian sur Linux en ayant corrigé le code?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
OK j'ai compilé avec les options -W -Wall et j'ai corrigé tous les warnings. J'avais essayé auparavant d'utiliser valgrind avec Cygwin mais ça avait planté durant la config donc pour tout ce qui est fuite de mémoire j'ai utilisé
la méthode des fonctions mwatch
https://codes-sources.commentcamarche.net/
UN fichier texte est rempli et récapitule toutes les allocations et désallocations. Je l'ai lancé sur une itération (le fichier texte fait déjà 20 Mo) et à la fin j'ai bien la mémoire remise à zéro toutes les allocations ont été désallouées par la suite, donc je pense pas de fuite. Je ne l'ai pas lancé sur plus d'itérations car le fichier texte deviendrait trop gros.

En relancant le prog avec 20000 itérations ça plante toujours

Voici mes sources corrigées:
http://rapidshare.com/files/45519909/source_rep.rar.html
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
J'ai testé sous Linux avec une boucle de 20 000 et ça ne plante pas !

Je relance avec une boucle de 100 000 et le temps que ça mouline je vais faire les courses.
Je vous donne le résultat à mon retour :-)
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ah zut, ya eu un segfault :-(
Bon je regarderai ça plus en détail plus tard....
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Partagez vos sources corrigées si vous voulez que j'y jète un oeil.

@+
0
timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
Tu peux avoir mes sources corrigées ici
http://rapidshare.com/files/45519909/source_rep.rar.html

Apres je ne sais pas si kilian en a des différentes
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
GrayIntImage *GrayIntImage__create(unsigned int height, unsigned int width, GrayIntImageDataType *pRawData)
{
    GrayIntImage *self = malloc(sizeof(GrayIntImage));
    if (self==NULL) printf("Malloc failed\n");

    self->width = width;
    self->height = height;
    self->size = width*height;

    if (pRawData == NULL){
        self->pRawData = malloc((width*height)*sizeof(GrayIntImageDataType));
        if (self->pRawData==NULL) printf("Malloc failed\n");
    }
    else self->pRawData = pRawData;

    return self;
}

Un malloc n'initialise pas la mémoire à 0 (contrairement à calloc). Si un espace avec autre chose que NULL est utilisé lors de cette allocation, le teste visant à allouer pRawData est faux et ce champ jamais alloué, conduisant à une segfault.

Moi à mon avis ton problème vient de là. Attention dans ton main pour inclure stdio.h :
#include <stdio.h>


Bonne chance
0
timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour ta réponse mais ce que je ne comprends pas c'est que ces fonctions je les appelle seulement avec un param NULL:

GrayIntImageDataType * Image = NULL;
GrayIntImageDataType * Image_pixels_analysed = NULL;

I = (GrayIntImage *)GrayIntImage__create((unsigned int)height,(unsigned int)width,(GrayIntImageDataType *)Image);

I_pixels_analysed = (GrayIntImage *)GrayIntImage__create((unsigned int)height,(unsigned int)width,(GrayIntImageDataType *)Image_pixels_analysed);

Donc normalement je ne passe pas dans ce cas. Tu penses que ça peut influer qd même?
Dans ce cas d'après toi il faudrait que je fasse un malloc dans ce cas là aussi ?
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Le truc c'est que quand tu alloues self, son champ pRawData est a priori non nul si tu viens d'allouer self. Du coup tu n'alloues pas pRawData et quand tu l'utilises par la suite ça fait seg fault. Mais si ça se trouve l'erreur vient d'ailleurs.
0
timekill Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
OK d'acc. bon j'ai mis un malloc en plus dans ce cas là mais apparemment le bug est toujours là donc je ne sais plus trop quoi en penser.
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Si tu arrives à le faire planter voilà ce que je te propose. Tu compiles avec l'option -g ton programme. Ensuite tu lances gdb :
gdb monexecutable.exe

Dans gdb tu lances le programme (r) et tu affiches la pile d'exécution (bt)
r
bt

Comme ça tu sauras exactement où ça plante. Reporte moi le résultat de gdb.

Bon courage.
0