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

Bibliothèque standard C Discussion :

"heap corruption detected" sur desallocation de tableau de pointeurs


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Ingénieur Méhodologie Logiciel Embarqué
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Méhodologie Logiciel Embarqué

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut "heap corruption detected" sur desallocation de tableau de pointeurs
    Bonjour,

    j'ai un problème sur lequel je planche depuis un moment. Le programme ci dessous parse un fichier .csv pour récupérer des données par ligne.
    Lors de la boucle qui desalloue le tableau de pointeurs tabVal je reçois l'erreur HEAP CORRUPTION DETECTED: After Normal Block (#156) at 0x0033A280, CRT detected that the application wrote to memory after end of heap buffer.
    ( je travaille avec Visual C++ 2008 Express, sous Windows XP pro)

    je pensais qu'il est nécessaire de désallouer tous les éléments d'un tableau de pointeurs


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
     
    int main (int argc, char *argv[]){
     
        FILE * finput, * foutput;
        char * line;
        char ** tabLine, **tabVal;
        char * fInName, * fOutName;
        long int position;
        int cntL, cntV;
        int i;
        if (argc == 3) {
            fInName = argv[1];
            fOutName = argv[2];
            printf("input file : %s\t, output file  : %s\n",fInName, fOutName); 
            finput = fopen(fInName, "r");
     
            if (finput != NULL) {
                fseek(finput,0,SEEK_END);
                position = ftell(finput);
                fseek(finput,0,SEEK_SET);
                line = calloc(position,sizeof(char));
                fread(line,sizeof(char),position, finput);
                fclose(finput);
     
                foutput = fopen(fOutName, "w");
                if (foutput != NULL) {
                    fprintf(foutput,"test\n");
                    cntL = 0;
                    //decoupage par lignes
    				tabLine = splitString(line, '\n');
                    while (tabLine[cntL][0]!= '\0') {
    					//decoupage par ";"
                        tabVal = splitString(tabLine[cntL], ';');
                        cntV = 0;
                        while (tabVal[cntV][0]!= '\0') {
                            cntV++;
                        }
                        /*
    						----
    						fonctions sur les données recuperées.....
    					*/
    					//--------------------------
    					//	desallocation memoire 
    					for (i = 0;i<=cntV;i++) {                    
                            free(tabVal[i]);
                            tabVal[i] = NULL;
                        }
    					//--------------------------
                        free(tabVal);
                        tabVal = NULL;
                        cntL++;
                    }
                    for (i = cntL-1;i>=0;i--) {
                        free(tabLine[i]);
                    }
                    free(tabLine);
                    fclose(foutput);
                    printf("the sequence has terminated\n");
                }else printf("error while opening the output file %s\n", fOutName);
    			free(line);
            }else printf ("error while opening file :%s\n", fInName);
        }else printf("the numbre of parameters is incorrect : there must be 3\n");
        return(0);
    }
     
     
    char **  splitString(char * strLine, char strMod){
        char ** tabVal;
        unsigned int i, j, cnt;
        i = 0; j = 0; cnt= 0;
        tabVal = malloc(sizeof(char*));
     
        while (i<strlen(strLine)) {
            while (strLine[i] != strMod && strLine[i] !='\0' && strLine[i]!= '\r')  
                i++;
            if (strLine[i] != '\r') {
                tabVal = realloc(tabVal, (cnt+1) * sizeof(char*));
                tabVal[cnt] = malloc((i-j)*sizeof(char));
                strncpy (tabVal[cnt], strLine + j , i-j);
                tabVal[cnt][i-j] = '\0';
                cnt++;
                i++;
                j = i;
            }else i = strlen(strLine);
        }
     
        tabVal = realloc(tabVal, (cnt+1) * sizeof(char*));
        tabVal[cnt] = malloc(sizeof(char));
        tabVal[cnt][0] = '\0';
        return(tabVal);
    }
    J'ai passé du temps sur le forum à rechercher quelqu'un qui ait pu avoir ce genre d'erreur mais je n'ai rien trouvé.

    Merci d'avance pour votre aide!

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je ne constate pas cette erreur d'accès là où tu la signales.
    Par contre, ici il y a un dépassement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char **  splitString(char * strLine, char strMod){
    ...
                tabVal[cnt] = malloc((i-j)*sizeof(char));
    ...
                tabVal[cnt][i-j] = '\0';
    L'indice maximum de tabval[cnt] est i-j-1 !

    Alors, faut-il faire un malloc de i-j+1 ou faire tabVal[cnt][i-j-1] = '\0', c'est à toi de voir.



    PS : ton code est extrèmement embrouillé (à mon avis) :

    - Utiliser fseek sur un fichier texte peut amener des surprises. Normalement, fseek sur un fichier texte ne devrait être utilisé qu'avec SEEK_SET et un déplacement de 0 ou d'une valeur obtenue par ftell(). Il n'est pas certain que tu obtiennes de la façon que tu utilises le nombre exact de bytes du fichier. De plus, tout dépend du codage de la fin de ligne dans le fichier.

    - Pourquoi ne pas utiliser les fonctions permettant la lecture d'UNE ligne (fgets) pour la décomposer ensuite (strtok ?) ? Ce serait bien plus simple !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    L'erreur donnée, HEAP CORRUPTION DETECTED: After Normal Block (#156) at 0x0033A280, CRT detected that the application wrote to memory after end of heap buffer., est extrêmement claire : cela signifie que tu es allé jardiner après la fin d'une zone mémoire allouée.

    Visual C++, en mode Debug, insère du code spécifique et des initialisations cachées afin de détecter les problèmes suivants :
    • Utilisation de variables locales non-initialisées.
    • Utilisation de mémoire allouée non initialisée.
    • Débordement de buffers alloués dynamiquement.
    • Débordement de pile.
    • Sortie de l'espace d'adressage du processus.


    Pour plus de détails, voir cette page MSDN.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Ingénieur Méhodologie Logiciel Embarqué
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Méhodologie Logiciel Embarqué

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'avais comemncé par utiliser strtok mais on m'a dit de repartir de quelque chose de déjà écrit pour gagner du temps seulement comme je n'ai pas l'ensemble du code dont j'aurais du repartir, ca n'avance pas tres vite. Je vais essayer avec votre méthode. Merci.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Ingénieur Méhodologie Logiciel Embarqué
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Méhodologie Logiciel Embarqué

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    avec fgets et strtok il n'y a plus de problèmes merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Points : 104
    Points
    104
    Par défaut
    Problème classique de heap overflow de même que pour les piles, le réflexe est de tout de suite vérifier le contenu du buffer et les possibilités de dépassement.

    Pour les tas je ne connais pas trop mais pour les piles tu as vite fait avec un dépassement de buffer d'aller détruire ton pointeur de retour de fonction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Heap Corruption Detected à la fermeture du programme
    Par Myth_Titans dans le forum Ogre
    Réponses: 7
    Dernier message: 16/06/2008, 20h20
  2. HEAP CORRUPTION DETECTED
    Par li_causi dans le forum C++
    Réponses: 4
    Dernier message: 27/04/2008, 22h44

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