valgrind выдает ошибку при открытии функции скобки - PullRequest
0 голосов
/ 16 марта 2020

Я запускаю valgrind для довольно большого проекта.

Один из моих классов указывает на недопустимую запись, но он в месте без кода.

Детали и адреса памяти были изменены, чтобы защитить невинных.

У меня есть такая функция:

class thing{ 

int record(char *c, int i);

... };

int thing::record(char *c, int i)
{ /* line 601 is here */

static const char *x = __func__;

...

return 1;

};

И valgrind выдает следующую ошибку:

==xxx== Invalid write of size 8
==xxx==    at 0xx0FBF48: thing::record(char*, int) (thing.cpp:601)
==xxx==    by 0xx0FB32D: thing::open(std::string, char const*, bool, bool, bool) (thing.cpp:370)
==xxx==    by 0xxE8E02: thing::init() (thing.cpp:698)
==xxx==    by 0xx66AC4B: namespace::subnamespace::otherthing::run() (otherthing.cpp:653)
==xxx==    by 0xx3A53B: main (main.cpp:36)
==xxx==  Address 0xxffeb49958 is on thread 1's stack
==xxx==  in frame #0, created by thing::record(char*, int) (thing.cpp:601)

Проблема в том, в строке 601 нет кода. Я довольно новичок в valgrind, поэтому, если это что-то глупое, пожалуйста, дайте мне знать.

Спасибо!

1 Ответ

1 голос
/ 16 марта 2020

в строке 601 нет кода.

Конечно, есть открывающая фигурная скобка тела функции.

Обычно компилятор генерирует пролог для не встроенных функций. Это небольшой код, который устанавливает рабочее пространство функции, обычно сохраняя адрес фрейма стека вызывающей стороны и резервируя новый для автоматических c локальных переменных.

Обратите внимание, что это детали реализации, а не часть языка.

Valgrind сообщает вам, что записанный адрес находится в стеке потока, поэтому, возможно, что-то не так со стеком. Точно то, что невозможно сказать по показанной информации.

Что вы можете сделать: посмотрите, сможете ли вы получить больше информации от valgrind (опции, влияющие на размер стека, расположение, длину цепочки), разберите вашу функцию, чтобы увидеть точно что происходит в этом прологе, попробуйте использовать сборку sanitizer в дополнение к valgrind и т. д. c.

...