Bonsoir,
je me tourne vers vous comme dernier recours, je ne sais plus quoi faire depuis 5 jours...
Avec un collègue nous avons fini de coder pour la fac un compilateur en C/Lex/Yacc pour un langage "MiniC" ressemblant au C. Le compilateur une fois fini nous avons décidé de l'améliorer, enfin bref il a très très bien marché. MAIS !
Mais depuis 5 jours, et vraiment du jour au lendemain, quasiment sans rien toucher (ou en tous cas aucun bout de code concernant l'allocation dynamique), le programme se met à segfault sur des mallocs, plus précisément, il s'agit de la fonction _int_malloc(), appelée soit via un malloc, soit par strdup().
Le pire c'est qu'il segfault au même endroit, tout le temps. En fait, on crée un arbre syntaxique du programme .MiniC de type :
typedef struct Arbre_bin { int nature; int valeur; Arbre_bin* d; Arbre_bin* g; } Arbre_bin;
On a une fonction creer_noeud qui alloue la mémoire d'un noeud, et c'est tout le temps lors du 1527e noeud alloué que le segfault se fait...
Sinon, lors d'un strdup, c'est lors du même lexème lu dans le fichier source.
make clean; make n'y font rien non plus, toujours le 1527e noeud... sachant du coup que les sources qui n'ont pas besoin de 1527 noeuds ne segfaultent pas... De plus, comme j'ai dit, le compilateur marchait bien avant même pour un fichier qui demande 1527 noeuds... (*) Vous me direz que c'est un souci de mémoire mais j'ai 6GO de RAM, puis tous les free() sont fait lors d'une bonne exécution. Mais bon, pour l'exécution d'un source par notre machine virtuelle, il faut bien créer toutes les tables de déclarations, de types et les arbres syntaxiques...
Merci de votre aide, nous sommes perdus !
(*) pour ceux que ca intéresse : les modifications apportées portent sur l'ajout de fonctions natives du C, comme sleep(), rand(), sqrt() etc...
Partager