C указатель на указатель и очередь - PullRequest
0 голосов
/ 30 января 2020

У меня есть метод, который принимает указатель на указатель

typedef struct message_struct_t {
  struct mystruct_t **obj;  //not sure if this correct
  char name[50];
};



int server(mystruct _t **obj) {
   //i am able to push this to a queue
   //but first i store this in my temp struct
   message_struct_t *message = malloc(sizeof(message_struct_t));
   message->obj = obj;
   message->name = "Jaime";
   myqueue_enqueue(message);

   //some mutex and locking mechanism here
   for(int i = 0; i < num_threads; i++)
      pthread_create(&threads[i], NULL, send_message, NULL);
}

Мне нужно получить этот объект и передать его методу, который я буду обрабатывать в пуле потоков

   int send_message() {
       //i check and there is an item in my queue, but when i try to assign it to a new struct for 
       //handling i get errors
       struct message_struct *received = malloc(sizeof(message_struct)); //ERROR HERE
       printf("did I get here ? \n", received->name"); //ERROR

       free(received);
   }

ошибка, которую я получаю, это

  ==20730==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61d0000102b0 at pc 0x55bab7c01cf5 bp 0x7f4d8a2fe980 sp 0x7f4d8a2fe0f8 
    READ of size 2089 at 0x61d0000102b0 thread T1
        #0 0x55bab7c01cf4 in printf_common(void*, char const*, __va_list_tag*) (/project_main+0x5ccf4)

0x61d0000102b0 is located 0 bytes to the right of 2096-byte region [0x61d00000fa80,0x61d0000102b0)
allocated by thread T1 here:
    #0 0x55bab7c6c7b0 in malloc 

in printf_common(void*, char const*, __va_list_tag*)
Shadow bytes around the buggy address:
  0x0c3a7fffa000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
  0x0c3a7fffa010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
  0x0c3a7fffa020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
  0x0c3a7fffa030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
  0x0c3a7fffa040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
=>0x0c3a7fffa050: 00 00 00 00 00 00[fa]fa fa fa fa fa fa fa fa fa
  0x0c3a7fffa060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa    
  0x0c3a7fffa070: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa    
  0x0c3a7fffa080: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa    
  0x0c3a7fffa090: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa    
  0x0c3a7fffa0a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa    
Shadow byte legend (one shadow byte represents 8 application bytes): 
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb

Теперь я новичок в C и, возможно, где-то допускаю какую-то очевидную ошибку, я был бы признателен за совет относительно того, где я могу назначить неправильные значения (возможно, указатели? ).

1 Ответ

1 голос
/ 30 января 2020

Ваш send_message должен выглядеть следующим образом:

void *send_message(void *args) {
    struct message_struct *received  = *((struct message_struct *) args);
    // ....
    free(received );
}

Если вы не можете изменить прототип send_message, вам придется обернуть его внутри void * func(void *args) каким-либо образом , что Я считаю, что было бы слишком сложно поддерживать состояния для полученного сообщения.

Кроме того, вам необходимо убедиться, что вы правильно освободили полученный ресурс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...