2010-04-21 11 views
7

Sto provando a tracciare un segfault con valgrind. Ricevo il seguente messaggio da valgrind:Valgrind dice "allocazione stack", dico "allocazione heap"

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

Tuttavia, ecco la riga incriminata:

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

Che cosa dà? Pensavo che qualsiasi chiamata a malloc o calloc assegnasse spazio nell'heap; non ci sono altre variabili allocate qui, giusto? È possibile che ci sia un'altra allocazione in corso (l'allocazione dello stack illecito) che non vedo?

EDIT: Il mio attuale sospetto è un array allocato allo stack: dichiaro un puntatore al doppio (stack), quindi assegna ad esso il risultato di una funzione che restituisce double *. Quindi lo memorizzo in un posto precedentemente assegnato.

Non riesco a memmove, memcpy o assegnare una variabile stack quindi spero che persisterà, posso?

+0

Possiamo vedere altro codice? Forse age_dep.c – eyalm

risposta

-1

Da allora ho scoperto che questo errore valgrind

Conditional jump or move depends on uninitialised value(s) 

accade tutto il tempo e non è la fonte dell'errore. Sembra essere una falsa pista nella maggior parte dei casi che ho incontrato da quando ho postato questa domanda.

+1

Joel, no, non è mai un'aringa rossa, e dovresti sempre sistemarlo. È potenzialmente un bug estremamente serio (anche se occasionalmente innocuo). –

0

possibile ragione:
si definisce come age_dep_data->mtabledouble* ma dovrebbe essere double** di essere un array di array

+0

E 'quello che sto facendo? Alloco una matrice di dimensione n * (la dimensione di un puntatore per raddoppiare), quindi per ogni puntatore di quell'array allineo una matrice di dimensione m * (dimensione di un doppio). Devo usare sizeof (double **) nella chiamata a malloc()? –

+1

no, il codice è okey; non possiamo vedere la dichiarazione di age_dep_data-> mtable - dovrebbe essere dichiarata come double ** –

+0

Viene dichiarata come double ** all'interno di una struttura (anche allocata dinamicamente). –