Questi 2 errori sono in arrivo con un elenco collegato/programma di lettura/strtok di file di basso livello.C: Valgrind: utilizzo del valore non inizializzato della dimensione 4 E Utilizzo del valore non inizializzato della dimensione 4
==10982== Use of uninitialised value of size 4
==10982== at 0x40C3899: strtok (strtok.S:197)
==10982== by 0x8048719: main (main.c:9)
==10982== Uninitialised value was created by a stack allocation
==10982== at 0x80487D2: buildList (functions.c:13)
==10982==
==10982== Use of uninitialised value of size 4
==10982== at 0x40C38C1: strtok (strtok.S:223)
==10982== by 0x8048719: main (main.c:9)
==10982== Uninitialised value was created by a stack allocation
==10982== at 0x80487D2: buildList (functions.c:13)
==10982==
==10982== Conditional jump or move depends on uninitialised value(s)
==10982== at 0x40C38C4: strtok (strtok.S:224)
==10982== by 0x8048719: main (main.c:9)
==10982== Uninitialised value was created by a stack allocation
==10982== at 0x80487D2: buildList (functions.c:13)
Ecco la funzione buildList
void buildList(int fdin, int lines)
{
char ara[4096];
int num;
double p;
read(fdin, ara, 4096);
char *nl = "\n";
char *ws = " ";
char *temp = strtok(ara, " ");
while(temp != NULL)
{
Stock *s = (Stock*)calloc(1, sizeof(Stock));
s->c.symbol = (char*)calloc(strlen(temp)+1, sizeof(char));
strcpy(s->c.symbol, temp);
temp = strtok(NULL, "\n");
s->c.name = (char*)calloc(strlen(temp)+1, sizeof(char));
strcpy(s->c.name, temp);
temp = strtok(NULL, "\n");
sscanf(temp, "%lf", &p);
temp = strtok(NULL, "\n");
s->price = p;
sscanf(temp, "%d", &num);
s->shares = num;
Node *n = (Node*)calloc(1, sizeof(Node));
n->data = s;
addOrdered(n);
temp = strtok(NULL, " ");
}
close(fdin);
}
non riesco a capire il motivo per cui si verifica questo errore. Da quello che ho letto è perché sto assegnando le cose a un char * da strtok senza assegnare loro alcun ricordo. Comunque è così che l'ho fatto in passato e penso che sia andato bene.
Qual è la riga 13 di functions.c? – aschepler
Sembra che a Valgrind manchi il fatto che 'ara' venga" inizializzato "da' read() '. Solo per i sorrisi, prova a mettere qualcosa come "memset (ara, 0, sizeof (ara))" proprio prima della lettura, e vedi se questo sopprime l'avvertimento. Se lo fa, rimuovilo e sappi che puoi tranquillamente ignorare l'avviso (o scoprire come far arrestare Valgrind). Ovviamente anche 'read()' potrebbe non funzionare, nel qual caso Valgrind è corretto. –
Non si fornisce la definizione di 'main', né si mostra l'input che sta causando il problema. Né si esegue alcun controllo degli errori in nessuna parte del codice precedente. Si prega di creare un [SSCCE] (http://sscce.org) che non ci richiede di indovinare! –