我正在一个相当大的项目上运行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;
};```
And valgrind gives the following error:
==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)
The problem is, there's no code at line 601.
I'm pretty new with valgrind, so if it's something silly please let me know.
Thanks!
第601行没有代码。
当然,有一个功能主体的开口撑杆。
通常,编译器将为非内联函数生成一个序言。这是一段代码,用于设置函数的工作空间,通常可以保存调用方的堆栈帧地址,并为自动局部变量保留新的地址。
请注意,这是实现细节,不是语言的一部分。
Valgrind会告诉您所写的地址在线程的堆栈上,所以堆栈可能有问题。从显示的信息中确实无法分辨。
您可以做的是:查看是否可以从valgrind中获取更多信息(影响堆栈大小,布局,链长的选项),反汇编您的函数以确切了解该序幕中正在发生的事情,除尝试使用消毒剂版本外, valgrind等