2010-04-21 16 views
7

Estoy tratando de rastrear una segfault con valgrind. Me sale el siguiente mensaje de valgrind:Valgrind dice "asignación de pila", digo "asignación de pila"

==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) 

Sin embargo, aquí está la línea en cuestión:

/* 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__); 
    } 

Lo que da? Pensé que cualquier llamada a malloc o calloc asignó un montón de espacio; no hay otra variable asignada aquí, ¿verdad? ¿Es posible que haya otra asignación (la asignación de pila ofensiva) que no estoy viendo?

EDIT: Mi sospecha actual es una matriz asignada por pila: declaro un puntero a double (pila), luego le asigno el resultado de una función que devuelve double *. Luego lo transfiero a un lugar previamente asignado.

No puedo memmove, memcpy o asignar una variable de pila, entonces espero que persista, ¿o sí?

+0

¿Podemos ver un código más? Tal vez age_dep.c – eyalm

Respuesta

-1

he encontrado desde que este error valgrind

Conditional jump or move depends on uninitialised value(s) 

sucede todo el tiempo y no es el origen del error. Parece ser una pista falsa en la mayoría de los casos que he encontrado desde que publiqué esta pregunta.

+1

Joel, no, nunca es una pista falsa, y siempre debes arreglarlo. Es potencialmente un error extremadamente serio (aunque ocasionalmente inofensivo). –

0

posible razón:
se define como age_dep_data->mtabledouble* pero debe ser double** ser una matriz de matrices

+0

¿Es lo que estoy haciendo? Asigno una matriz de tamaño n * (tamaño de un puntero a doble), y luego, para cada puntero en esa matriz, asigno una matriz de tamaño m * (tamaño de un doble). ¿Debo usar sizeof (double **) en la llamada a malloc()? –

+1

no, tu código está okey; no podemos ver la declaración de age_dep_data-> mtable - debe declararse como doble ** –

+0

Se declara como doble ** dentro de una estructura (también asignada dinámicamente). –

Cuestiones relacionadas