«Недопустимое чтение размера 8» - Вальгринд. Попытка заполнить структуру данными из другой структуры - PullRequest
1 голос
/ 11 июня 2019

При выполнении проверок Valgrind я получаю «Недопустимое чтение размера 8», которое указывает на использование memcpy. Поле назначения является пустой неинициализированной структурой. Источник - это та же структура, которая является членом другой структуры.

Т.е. Destination = Bar, Source = Foo-> Bar.

Я предполагаю, что проблема связана с размером arg в memcpy. Я пытался использовать sizeof (Foo-> Bar), sizeof (Bar) и sizeof (Bar_s).

В шапке:

struct Foo_s
{
  Bar_t payload;
  //other structs and variables
};

typedef struct
{
    uint64_t timestamp;
    uint16_t id;
} Bar_t;

В файле c:

//Foo_s is passed into the function already populated, let's call it foo_data
Bar_t payload_data;

memcpy(&payload_data, &(foo_data->payload_data), sizeof(foo_data->payload_data));

Я получаю ожидаемое поведение, однако Вальгринду, похоже, не нравится, как это делается.

Вот ошибка:

Thread 36 function_name:47/101:
==774== Invalid read of size 8
==774==    at 0x1C1E59: function_name (in /path/to/exe)
==774==    by 0x189065: another_function (in /path/to/exe)
==774==    by 0x5D544A3: another_function2 (pthread_create.c:456)
==774==  Address 0x40bb6b8 is on thread 11's stack
==774==  1896 bytes below stack pointer

1 Ответ

1 голос
/ 11 июня 2019

Сообщение valgrind предполагает, что:

  • в потоке 11 вы создали Foo_s как локальную переменную, т.е. в стеке
  • вы создали новый поток, поток 36, передавая указатель на эту переменную
  • поток 36 пытается прочитать данные из этого указателя
  • но поток 11 уже «покинул» функцию, в которой вы создали переменную, поэтому данные, которые поток 36 пытается прочитать, уже недействительны

Случайно вы все еще получаете действительные результаты при запуске программы, потому что эти данные еще ничего не перезаписали.

...