Валгринд говорит "выделение стека", я говорю " выделение кучи"
Я пытаюсь проследить сегфолт с вальгриндом. Я получаю следующее сообщение с Valgrind:
==3683== Conditional jump or move depends on uninitialised value(s)
==3683== at 0x4C277C5: sparse_mat_mat_kron (sparse.c:165)
==3683== by 0x4C2706E: rec_mating (rec.c:176)
==3683== by 0x401C1C: age_dep_iterate (age_dep.c:287)
==3683== by 0x4014CB: main (age_dep.c:92)
==3683== Uninitialised value was created by a stack allocation
==3683== at 0x401848: age_dep_init_params (age_dep.c:131)
==3683==
==3683== Conditional jump or move depends on uninitialised value(s)
==3683== at 0x4C277C7: sparse_mat_mat_kron (sparse.c:165)
==3683== by 0x4C2706E: rec_mating (rec.c:176)
==3683== by 0x401C1C: age_dep_iterate (age_dep.c:287)
==3683== by 0x4014CB: main (age_dep.c:92)
==3683== Uninitialised value was created by a stack allocation
==3683== at 0x401848: age_dep_init_params (age_dep.c:131)
Однако вот оскорбительная строка:
/* allocate mating table */
age_dep_data->mtable = malloc (age_dep_data->geno * sizeof (double *));
if (age_dep_data->mtable == NULL)
error (ENOMEM, ENOMEM, nullmsg, __LINE__);
for (int j = 0; j < age_dep_data->geno; j++)
{
131=> age_dep_data->mtable[j] = calloc (age_dep_data->geno, sizeof (double));
if (age_dep_data->mtable[j] == NULL)
error (ENOMEM, ENOMEM, nullmsg, __LINE__);
}
Что дает? Я думал, что любой вызов malloc или calloc выделяет пространство кучи; здесь нет никакой другой переменной, верно? Возможно ли, что происходит еще одно распределение (оскорбительное распределение стека), которое я не вижу?
EDIT: мое текущее подозрение-это массив, выделенный стеком: я объявляю указатель на double (stack), затем назначьте ему результат функции, которая возвращает double *. Затем я переношу его на заранее выделенное место.
Я не могу memmove, memcpy или назначить переменную стека, а затем надеяться, что она сохранится, не так ли?
3 ответа:
Я не знаю, в чем проблема, но
-track-origins=yes
Может помочь вам получить дополнительную информацию о том, на что он жалуется; смотрите эту запись в блоге для получения подробной информации: http://blog.mozilla.com/nnethercote/2009/02/27/eliminating-undefined-values-with-valgrind-the-easy-way/