valgrind 在使用 std::make_shared 和虚拟继承时报告的未初始化值
Uninitialized value reported by valgrind when using std::make_shared and virtual inheritance
我有以下(过于简化的)例子,valgrind抱怨未初始化的内存:
struct B {
virtual ~B() {}
};
struct BB : public virtual B {
virtual ~BB() = default;
};
struct BBB : public virtual B {
virtual ~BBB() {}
};
struct X : public virtual B, public virtual BBB/*, public virtual BB*/ {
X() { a = 0.0; b = 0.0; c = false;}
double a;
double b;
bool c;
};
并像这样使用它:
auto y = std::make_shared<X>();
HexDump(y.get(), sizeof(X)); // simple hexdump function - similar to gtest output - in real application this is an "uninteresting mock call" where gtest prints binary representation of an object using its size
这里的工作示例:http://coliru.stacked-crooked.com/a/91a54b697010d84b
使用 gcc 4.9.2 c++14 标志编译它并运行 valgrind,我得到以下输出:
==58887== Conditional jump or move depends on uninitialised value(s)
==58887== at 0x93A065: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x95E2DA: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x9441DC: vsprintf_l (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x93464C: sprintf (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x100165310: HexDump(void*, unsigned int) (in xxxx)
==58887== Use of uninitialised value of size 8
==58887== at 0x93A69B: __ultoa (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x93A0CC: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x95E2DA: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x9441DC: vsprintf_l (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x93464C: sprintf (in /usr/lib/system/libsystem_c.dylib)
==58887== by 0x100165310: HexDump(void*, unsigned int) (in xxxxx)
这是由于编译器在对象末尾添加了填充(请注意"跨越"8 个字节的布尔值)?如果是这样 - 可以做些什么来使检查不失败?
您的示例是未定义的行为,因为 X 不是 POD。因此,以这种方式开始从随机字节读取是非法的。如果要转储对象,请实际转储对象,并且不要假装转储字节是一回事。
这是真的,无论是gmock而不是你做倾倒。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- Android NDK传感器向事件队列报告奇怪的间隔
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 使用std::source_location报告错误的最佳实践
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 当用户超过按钮点击限制时报告
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 使用调试/崩溃报告将应用程序部署到客户端
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- valgrind 在使用 std::make_shared 和虚拟继承时报告的未初始化值
- Eclipse报告了有效cpp继承的错误