[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Migliorare Debian e il software libero: trovare bug con valgrind e scrivere le patch



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


Reply to: