C++ valgrind在打开功能支架时产生错误

C++ valgrind在打开功能支架时产生错误,c++,valgrind,C++,Valgrind,我负责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; }; val

我负责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的新手,如果有什么傻事请告诉我

谢谢

第601行没有代码

当然有,有一个函数体的开始括号

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

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

Valgrind告诉您写入的地址在线程堆栈上,因此堆栈可能有问题。确切地说,从所显示的信息中不可能分辨出什么


您可以做的是:查看是否可以从valgrind获得更多信息(影响堆栈大小、布局、链长度的选项),分解您的函数以查看序言中到底发生了什么,尝试在valgrind之外使用消毒剂构建,等等。

请尝试创建一个示例来向我们展示。你确定
对象是有效的吗?其他地方没有堆栈损坏?您是否在启用优化的情况下编译?如果是这样的话,您可能想禁用它们,看看这是否有助于澄清问题。要找出问题可能是什么以及问题的来源,最好返回源代码管理签入日志,直到错误消失。无错误签入和下一个签入(增加了错误)之间有什么区别?对不起,不能做最小的重复性-项目太大,相互交织。没有优化,无法返回日志-这是遗留代码,在几年内保持不变,valgrind第一次在其上运行。i、 例如,生产中断。是否在某个地方调用了malloc()?使用sizeof(int)分配int*的可能性。