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 :

free(): invalid next size (normal)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut free(): invalid next size (normal)
    Bonjour,

    J'ai un assez gros code de calcul numérique qui me fait un bon plantage. Je l'ai lancé avec gdb histoire d'en savoir un peu plus et celui ci me dit entre autre :

    "*** glibc detected *** /home/nicolas/code/hyb2d/bin/001/hyb2d.exe: free(): invalid next size (normal): 0x00000000103e5790 ***"


    Je me suis dit, ok ce genre d'erreur c'est classiquement un free() sur un pointeur invalide... cependant le truc étrange c'est qu'il me fait ça à la 15919e itération (qui n'a rien de plus dans son traitement que la 15918e ou la 15920e), donc je me demandais si ce message pouvait signifier autre chose ?

    Comme par exemple un dépassement de tableau ou quelque chose comme ça ? En clair, quelles sont toutes les sources possibles en C pour quel mon débugueur me dise ça ?

    Bien sûr il ne me dit pas a quel endroit du code c'est arrivé

    J'ai tenté de lancé mon code avec valgrind pour détecter d'ou venait l'erreur, mais prenant en temp normal environ 4-5h pour arrivé au plantage, un petit calcul me donne environ 3mois pour y arriver avec valgrind vu la lenteur du bazar....

    Merci d'avance pour vos pistes et bonnes fêtes de fin d'année

  2. #2
    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 Heimdall Voir le message
    J'ai tenté de lancé mon code avec valgrind pour détecter d'ou venait l'erreur, mais prenant en temp normal environ 4-5h pour arrivé au plantage, un petit calcul me donne environ 3mois pour y arriver avec valgrind vu la lenteur du bazar....
    Bon, ben rendez vous dans trois mois alors...

    Sinon, tu réduis le code au minimum qui provoque le problème (méthode de débogage bien connue) et tu le postes.

    Nota : Le débordement de tableau et l'usage de pointeurs non initialisés sont à l'origine de plus de 80% des bugs à l'exécution d'un programme écrit en C.

  3. #3
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    Salut

    Justement, afin de réduire à la portion qui pose probleme, j'aimerais savoir ce que signifie ce message d'erreur... Appremment ça a avoir avec un free(), donc un probleme d'allocation de mémoire.

    est-ce la seule source de probleme a envisager ?

    Un dépassement de tableau peut-il provoquer ce genre d'erreur ?

    EDIT : ok, donc selon vous un dépassement de tableau est possible aussi ?
    Je pensais que si tel était le cas le message aurait été segmentation fault non ?

  4. #4
    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 Heimdall Voir le message
    Justement, afin de réduire à la portion qui pose probleme, j'aimerais savoir ce que signifie ce message d'erreur... Appremment ça a avoir avec un free(), donc un probleme d'allocation de mémoire.

    est-ce la seule source de probleme a envisager ?

    Un dépassement de tableau peut-il provoquer ce genre d'erreur ?

    EDIT : ok, donc selon vous un dépassement de tableau est possible aussi ?
    Je pensais que si tel était le cas le message aurait été segmentation fault non ?
    Malheureusement les comportements indéfinis ont, par définition, des comportements ... indéfinis... (Surprenant, non ?) Donc, il est très difficile de prévoir ce qui va se passer ou de tirer des conclusions des comportements visibles.

    Il y a un bug dans ton code, et il faut le trouver, c'est tout. Mon petit outil de tracking mémoire

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module SYSALLOC

    peut aider, mais j'ai peur qu'il faille beaucoup de mémoire trace... Tout dépend combien de blocs sont alloués en même temps.

    Si le code est bien écrit, il est modulaire et il est facile d'isoler ces morceaux de logiciel.

    Si c'est écrit à l'arrache, c'est poubelle et on recommence, mais cette fois, avec méthode, tests unitaires, bref, on fait comme partout dans l'industrie (Architecture, BTP, Auto, Aéronautique etc.), on construit sur des bases solides. Je ne sais pas pourquoi les informaticiens croient pouvoir échapper à ces principes fondamentaux ...

    Doivent se croirent plus malins que les autres, ces gonzes...

  5. #5
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    Indéfini... Ne me dit pas que glibc me dit "free(): invalid next size (normal)" un peu au pif ? Il doit bien y avoir des sources d'erreurs a privilégier et d'autres à laisser de coté en premier lieu...

    Donc est-ce que je peux dans un premier temps, écarter les possibles dépassement de tableau pour privilégier les double free() ?

  6. #6
    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 Heimdall Voir le message
    Donc est-ce que je peux dans un premier temps, écarter les possibles dépassement de tableau pour privilégier les double free() ?
    Non. Tu dois tout vérifier. Je t'ai indiqué un outil pour les allocations...

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Oui, cela sent le pointeur fou

    plusieurs sources d'erreur:
    * double free
    * buffer overflow (écriture sur plus que la taille allouée)

    Une première approche, lire et relire le code (mais je suppose que tu as déjà commencé )

    Tu peux aussi rechercher ton problème en créant ta propre surcouche de gestion de la mémoire dynamique qui te fera un controle des paramètres qui incrémentera et décrémentera le compteur d'allocation et qui gardera un historique des blocs alloués et qui a demandé ce bloc

    En général, ce genre de librairie ne met pas grand temps à être écrite et est bien utile pour la suite
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. free() invalid size très bizarre
    Par ImmoTPA dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2015, 19h42
  2. realloc(): invalid next size
    Par Bktero dans le forum C
    Réponses: 9
    Dernier message: 01/02/2012, 15h20
  3. Réponses: 0
    Dernier message: 18/09/2007, 19h07
  4. * glibc detected * free(): invalid pointer
    Par ViRouF dans le forum C
    Réponses: 4
    Dernier message: 28/03/2007, 17h10
  5. Réponses: 5
    Dernier message: 04/11/2005, 18h59

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