Я запустил 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, поэтому какое значение строки 71 не инициализировано?
- определенно нет
k
; - Я вручную проверил (= "пошаговое выполнение
gdb
"), что конструктор t
инициализирует значение, возвращаемое t.nv()
, поэтому, безусловно,не n
(на самом деле n
установлено на 6, правильное значение); searching
определяется dtk
и duk
, но я также вручную проверил, что t
'Конструкторы s и u
инициализируют значения, возвращаемые .ord_deg()
(на самом деле для dtk
и duk
установлено значение 3, правильное значение).
I 'м в полной растерянности здесь.Есть ли какая-нибудь опция, которая сообщит valgrind
сообщить , какое точное значение оно считает неинициализированным?
Обновление
В ответ на один вопросВот строка 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()