Ошибка сегментации в обработчике потоков - PullRequest
0 голосов
/ 11 февраля 2019

Моя функция опроса Chatbot не работает должным образом, я получаю ошибку сегментации в обработчике потоков, я использовал gdb, чтобы увидеть больше вещей, и вот что я получил:

Thread 4 "St3veB0t" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff67c2700 (LWP 5957)]
0x0000555555557243 in poll_handler ()
(gdb) bt
#0  0x0000555555557243 in poll_handler ()
#1  0x00007ffff7bbd6db in start_thread (arg=0x7ffff67c2700)
    at pthread_create.c:463
#2  0x00007ffff78e688f in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Функция poll_handler() это:

void * poll_handler(void * args)
{
    FILE * fp;
    struct VoteData  vote;
    struct PollHandlerData * data = (struct PollHandlerData *)args;
    int res;
    char * string = (char *)malloc(sizeof(char)*MAX_BUFFER);


    sleep(60);
    *data->status = 0;    
    *data->vote_count = 0;

    if(!(fp = fopen("polls/votes.txt", "r")))
    {
        fprintf(stderr, "\nError in reading file\n");
         if(!(fp = fopen("polls/votes.txt", "w+")))
         {
            fprintf(stderr, "\nError in creating file\n");
            exit(EXIT_FAILURE);
         }
    }

    vote = GetMostVote(fp);

    strcpy(string, "PRIVMSG #st3ver0nix : Polling terminated, the majority voted: ");
    strcat(string, vote.word);
    strcat(string, "\r\n");

     do{
        res = write(data->sock, string, strlen(string));
    }while(res < strlen(string));

    fclose(fp);
    free(string);
    pthread_exit(NULL);
}

Функция, создающая поток, выглядит следующим образом:

void CreatePoll(int sock, char * message, char * poll_name, int * status, int * vote_count)
{
    pthread_t tid;
    struct PollHandlerData * data = (struct PollHandlerData *)malloc(sizeof(struct PollHandlerData));
    char * name = (char *)malloc(sizeof(char)*MAX_BUFFER);


    GetPollName(message, name);
    sscanf(name, "%s", poll_name);

    data->sock = sock;
    data->status = status;
    sscanf(poll_name, "%s", data->name);

    pthread_create(&tid, NULL, poll_handler, (void *)data);
    pthread_detach(tid);

    free(name);
}

Структуры PollHandlerData и VoteData имеют следующую форму:

struct PollHandlerData
{
    int sock;
    char name[128];
    int * status;
    int * vote_count;
};

struct VoteData
{
    char word[128];
    int freq;
};

Я действительно не знаю, что не так в моем коде.Я использую POSIX pthreads.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация о коде.

1 Ответ

0 голосов
/ 12 февраля 2019

В соответствии с наблюдением в poll_handler() выполняется назначение потока для vote_count, создающего этот сбой:

*data->vote_count = 0;

В функции CreatePoll() до создания указателя потока vote_count внутри *Переменная 1008 * не выделена или не указывает на какой-либо действительный указатель, поскольку для переменной data делается только malloc, и она будет иметь любое значение мусора.Таким образом, происходит сбой в poll_handler() при доступе к недопустимому указателю.

примечание: vote_count будет иметь значение мусора, если это допустимый указатель для процесса, это может не вызвать сбой процесса.

...