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

Réseau C Discussion :

Problème de mémoire


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut Problème de mémoire
    Bonjour,
    je suis en train de programmer un serveur web en C. Le tout fonctionne à peu prés bien mais je rencontre un problème dans une de mes fonctions. En effet j'ai besoin de lister le contenu d'un dossier si celui ci ne contient pas de fichier index.html

    Voila ma fonction censé faire ceci

    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
    char *listFolder(char *path) //liste le contenu d'un dossier grace à son chemin
    {
    	char hostNerrorP[32];
    	char *listFolderDef;
    	char pageAppend[]="</html>";
    	gethostname(hostNerrorP,sizeof(hostNerrorP));
    	char bodyList[]="<html><center><h1>Liste des fichiers du r&eacute;p&eacute;rtoire<h1></center><hr>";
    	char *startLink;
    	startLink = realloc(NULL, strlen("") + 1);
    	sprintf(startLink, "");
    	char href[] = "<a href=\"";
    	char middleLink[] = "\">";
    	char endLink[] = "</a>";
    	char br[] = "<br/>";
    	char *huh = strstr(path, "/www/");
    	huh = strstr(huh, "www/");
    	huh = strstr(huh, "/");
     
    	if(huh[strlen(huh)-1] != '/'){
    		strcat(huh, "/");  
    	}
     
    	printf("%s\n", huh);
     
    	struct dirent *lecture;
        DIR *rep;
        rep = opendir((char *)path);
     
        while ((lecture = readdir(rep))) {
     
    			char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
    			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
    			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
    			strcat(startLink, tmp);
     
     
        }
     
        closedir(rep);
     
    	listFolderDef=malloc((sizeof(bodyList)+sizeof(startLink)+sizeof(pageAppend))*(sizeof(char)));
    	sprintf(listFolderDef,"%s%s%s",bodyList,startLink,pageAppend);
     
    	return listFolderDef;
    }
    Je lui passe le chemin du dossier et elle me retourne le texte que j'écris ensuite dans ma socket. La fonction fonctionne mais dans ma console j'ai une erreur mémoire.

    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
    *** glibc detected *** ./test: malloc(): memory corruption: 0x08dbe080 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xc0dff1]
    /lib/tls/i686/cmov/libc.so.6[0xc10bb3]
    /lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x58)[0xc12868]
    /lib/tls/i686/cmov/libc.so.6[0xbfeddf]
    /lib/tls/i686/cmov/libc.so.6(fopen+0x2c)[0xbfeeac]
    ./test[0x804991a]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xbb9b56]
    ./test[0x8048c01]
    ======= Memory map: ========
    00689000-0068a000 r-xp 00000000 00:00 0          [vdso]
    00a16000-00a31000 r-xp 00000000 08:05 186741     /lib/ld-2.10.1.so
    00a31000-00a32000 r--p 0001a000 08:05 186741     /lib/ld-2.10.1.so
    00a32000-00a33000 rw-p 0001b000 08:05 186741     /lib/ld-2.10.1.so
    00ba3000-00ce1000 r-xp 00000000 08:05 397518     /lib/tls/i686/cmov/libc-2.10.1.so
    00ce1000-00ce3000 r--p 0013e000 08:05 397518     /lib/tls/i686/cmov/libc-2.10.1.so
    00ce3000-00ce4000 rw-p 00140000 08:05 397518     /lib/tls/i686/cmov/libc-2.10.1.so
    00ce4000-00ce7000 rw-p 00000000 00:00 0 
    00dd1000-00ded000 r-xp 00000000 08:05 170831     /lib/libgcc_s.so.1
    00ded000-00dee000 r--p 0001b000 08:05 170831     /lib/libgcc_s.so.1
    00dee000-00def000 rw-p 0001c000 08:05 170831     /lib/libgcc_s.so.1
    08048000-0804a000 r-xp 00000000 08:05 495498     /home/allian/Bureau/server/test
    0804a000-0804b000 r--p 00001000 08:05 495498     /home/allian/Bureau/server/test
    0804b000-0804c000 rw-p 00002000 08:05 495498     /home/allian/Bureau/server/test
    08dbe000-08ddf000 rw-p 00000000 00:00 0          [heap]
    b7600000-b7621000 rw-p 00000000 00:00 0 
    b7621000-b7700000 ---p 00000000 00:00 0 
    b77dc000-b77dd000 rw-p 00000000 00:00 0 
    b77ed000-b77f0000 rw-p 00000000 00:00 0 
    bff7f000-bff94000 rw-p 00000000 00:00 0          [stack]
    Ceci indique un mauvais accès mémoire au niveau de cette ligne je pense.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
    			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
    			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
    			strcat(startLink, tmp);
    Quelqu'un pourrait il m'éclairer sur les raisons de cette erreur
    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 131
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Y a plusieurs petites choses qui m'ont choqué ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while ((lecture = readdir(rep))) {
     
    			char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
    			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
    			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
    			strcat(startLink, tmp);
     
     
        }
    J'ai principalement regarder ce code.

    Premièrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
    Je me demande comment ça compile. Car littéralement, ça demande d'initialisaer + allouer, un tableau de taille fixe (ou connu à la compilation) avec une taille dynamique ( connue qu'à l'exécution).

    Une meilleure ligne pour faire ceci, sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char* tmp = calloc(strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br) ,sizeof(char));
     
    if ( tmp == NULL )
    {
         // Problème d'allocation mémoire
         // Afficher erreur et faire en sorte que le programme s'arrête proprement
    }
     
    // Travail sur tmp
     
    free(tmp);
    Après, l'utilisation de tmp est purement optionnelle. Mais ça tenderai peut être à rendre le code un peu moins lisible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
    			startLink = realloc(startLink,strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br) + strlen(startLink) + 1);
    sprintf(startLink, "%s%s%s%s%s%s%s%s", startLink, href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
    Pas sur que ça marche en plus ... ça me semble un peu bizarre, maintenant
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert confirmé
    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
    Par défaut
    - dans l'allocation du VLA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
    il manque la place pour le '\0' terminal placé par le sprintf qui suit.

    - Et surtout, cette autre erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listFolderDef=malloc((sizeof(bodyList)+sizeof(startLink)+sizeof(pageAppend))*(sizeof(char)));
    sprintf(listFolderDef,"%s%s%s",bodyList,startLink,pageAppend);
    L'allocation est insuffisante : startLink est un pointeur et sizeof startLink donnera la taille d'un pointeur (par exemple 4) indépendamment du nombre de caractères de la chaine pointée.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut
    Merci beaucoup, d'après vos conseils j'ai fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)+1];
    			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
    			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
    			strcat(startLink, tmp);
    et ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listFolderDef=malloc((strlen(bodyList)+strlen(startLink)+strlen(pageAppend) + 1)*(sizeof(char)));
    Et je n'ai plus le problème de mémoire.

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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