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 :

Problème avec free()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème avec free()
    Bonjour a tous, j'en suis toujours avec mon bot IRC et j'ai un petit soucis lorsque je le ferme, on m'annonce une erreure :
    *** glibc detected *** ./a.out: double free or corruption (!prev): 0x09d7b040 ***
    Je ne vois pas comment faire a part vous montrer tout mon code car je ne sais pas d'ou sa vient...(enfin si, surement de la fonction "range" vu que c'est elle qui touche a ce char* en dernier...).


    Edit : des petits détails de mon code mis a jour, mais j'ai toujours mon érreure, je sais que je donne pas mal de code a lire mais je ne vois pas pourquoi mon free plante :s

    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
    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
    97
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #include <pthread.h>
     
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        #include "irc.h"
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        #define PORT 80
     
     
     
    int main(int argc, char *argv[])
    {
     
        int err;
        SOCKET serv = socket(AF_INET, SOCK_STREAM, 0);
        SOCKADDR_IN cserv;
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        struct irc_msg ircmsg;
        ircmsg.serv = serv;
        ircmsg.nick = malloc(50 * sizeof(char));
        ircmsg.text = malloc(500 * sizeof(char));
        ircmsg.chaine = malloc(512 * sizeof(char));
        ircmsg.name = malloc(50 * sizeof(char));
        ircmsg.domain = malloc(50 * sizeof(char));
        ircmsg.event = malloc(50 * sizeof(char));
        pthread_t recevoir;
        struct hostent *adresse;
        fd_set read;
     
        if(argc == 1) {
            free(ircmsg.nick);
            free(ircmsg.text);
            free(ircmsg.chaine);
            free(ircmsg.domain);
            free(ircmsg.name);
            closesocket(serv);
            printf("Veuillez renseigner une adresse\n");
            return 0;
        }
        adresse = gethostbyname(argv[1]);
        cserv.sin_addr = *((struct in_addr *)(adresse->h_addr));
        cserv.sin_family = AF_INET;
        cserv.sin_port = htons(6667);
        err = connect(serv, (SOCKADDR*)&cserv, sizeof(cserv));
     
        printf("Connexion a %s\n", inet_ntoa(cserv.sin_addr));
        if(err == -1) {
                printf("Err connection\n");
                return 0;
        }
        printf("Connécté au serveur %s\n", argv[1]);
        send_line(serv, "NICK Bot-fox \r\n\r\n");
        send_line(serv, "PRIVMSG nickserv identify ganjaman\r\n\r\n");
        send_line(serv, "USER a a a a \r\n\r\n");      // A remplir correctement meme si le serveur s'en charge généralement
        send_line(serv, "JOIN #romfox\r\n\r\n");
     
        while(1) {
            pthread_create(&recevoir, NULL, recv_line, (void *)&ircmsg);
            pthread_join(recevoir, NULL);
            FD_ZERO(&read);
            FD_SET(STDIN_FILENO, &read);
            select(STDIN_FILENO+1, &read,NULL,NULL,&temps);
            if(FD_ISSET(STDIN_FILENO, &read)) {
                free(ircmsg.nick);
                printf("nick libéré\n");
                free(ircmsg.text);
                printf("txt libéré\n");
                free(ircmsg.chaine);
                printf("chaine libérée\n");
                free(ircmsg.domain);
                printf("domain libéré\n");
                free(ircmsg.name);
                printf("name libéré\n");
                free(ircmsg.event);
                printf("event libéré\n");
                closesocket(serv);
                return 0;
            }
     
     
        }
        return 0;
    }
    irc.h :

    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
    97
    98
    99
    struct irc_msg {
        SOCKET serv;
        char *nick;
        char *event;
        char *text;
        char *chaine;
        char *name;
        char *domain;
    };
     
    void send_line(SOCKET Client, char* buffer) {
        int i = 0;
     
        while(i< strlen(buffer)) {
               send(Client, (char *)&buffer[i], 1, 0);
               i++;
        }
    }
     
    int range(struct irc_msg *ircmsg) {
        int ret, i = 0;
        char *txt = NULL;
        ret = sscanf(ircmsg->chaine, ":%s %s", ircmsg->nick, ircmsg->event);
            txt = strstr(ircmsg->nick, "!");
            if(txt != NULL) {
                txt = NULL;
                ret = sscanf(ircmsg->chaine, ":%[^!]!%s %[^\n]", ircmsg->nick, ircmsg->domain, ircmsg->text);
                txt = strstr(ircmsg->text, ":");
                if (txt != NULL && ret == 3) {
                     while(txt[i+1] != '\n') {      // Lecture du texte
                          ircmsg->text[i] = txt[i+1];
                          i++;
                     }
                 }
                 printf("%s : %s\n", ircmsg->nick, ircmsg->text);
                 return 0;
        }
        printf("%s\n", ircmsg->chaine);
        return 0;
    }
     
    int fonctions(struct irc_msg *ircmsg) {
     
        char *txt = NULL;
        int t_buff = 0;
        FILE* bmots = NULL;
        char gro_mots[50] = "";
     
        txt = strstr(ircmsg->chaine, "PING");          // PING
        if (txt != NULL && ircmsg->chaine[0] == 'P') {
            ircmsg->chaine[1] = 'O';
            send_line(ircmsg->serv, ircmsg->chaine);
            send_line(ircmsg->serv, "\r\n\r\n");
            return 0;
        }
        bmots = fopen("b_words.txt", "r");
        while(fgets(gro_mots, 20, bmots) != NULL) {
            t_buff = strlen(gro_mots);
            gro_mots[t_buff - 1] = '\0';
            txt = strstr(ircmsg->text, gro_mots);
            if (txt != NULL && strcmp(ircmsg->nick, "romfox") != 0) {  // Kick sur grot mot de la liste
                send_line(ircmsg->serv, "KICK #romfox ");
                send_line(ircmsg->serv, ircmsg->nick);
                send_line(ircmsg->serv, "\r\n\r\n");
                return 0;
        }  // End while
        } // End gros mots
        fclose(bmots);
     
        if(strcmp(ircmsg->event, "JOIN") == 0 && strcmp(ircmsg->nick, "Bot-fox") != 0) {
            send_line(ircmsg->serv, "PRIVMSG #romfox :Bonjour ");
            send_line(ircmsg->serv, ircmsg->nick);
            send_line(ircmsg->serv, "\r\n\r\n");
     
     
        }
     
        return 0;
     
    }
     
    void* recv_line(void* data) {
        int i = 0, t_buff;
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        fd_set read;
        struct irc_msg *irc_mss = (struct irc_msg *)data;
        FD_ZERO(&read);
        FD_SET(irc_mss->serv, &read);
        select(irc_mss->serv+1, &read, NULL, NULL, &temps);
        if(FD_ISSET(irc_mss->serv, &read)) {
            t_buff = recv(irc_mss->serv, irc_mss->chaine, 512, 0);
            irc_mss->chaine[t_buff] = '\0';
            range(irc_mss);
            fonctions(irc_mss);
        }
     
    }
    Dernière modification par Invité ; 03/05/2011 à 15h13.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonjour,

    Quelques remarques à vue de nez :

    • À aucun moment, tu ne vérifies si tes malloc() ont correctement fonctionné. Ça risque d'être pénible à débuguer plus loin ;
    • Les différents threads disposent tous de leur propre copie de la pile, mais ils partagent le même tas. Si tu as plusieurs threads qui libèrent la même zone de mémoire préalablement allouée par malloc(), ça ne peut pas bien se passer ;
    • « while(stdin) » ne peut pas fonctionner en C non plus. Ce n'est pas du Perl…

  3. #3
    Invité
    Invité(e)
    Par défaut
    Coucou, heu désolé pour le while(stdin) qui était un gros test et une grosse érreure que j'ai oublié de suprimer du code a cause de la fatigue (l'excuse ), et en fait mon érreure venait apparement du fait que mon free était entre le pthread_create et le pthread_join, logique en meme temps qu'il y ai des soucis, milles excuses pour le post, c'est que le soir quand j'ai un soucis je le met sur le forum et le lendemain je trouve la solution tout seul quand je suis bien reveillé -_-, sinon pour tester les malloc je vais le faire maintenant C'est ma 1ere vrai application qui utilise l'allocation dynamique (oui je sais sa le fait pas pour quelqu'un qui veut coder un bot IRC) :p

    Edit : Petite fonction allocation crée tu vois j'apprend vite :p

    Re-EDIT : En fait j'ai toujours le meme problème de free qui ne marche pas... J'ai édité mon code !
    Dernière modification par Invité ; 03/05/2011 à 15h14.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par romfox17 Voir le message
    Bonjour a tous, j'en suis toujours avec mon bot IRC et j'ai un petit soucis lorsque je le ferme, on m'annonce une erreure :


    Je ne vois pas comment faire a part vous montrer tout mon code car je ne sais pas d'ou sa vient...(enfin si, surement de la fonction "range" vu que c'est elle qui touche a ce char* en dernier...).


    Edit : des petits détails de mon code mis a jour, mais j'ai toujours mon érreure, je sais que je donne pas mal de code a lire mais je ne vois pas pourquoi mon free plante :s Bizarement mon app marche (enfin ce que je lui demande pour l'instant marche apparement :s)

    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
    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
    97
    98
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #include <pthread.h>
     
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        #include "irc.h"
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        #define PORT 80
     
     
     
    int main(int argc, char *argv[])
    {
     
        int err;
        SOCKET serv = socket(AF_INET, SOCK_STREAM, 0);
        SOCKADDR_IN cserv;
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        struct irc_msg ircmsg;
        ircmsg.serv = serv;
        ircmsg.nick = malloc(50 * sizeof(char));
        ircmsg.text = malloc(500 * sizeof(char));
        ircmsg.chaine = malloc(512 * sizeof(char));
        ircmsg.name = malloc(50 * sizeof(char));
        ircmsg.domain = malloc(50 * sizeof(char));
        ircmsg.event = malloc(50 * sizeof(char));
        pthread_t recevoir;
        struct hostent *adresse;
        fd_set read;
     
        if(argc == 1) {
            free(ircmsg.nick);
            free(ircmsg.text);
            free(ircmsg.chaine);
            free(ircmsg.domain);
            free(ircmsg.name);
            free(ircmsg.event);
            closesocket(serv);
            printf("Veuillez renseigner une adresse\n");
            return 0;
        }
        adresse = gethostbyname(argv[1]);
        cserv.sin_addr = *((struct in_addr *)(adresse->h_addr));
        cserv.sin_family = AF_INET;
        cserv.sin_port = htons(6667);
        err = connect(serv, (SOCKADDR*)&cserv, sizeof(cserv));
     
        printf("Connexion a %s\n", inet_ntoa(cserv.sin_addr));
        if(err == -1) {
                printf("Err connection\n");
                return 0;
        }
        printf("Connécté au serveur %s\n", argv[1]);
        send_line(serv, "NICK Bot-fox \r\n\r\n");
        send_line(serv, "PRIVMSG nickserv identify ganjaman\r\n\r\n");
        send_line(serv, "USER a a a a \r\n\r\n");      // A remplir correctement meme si le serveur s'en charge généralement
        send_line(serv, "JOIN #romfox\r\n\r\n");
     
        while(1) {
            pthread_create(&recevoir, NULL, recv_line, (void *)&ircmsg);
            pthread_join(recevoir, NULL);
            FD_ZERO(&read);
            FD_SET(STDIN_FILENO, &read);
            select(STDIN_FILENO+1, &read,NULL,NULL,&temps);
            if(FD_ISSET(STDIN_FILENO, &read)) {
                free(ircmsg.nick);
                printf("nick libéré\n");
                free(ircmsg.text);
                printf("txt libéré\n");
                free(ircmsg.chaine);
                printf("chaine libérée\n");
                free(ircmsg.domain);
                printf("domain libéré\n");
                free(ircmsg.name);
                printf("name libéré\n");
                free(ircmsg.event);
                printf("event libéré\n");
                closesocket(serv);
                return 0;
            }
     
     
        }
        return 0;
    }
    irc.h :

    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
    97
    98
    99
    struct irc_msg {
        SOCKET serv;
        char *nick;
        char *event;
        char *text;
        char *chaine;
        char *name;
        char *domain;
    };
     
    void send_line(SOCKET Client, char* buffer) {
        int i = 0;
     
        while(i< strlen(buffer)) {
               send(Client, (char *)&buffer[i], 1, 0);
               i++;
        }
    }
     
    int range(struct irc_msg *ircmsg) {
        int ret, i = 0;
        char *txt = NULL;
        ret = sscanf(ircmsg->chaine, ":%s %s", ircmsg->nick, ircmsg->event);
            txt = strstr(ircmsg->nick, "!");
            if(txt != NULL) {
                txt = NULL;
                ret = sscanf(ircmsg->chaine, ":%[^!]!%s %[^\n]", ircmsg->nick, ircmsg->domain, ircmsg->text);
                txt = strstr(ircmsg->text, ":");
                if (txt != NULL && ret == 3) {
                     while(txt[i+1] != '\n') {      // Lecture du texte
                          ircmsg->text[i] = txt[i+1];
                          i++;
                     }
                 }
                 printf("%s : %s\n", ircmsg->nick, ircmsg->text);
                 return 0;
        }
        printf("%s\n", ircmsg->chaine);
        return 0;
    }
     
    int fonctions(struct irc_msg *ircmsg) {
     
        char *txt = NULL;
        int t_buff = 0;
        FILE* bmots = NULL;
        char gro_mots[50] = "";
     
        txt = strstr(ircmsg->chaine, "PING");          // PING
        if (txt != NULL && ircmsg->chaine[0] == 'P') {
            ircmsg->chaine[1] = 'O';
            send_line(ircmsg->serv, ircmsg->chaine);
            send_line(ircmsg->serv, "\r\n\r\n");
            return 0;
        }
        bmots = fopen("b_words.txt", "r");
        while(fgets(gro_mots, 20, bmots) != NULL) {
            t_buff = strlen(gro_mots);
            gro_mots[t_buff - 1] = '\0';
            txt = strstr(ircmsg->text, gro_mots);
            if (txt != NULL && strcmp(ircmsg->nick, "romfox") != 0) {  // Kick sur grot mot de la liste
                send_line(ircmsg->serv, "KICK #romfox ");
                send_line(ircmsg->serv, ircmsg->nick);
                send_line(ircmsg->serv, "\r\n\r\n");
                return 0;
        }  // End while
        } // End gros mots
        fclose(bmots);
     
        if(strcmp(ircmsg->event, "JOIN") == 0 && strcmp(ircmsg->nick, "Bot-fox") != 0) {
            send_line(ircmsg->serv, "PRIVMSG #romfox :Bonjour ");
            send_line(ircmsg->serv, ircmsg->nick);
            send_line(ircmsg->serv, "\r\n\r\n");
     
     
        }
     
        return 0;
     
    }
     
    void* recv_line(void* data) {
        int i = 0, t_buff;
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        fd_set read;
        struct irc_msg *irc_mss = (struct irc_msg *)data;
        FD_ZERO(&read);
        FD_SET(irc_mss->serv, &read);
        select(irc_mss->serv+1, &read, NULL, NULL, &temps);
        if(FD_ISSET(irc_mss->serv, &read)) {
            t_buff = recv(irc_mss->serv, irc_mss->chaine, 512, 0);
            irc_mss->chaine[t_buff] = '\0';
            range(irc_mss);
            fonctions(irc_mss);
        }
     
    }
    Edit : résolu par un gars super sur le chat qui a passé au moins 2h avec moi a éplucher mon texte
    Dernière modification par Invité ; 03/05/2011 à 18h11.

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

Discussions similaires

  1. problème avec free et delete
    Par saloua dans le forum C++Builder
    Réponses: 6
    Dernier message: 04/10/2011, 07h20
  2. problème avec free
    Par nhella22 dans le forum Débuter
    Réponses: 15
    Dernier message: 28/05/2011, 17h06
  3. Réponses: 1
    Dernier message: 07/02/2008, 21h40
  4. Problème PHP avec Free
    Par shikakus dans le forum Free
    Réponses: 8
    Dernier message: 05/03/2007, 14h36
  5. Problème avec un free
    Par Franck.H dans le forum C
    Réponses: 5
    Dernier message: 28/12/2005, 20h03

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