IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Drole de bug avec Calloc !


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut Drole de bug avec Calloc !
    Bonjour a tous,

    voila, j'ai cree un petit parser de commande, modeste et pas parfait mais suffisant pour mes besoins....

    il fonctionne correctement mais cree un bug assez bizarre : les allocations memoires dynamiques, que j'effectue apres, plantent.
    Les variables utilisees pour ces allocations n'ont apparement aucun lien avec le parser. Cependant, si j'ote le parser, tous va bien.... bizarre

    encore plus bizarre, le code fonctionne parfaitement sous linux. sous windows avec devcpp..bug.

    voici un code minimal qui demontre le probleme

    merci d'avance pour votre aides

    Dav
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par dmichel
    Bonjour a tous,

    voila, j'ai cree un petit parser de commande, modeste et pas parfait mais suffisant pour mes besoins....

    il fonctionne correctement mais cree un bug assez bizarre : les allocations memoires dynamiques, que j'effectue apres, plantent.
    Les variables utilisees pour ces allocations n'ont apparement aucun lien avec le parser. Cependant, si j'ote le parser, tous va bien.... bizarre

    encore plus bizarre, le code fonctionne parfaitement sous linux. sous windows avec devcpp..bug.

    voici un code minimal qui demontre le probleme

    merci d'avance pour votre aides

    Dav
    Salut,

    Je n'ai pas regardé en détail, mais c'est pas beau à voir. Outre l'inclusion de l'en-tête iostream qui n'existe pas en C et les casts de calloc() qui sont déconseillés, je vois:

    • Des variables globales: en as-tu réellement besoin?
    • Que fait ta fonction allocationmem(), à part générer des trous de mémoire, parce que là, je vois pas? ())

    De manière générale, tu ne vérifies jamais la valeur de retour de tes fonctions d'allocation dynamique. C'est une grosse erreur, tu devrais toujours le faire...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et c'est passé à la compile ça ???? sous Linux ????

    je te crois pas...

    Au moins 2 énormités qui ne passent pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Opt_name[0] = "-h";
     Opt_name[1] = "-c";
     Opt_name[2] = "-p";
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               Opt_data[j] = cmd_v[i+k+1];
    Les chaînes de caractères ne se copient pas comme ça, en C...

    Il faut utiliser un strcpy, ou un strdup...

    Comme tu as déjà alloué la mémoire, ça sera strcpy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    strcpy( Opt_name[0], "-h");
    strcpy( Opt_name[1], "-c");
    strcpy( Opt_name[2], "-p");
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               strcpy (Opt_data[j], cmd_v[i+k+1]);

  4. #4
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    oups...j'avais pa fais gaffe a l'en-tête iostream...

    mais a part ca...oui le code est assez brouillon avec des variable globales, etc...
    mais ca n'explique pas le probleme ! La fonction allocationmem() ne fait rien en effet....car c'est juste un example !

    Pourquoi est-ce que ca plante avec le parser ? pourquoi ca passe sans le parser?

    sinon, ca compile sans problemes sous linux (as-tu essaye au moins ?)
    et je vois pas le probleme avec Du moment que Opt_name est definie comme

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il n'y a aucun problème à faire sauf que tu as une fuite de mémoire puisqu'avant tu as alloué de la mémoire à Opt_name[0].
    J'ai regardé ton code, à quoi sert cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void allocationmem(int bla)
    {
     
    int *gb_type,*gb_line,*gb_fill,*gb_trans,*gb_orient;
    int *gb_type_old,*gb_line_old,*gb_fill_old,*gb_trans_old,*gb_orient_old;
    int *gb_type_left,*gb_type_right;
     
    printf("allocation...\n");
     
           gb_type = (int*)calloc(bla,sizeof(int));
           gb_fill = (int*)calloc(bla,sizeof(int));
           gb_line = (int*)calloc(bla,sizeof(int));
           gb_trans = (int*)calloc(bla,sizeof(int));
           gb_orient = (int*)calloc(bla,sizeof(int));
           gb_type_old = (int*)calloc(bla,sizeof(int));
           gb_fill_old = (int*)calloc(bla,sizeof(int));
           gb_line_old = (int*)calloc(bla,sizeof(int));
           gb_trans_old = (int*)calloc(bla,sizeof(int));
           gb_orient_old = (int*)calloc(bla,sizeof(int));
           gb_type_left = (int*)calloc(bla,sizeof(int));
           gb_type_right = (int*)calloc(bla,sizeof(int));
     
    printf("allocation terminated\n");
     
    }/*end function*/
    Puisque tu alloues des variables qui ne sont pas utilisées ensuite ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trap D
    Il n'y a aucun problème à faire
    EN C ?????????????

    que je sache "-h" est une chaîne de caractères, pas un caractère..

    Et en C, la copie/assignation de chaîne se fait par strcpy..

  7. #7
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    "-h" est en effet une chaine de character...c'est pour ca que Opt_name est un double pointer !! char **Opt_name ...c'est pas pareil que char Opt_name !!!

    Bref, la question n'est pas la... la fonctione allocationmem() ne sert a rien dans cet example, c'est vrai. C'est juste un example. J'ai retire la suite du code pour que ca soit plus simple a lire.

    mais il y a un test simple a faire....runner le code tel quel et runner le code sans la fonction custom_parser(). Voyez la difference...

    avec la fonction custom_parser(), le code se plante dans allocationmem() et ne va pas jusqu'au bout (l'inscription "allocation terminated" ne s'affiche pas).

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Opt_name est de type char **, donc Opt_name[0] est de type char *.
    [Edit] j'ai testé le code sous Vista avec Visual Studio 2005 pas de problème de plante.
    [/edit]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et alors ?

    ça marche bien dans son code il fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Opt_name = (char**)calloc(Num_opts,sizeof(char*));
     for(i=0;i<Num_opts;i++){
     Opt_name[i] = (char*)calloc(10,sizeof(char));
     }
    JE MAINTIENS LE strcpy ...............

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Nous sommes bien d'accord qu'il y a une fuite mémoire, mais on peut effectivement faire Opt_name[0] = "-h" (c'est une co***rie je te l'accorde )

    Il a oublié aussi dans son code tous les free, c'est très mal programmé mais il n'y a pas de plante.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    Citation Envoyé par Trap D
    j'ai testé le code sous Vista avec Visual Studio 2005 pas de problème de plante.
    Haha...car sous WinXP avec devcpp, ca plante. J'ai d'abord pense que le compilateur en avait un coup dans le nez...alors j'ai deinstalle et reinstalle devcpp, mais la meme chose se produit. Sous linux, pas de problemes.

  12. #12
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    Citation Envoyé par Trap D
    Nous sommes bien d'accord qu'il y a une fuite mémoire, mais on peut effectivement faire Opt_name[0] = "-h" (c'est une co***rie je te l'accorde )
    Comme je l'ai dis precedemment...c'est un brouillon

    Citation Envoyé par Trap D
    Il a oublié aussi dans son code tous les free, c'est très mal programmé mais il n'y a pas de plante.
    j'ai enleve beaucoup du reste du code pour simplicite.... mais apparement, ca prete a confusion... desole.

    Mais comme tu l'as dis...c'est mal ecrit, mais ca devrait pas plante pour autant...

    il faudrait que quelqu'un avec Devcpp essaye

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trap D
    Nous sommes bien d'accord qu'il y a une fuite mémoire, mais on peut effectivement faire Opt_name[0] = "-h" (c'est une co***rie je te l'accorde )
    .
    Je ne crois pas. Ce n'est pas une initialisation dans une déclaration. C'est en cours d'exécution. Et je met ma main à couper que tout ce que ça fait, c'est mettre une adresse dans Opt_name[0][0] , ou à la limte le caractère '-'. Sans plus.

  14. #14
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    Citation Envoyé par souviron34
    Et je met ma main à couper que....
    c'est dommage, j'ai pas de hache

    si tu essayais le code, tu verrais qu' il n'y a pas de problemes

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    1) ce n'est pas parce qu'il n'y a pas de problème que ça marche
    2) yen a ben un, problème, puisque tu plantes..

    c'est juste que ça dépend des tolérances et des environnements.

  16. #16
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    selon moi, Opt_name[0][0] aura le character "-" et Opt_name[0][1] aura "h"
    en tous cas c'est ce que je veux avoir....ok il y aura une fuite de memoire car l'allocation memoire precedent permet 10 characters

    et donc, selon toi, ca causerait le plantage dans les callocs comme celui ci

    gb_orient = (int*)calloc(bla,sizeof(int));


    ....mmmm, la je vois pas...faut m'expliquer

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je répète juste que la manière correcte (indépendamment de ce qu'en fait le compilo ou le RAD), en C, de copier une chaîne est strcpy...

  18. #18
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2007
    Messages : 106
    Par défaut
    ok...il faut que j'essaye ca. Mais la je suis sur linux au boulot donc j'essayerais ce soir

  19. #19
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Hoal,
    Citation Envoyé par dmichel
    Haha...car sous WinXP avec devcpp, ca plante. J'ai d'abord pense que le compilateur en avait un coup dans le nez...alors j'ai deinstalle et reinstalle devcpp, mais la meme chose se produit. Sous linux, pas de problemes.
    Avant de penser ce genre de truc, il faut faire du code propre et, au minimum, correct.

    Je ne doute pas que tous les compilateurs aient quelques petits bugs de-ci de-là, mais avant d'accuser ton compilateur, il faut.... retour au 1er paragraphe.

  20. #20
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par souviron34
    Je ne crois pas. Ce n'est pas une initialisation dans une déclaration. C'est en cours d'exécution. Et je met ma main à couper que tout ce que ça fait, c'est mettre une adresse dans Opt_name[0][0] , ou à la limte le caractère '-'. Sans plus.
    Opt-name[0] étant un pointeur vers une chaîne de caractères, qu'il soit initialisé par un malloc ou par l'adresse d'une chaîne codée en dur en mémoire, je ne vois pas où est le problème.
    Son programme plante peut-être à cause de cette manipulation Opt_data[j] = cmd_v[i+k+1]; un peu bizarre dont je viens de m'apercevoir et qui avec cette combiansion d'arguments doit donner des résultats incorrects.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Drole de bug avec DataGrid et requete
    Par angelevil dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/06/2009, 00h20
  2. Bug avec le test de profondeur
    Par Tellmarch dans le forum OpenGL
    Réponses: 1
    Dernier message: 17/10/2004, 00h59
  3. Bug avec requete
    Par arsgunner dans le forum ASP
    Réponses: 8
    Dernier message: 14/06/2004, 16h25
  4. [C#] Bug (?) avec la propriété TransparencyKey de la Form
    Par FrigoAcide dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 14h14
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo