I ran valgrind
一些代码如下:
valgrind --tool=memcheck --leak-check=full --track-origins=yes ./test
它返回以下错误:
==24860== Conditional jump or move depends on uninitialised value(s)
==24860== at 0x4081AF: GG::fl(M const&, M const&) const (po.cpp:71)
==24860== by 0x405CDB: MO::fle(M const&, M const&) const (m.cpp:708)
==24860== by 0x404310: M::operator>=(M const&) const (m.cpp:384)
==24860== by 0x404336: M::operator<(M const&) const (m.cpp:386)
==24860== by 0x4021FD: main (test.cpp:62)
==24860== Uninitialised value was created by a heap allocation
==24860== at 0x4C2EBAB: malloc (vg_replace_malloc.c:299)
==24860== by 0x40653F: GODA<unsigned int>::allocate_new_block() (goda.hpp:82)
==24860== by 0x406182: GODA<unsigned int>::GODA(unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) (goda.hpp:103)
==24860== by 0x402A0E: M::init(unsigned long) (m.cpp:63)
==24860== by 0x403831: M::M(std::initializer_list<unsigned int>, MO const*) (m.cpp:248)
==24860== by 0x401B56: main (test.cpp:31)
所以第71行有错误。太好了。以下是到第 71 行的行:po.cpp
(第 71 行是最后一行):
DEG_TYPE dtk = t.ord_deg();
DEG_TYPE duk = u.ord_deg();
bool searching = dtk == duk;
NVAR_TYPE n = t.nv();
NVAR_TYPE k = 0;
for (/* */; searching and k < n; ++k) { // this is line 71
OK, so which第71行的值未初始化?
- 当然不是
k
;
- 我手动检查了(=“单步执行
gdb
") that t
的构造函数初始化返回的值t.nv()
,所以当然不是n
(实际上n
设置为 6,正确的值);
-
searching
是由dtk
and duk
,但我也手动检查过t
's and u
的构造函数初始化返回的值.ord_deg()
(实际上两者dtk
and duk
设置为 3,正确的值)。
我在这里完全不知所措。有什么选项可以告诉我们valgrind
报告哪个精确值它认为未初始化?
Update
回答一个问题,这里是第 61 行test.cpp
:
M s { 1, 0, 5, 2, 0 };
因此它使用初始化列表来构造。这是构造函数:
M::M(
initializer_list<EXP_TYPE> p, const MO * ord
) {
common_init(ord);
init_e(p.size());
NVAR_TYPE i = 0;
last = 0;
for (
auto pi = p.begin();
pi != p.end();
++pi
) {
if (*pi != 0) {
e[last] = i;
e[last + 1] = *pi;
last += 2;
}
++i;
}
ord->set_data(*this);
}
这是类中的数据,添加了显示其初始化位置的注释:
NVAR_TYPE n; // init_e()
EXP_TYPE * e; // common_init()
NVAR_TYPE last; // common_init()
DEG_TYPE od; // common_init(), revised in ord->set_data()
const MO * o; // common_init()
MOD * o_data; // common_init(), revised in ord->set_data()