Il 2020-11-29 01:11 Sabrewolf ha scritto:
Il 28/11/20 17:47, Marco Bodrato ha scritto:Le variabili non inizializzate, non sono un bug se il loro valore non viene usato :-)Ma anche no :)
int f(const char *s, int *p){ return (s && atoi(s)%2) ? 12345 : (*p = 54321)%1; } int main(int argc, const char **argv){ int no_init; if(argc > 1){ int rval = f(*(argv+1), &no_init); printf("No init but always 12345 or 54321 eheh: %d\n", (rval) ? rval : no_init); } return 0; }
A parte che se si scrive codice così, il bug non c'è ancora ma spunterà presto, appena qualcuno proverà a metterci mano :-)
Comunque non vedo il punto, in questo codice il valore della variabile no_init viene usato solo se è stato inizializzato dandogli un valore, altrimenti rimane non inizializzata e non usata. Infatti valgrind non fa una piega:
$ valgrind -q ./prova 2 No init but always 12345 or 54321 eheh: 54321 $ valgrind -q ./prova 1 No init but always 12345 or 54321 eheh: 12345
Tra l'inizializzazione e l'uso ci potrebbe essere di mezzo un assegnamento ;)
Certo, se prima di usarne il valore, lo assegni, allora la variabile non è più non inizializzata. Se volevi solo dire questo, ti sarebbe bastato il seguente codice come esempio, no?
int main() { int a; a = 0; return a; }Tieni conto che nei vecchi standard C, non era possibile dare un valore alle variabili contestualmente alla dichiarazione, non potevi scrivere "int uno = 1;". Quindi ci sono tantissime dichiarazioni di variabili tipo "int a;" che non assegnano alcun valore. È importante che il valore non venga usato, prima di essere in qualche modo definito, ma di certo nessuno dice che è necessario faro all'atto della dichiarazione della variabile.
Mi permetto di dire che il mio esempio con una semplice variabile intera nella quale il valore di alcuni bit è ben definito e il valore di altri no... mi sembrava un po' più raffinato :-) Anche perché l'oggeto di questa discussione mette al centro valgrind, che in quell'esempio si comporta in maniera tutt'altro che banale.
Ĝis, m