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

Mode arborescent

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.

+ 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