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 averti
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    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 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
    d'abord tu fais ++i alors que c'est i++



    ...

  3. #3
    Membre émérite 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
    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 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
    ok ok c'est ++idx et non pas ++i ..

    Le problème est le même..... La variable est incrémentée AVANT ...

  5. #5
    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 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....

  6. #6
    Membre émérite 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
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

  9. #9
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    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 averti
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Par défaut
    Ok je viens de voir le post d'Emmanuel.
    On a croise.
    Merci pour votre aide.
    -SFI

  11. #11
    Expert confirmé 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
    Par défaut
    Bonjour,

    D'après mes vieux souvenir du C,ne faudrait-il pas écrire

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