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