valgrind在打开函数括号时产生错误

问题描述 投票:0回答:1

我正在一个相当大的项目上运行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!


c++ valgrind
1个回答
1
投票

第601行没有代码。

当然,有一个功能主体的开口撑杆。

通常,编译器将为非内联函数生成一个序言。这是一段代码,用于设置函数的工作空间,通常可以保存调用方的堆栈帧地址,并为自动局部变量保留新的地址。

请注意,这是实现细节,不是语言的一部分。

Valgrind会告诉您所写的地址在线程的堆栈上,所以堆栈可能有问题。从显示的信息中确实无法分辨。

您可以做的是:查看是否可以从valgrind中获取更多信息(影响堆栈大小,布局,链长的选项),反汇编您的函数以确切了解该序幕中正在发生的事情,除尝试使用消毒剂版本外, valgrind等

© www.soinside.com 2019 - 2024. All rights reserved.