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 qui plante


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 800
    Points
    1 800
    Par défaut free qui plante
    bonjour si je ne me trompe pas quand on a un malloc il faut un free. voici un bout de code:
    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
        char *HtmlContent = (char *)malloc(sizeof(char)+1);
        strcpy(HtmlContent,"");
     
        while((res = recv(sock,buffer,BUFSIZ,0))>0)
        {
            HtmlContent = (char *) realloc(HtmlContent,sizeof(char)+(strlen(HtmlContent)+res+1));
            strcat(HtmlContent,buffer);
            memset(buffer,0,res);
        }
     
        puts(HtmlContent);
     
        if(res<0)
        {
            perror("Error reveiving data");
        }
     
        /* cleaning and exit */
        //free(HtmlContent);
        free(ip);
        free(server);
        close(sock);
    si j'enleve les commentaires avant free(HtmlContent) j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Segmentation fault (core dumped)
    ce que je ne comprend pas sauf si realloc empeche le free?
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Peux tu nous afficher ce que donne le programme ? (le contenu de HtmlContent (un truc court, hein))

    Peux tu ajouter une trace sur la taille réallouée dans le while ?
    Peux tu nous donner la taille de buffer, et les valeurs de res ?

    Le problème vient peut-être d'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(HtmlContent,buffer);
    Que se passe-t-il quand res vaut la taille du buffer ? (ie quand le buffer est si rempli qu'il ne contient pas de '\0' final)

  3. #3
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 800
    Points
    1 800
    Par défaut
    ./httpget localhost /test/test.html
    Connection to localhost (127.0.0.1) [OK]
    Removing leading "/",converting /test/test.html to test/test.html
    Quering:
    GET /test/test.html HTTP/1.0
    Host: localhost
    User-Agent: TVM_HTMLGET 0.1

    html <begin>
    ******


    <html>
    <head>
    <title> just a test </title>
    </head>

    <body>
    <p>
    <H2> Every things is OK </H2>
    </p>
    </body>
    </html>

    ******<html end>
    Segmentation fault (core dumped)
    ca c'est le resultat, j'ai modifier le code
    main.c
    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
    #include <stdio.h>
    #include "www.h"
    #include <stdlib.h>
    #include <string.h>
     
    void usage();
     
    int main(int argc, char **argv)
    {
     
    	char host[64],page[512];
    	if(argc<3)
    	{
    		usage();
    		return 0;
    	}
     
    	strcpy(host,argv[1]);
    	strcpy(page,argv[2]);
     
    	char *Html = GetHtml(host,page);
    	if(Html == NULL)
    	{
    		printf("Cannot retreive Html from %s/%s\n",host,page);
    		return EXIT_FAILURE;
    	}
     
    	printf("<html begin>******\n%s\n******<html end>\n",Html);
     
    	//free(Html);
     
    	return EXIT_SUCCESS;
    }
    getHtml dans www.c: un peu long hein
    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
    char * GetHtml(char* host,char *page)
    {
    	char *ip;
    	char *request;
    	int sock;
    	struct sockaddr_in *server;
    	int res;
    	char buffer[BUFSIZ+1];
     
    	ip = get_ip(host);
    	sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    	if(sock<0)
    	{
    		perror("Can't create TCP socket");
    		return NULL;
    	}
     
    	server = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in*));
    	server->sin_family = AF_INET;
     
    	res = inet_pton(AF_INET,ip,(void*)(&(server->sin_addr.s_addr)));
    	if(res <0)
    	{
    		perror("can't set server->sin_addr.s_addr");
    		return NULL;
    	}
    	else if(res == 0)
    	{
    		printf("\"%s\" is not a valid IP\n",ip);
    		return NULL;
    	}
    	server->sin_port = htons(PORT);
     
    	printf("Connection to %s (%s) ",host,ip);
    	res = connect(sock,(struct sockaddr *)server,sizeof(struct sockaddr));
    	if (res < 0)
    	{
    		perror("\t\t\t[failed]\n");
    		return NULL;
    	}
     
    	puts("\t\t\t [OK]");
     
    	request = build_get_query(host,page);
    	printf("Quering:\n%s",request);
     
    	int sent = 0;
    	while(sent<strlen(request))
    	{
    		res = send(sock,request+sent,strlen(request)-sent,0);
    		if(res == -1)
    		{
    			puts("\t\t\t [failed]");
    			perror("Can't send query");
    			return NULL;
    		}
    		sent+=res;
    	}
     
    	memset(buffer,0,sizeof(buffer));
     
    	char *HtmlContent = (char *)malloc(sizeof(char)+1);
    	strcpy(HtmlContent,"");
     
    	while((res = recv(sock,buffer,BUFSIZ,0))>0)
    	{
    		if(res>0) //if superflux mais je suis un peu parano
    		{
    			HtmlContent = (char *)realloc(HtmlContent,sizeof(char*)+(strlen(HtmlContent)+res+1));
    			strcat(HtmlContent,buffer);
    		}
    		memset(buffer,0,res);
    	}
     
     
    	if(res<0)
    	{
    		perror("Error reveiving data");
    	}
     
    	free(ip);
    	free(server);
    	close(sock);
     
     
    	int a = strstr(HtmlContent,"\r\n\r\n")-HtmlContent;
    	HtmlContent+=a;
     
    	return HtmlContent;
    }
    la taille du buffer ben je pense que ca doit pas etre la meme chose sur toute machine. si j'ajoute un printf() ca donne:ma page test.html comme on peut le voir est tres petite 114 ou un truc du genre donc ca passe des le premier. quand je tente avec fedora-fr.org visiblement ca passe pas en un coup et on a la meme erreur. jepense pas que ce soit un probleme de buffer size.
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  4. #4
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Tu devrais pas faire ?

    free(*HtmlContent);
    free(HtmlContent);
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  5. #5
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    c'est paut-être ces instructions qui posent problème:
    int a = strstr(HtmlContent,"\r\n\r\n")-HtmlContent;
    HtmlContent+=a;
    Vous déplacez alors le pointeur du début de la zone réservée, ce qui peut peut-être poser problème

  6. #6
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 800
    Points
    1 800
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    c'est paut-être ces instructions qui posent problème:

    Vous déplacez alors le pointeur du début de la zone réservée, ce qui peut peut-être poser problème
    +1
    exactement
    et pour y remedier j'ai du ajouter une structe qui contient 2string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Webpage
    {
        char *HttpHeader;
        char *HtmlCode;
    }
     
     
    Webpage *wp = malloc(sizeof(struct WebPage*));
    wp->HttpHeader = getHTTPHeader(htmlcontent); //du coup je devrait renomer cette variable
    wp->HtmlCode = getHtmlCode(htmlcontent);
    free(htmlcontent);
    return wp;
     
    et dans le main.c un appel a release WebPage(&wp);
    donc dans getHtmlCode je copy tout ce qui vient apres le \r\n\r\n

    ps: ca ne me derange pas d'etre tutoyer, ca me ferai meme plaisir. je trouve pas agreable d'etre interpelle au pluriel
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  7. #7
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    D'accord je m'en souviendrai , content d'avoir pu t'aider!

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

Discussions similaires

  1. free qui plante
    Par xeland dans le forum Windows
    Réponses: 3
    Dernier message: 18/11/2007, 15h31
  2. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22
  3. Programme qui plante
    Par harris_macken dans le forum C++
    Réponses: 1
    Dernier message: 22/05/2005, 23h50
  4. Pc qui plante
    Par tooms2028 dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 19/03/2005, 17h32
  5. [JTextArea] redessin qui plante
    Par phil_ma dans le forum Composants
    Réponses: 3
    Dernier message: 04/01/2005, 05h19

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