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 :

Qui pourrait expliquer mon pb de core dump ?


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Qui pourrait expliquer mon pb de core dump ?
    Bonjour je me permet de poster un petit morceau de code pour illustrer un probleme de core dump que je n'explique pas.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    int main() {
     
        char * string1 =  (char *) malloc( 6 * sizeof(char) );
        char * string2 =  (char *) malloc( 6 * sizeof(char) );
     
        char ** ptr = (char **) calloc(100, sizeof(char*)); // reserve 100 slots
        for ( int idx = 0; idx < 100; ++idx )
            printf("ptr[%d] = %x\n", idx, ptr[idx] );
     
        sprintf( string1, "Hello");
        //memcpy ( string2, "World", 6 ); // idem que le sprintf
        sprintf ( string2, "World");
     
        ptr[0]= &string1[3];
        ptr[1]= &string2[1];
     
        // print result
        printf("<%s>\n", ptr[0] );
        printf("<%s>\n", ptr[1] );
     
        // here we overlap string1, but volontary over sized too
        //memcpy(ptr[0], "tes laitues sechent-elles ?", 28 );
        sprintf(ptr[0], "tes laitues sechent-elles ?" );
        //memcpy(ptr[0], "hilll", 6 );
     
        // print result
        printf("<%s>\n", string1 );
        printf("<%s>\n", ptr[0] );
     
        // print
        for ( int idx = 0; idx < 100; ++idx )
            printf("ptr[%d] = %x\n", idx, ptr[idx] );
     
        ptr[0] = 0;
        ptr[1] = 0;
     
        // print
        for ( int idx = 0; idx < 100; ++idx )
            printf("ptr[%d] = %x\n", idx, ptr[idx] );
     
        free( ptr ); // core dump !
        printf("End\n");
     
    }
    il y a ecrasement memoire ici volontaire ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(ptr[0], "tes laitues sechent-elles ?" );
    si cette ligne est commentee alors tout est OK.

    Mais vous pouvez voir que les pointeurs ptr[0] et ptr[1] sont forces a 0.
    Donc j' aimerais savoir comment le programme plante sur le free() ! C est comme si il essayait de liberer la ressource de string1 alors qu il n a plus l'addresse pour y acceder.
    On ne voit pas l affichage de "End".

    Voici la pile d appel pour le core dump:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (gdb) bt
    #0  0xffffe410 in __kernel_vsyscall ()
    #1  0xb7d36770 in raise () from /lib/tls/i686/cmov/libc.so.6
    #2  0xb7d37ef3 in abort () from /lib/tls/i686/cmov/libc.so.6
    #3  0xb7d6bd0b in __fsetlocking () from /lib/tls/i686/cmov/libc.so.6
    #4  0xb7d738bd in mallopt () from /lib/tls/i686/cmov/libc.so.6
    #5  0xb7d73a44 in free () from /lib/tls/i686/cmov/libc.so.6
    #6  0x0804883c in main () at test4.cpp:48

  2. #2
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord tu fais ++i alors que c'est i++



    ...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par souviron34
    d'abord tu fais ++i alors que c'est i++



    ...
    Je ne vois pas de i dans le programme.

    En revanche, la ligne qui parle de laitue provoque un dépassement du tableau alloué. Il n'est pas sûr que ce soit cela, cependant, il se peut que ce dépassement écrase la valeur de ptr, d'où une erreur lors du free().

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ok ok c'est ++idx et non pas ++i ..

    Le problème est le même..... La variable est incrémentée AVANT ...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et enfin tu alloues des châines de 6 caracères, mais tu copies une phrase longue dedans, puisque tu as remplacé le pointeur par l'adresse de cette chaîne....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par souviron34
    ok ok c'est ++idx et non pas ++i ..

    Le problème est le même..... La variable est incrémentée AVANT ...
    Ca n'a aucune importance quand il s'agit du troisième membre d'un for, car on ne se sert pas de la valeur, on est juste intéressé par l'effet.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seb9999
    il y a ecrasement memoire ici volontaire ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(ptr[0], "tes laitues sechent-elles ?" );
    si cette ligne est commentee alors tout est OK.
    Cette ligne provoque une écriture dans une zone non allouée. Le comportement est indéfini. Tout peut arriver.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

    Ne pas perdre son temps à essayer d'expliquer les comportements indéfinis, mais se concentrer sur l'écriture de code correct.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par souviron34
    d'abord tu fais ++i alors que c'est i++
    idx... de toutes façons, dans une expression unaire, ça ne change rien.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    ptr[0] = 0 avant le free(),
    Je ne vois pas pourquoi il essait de liberer et plante.
    Cependant comme le dit Stephl c'est peut etre bien le dépassement qui écrase la valeur de ptr. en C la taille du tableau est sauvegarder quelque part. ( pour le free justement )
    Peut etre que cette valeure est stocke apres l'espace reserve par calloc() dans la string1. La valeure taille est donc ecrasee.
    Et donc le free perd l'info de la taille et plante ...
    C'est une idee mais j ai pas moyen d en etre sur.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Ok je viens de voir le post d'Emmanuel.
    On a croise.
    Merci pour votre aide.
    -SFI

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    D'après mes vieux souvenir du C,ne faudrait-il pas écrire
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2014, 12h06
  2. Réponses: 11
    Dernier message: 31/12/2013, 19h23
  3. Qui pourrait m expliquer pour embarcadero OSX
    Par phcm971 dans le forum Composants FMX
    Réponses: 3
    Dernier message: 29/09/2011, 14h13
  4. Réponses: 3
    Dernier message: 31/08/2010, 23h23
  5. Où aller regarder les cores dumped de mon application
    Par donkeyquote dans le forum Administration système
    Réponses: 2
    Dernier message: 29/01/2008, 22h30

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