mercoledì 26 febbraio 2014

Lo style puo' evitare bug?

Sono state spese molte parole sull'incidente di sicurezza della verifica dei certificati Apple in iOS, risolto tempestivamente con un aggiornamento dell'iOS da parte della casa madre (si veda qui e anche qui).
Il bug era, come spesso accade, banale: uno statement di troppo in una catena di "if" che causava l'interruzione della logica di valutazione dei condizionali. In pratica:

if ( condition 1 )
  goto fail;
if ( condition 2 )
  goto fail;
  goto fail; // <<< disaster!!!!!!
if ( condition 3 )
  goto fail;


fail:
  // something nasty happenend


Si potrebbe dire che era necessario maggiore testing, che si dovrebbero usare le parentesi di blocco per ogni condizionale, che non si dovrebbero usare i goto....ma secondo me la cosa principale che ha generato il bug nel codice in oggetto e' stata la mancanza dell'uso degli "else". Le condizioni in esame erano da considerarsi logicamente correlate, ossia:


if ( condition 1 )
  goto fail;
else if ( condition 2 )
  goto fail;
  goto fail;
else if ( condition 3 )
  goto fail;

che avrebbe generato un errore di compilazione per un "else" spoglio. Con questo non voglio dire che il compilatore deve essere usato per trovare gli errori, per quello ci sono i test. Ad ogni modo il bug e' emerso da un semplice problema di code-style e non di logica. Ancora meglio sarebbe stato scrivere:

if ( condition 1
    || condition 2
    || condition 3 )
    goto fail;

che avrebbe "logicamente" correlato tutte le condizioni di fallimento.
Questo bug rappresenta un esempio di come un code-style errato possa portare facilmente a errori banali, e si noti ancora una volta che il code style da adottare in questo caso non era tanto l'uso delle parentesi di blocco ma l'unione (con else o in un solo if) delle condizioni da testare.
E si noti anche che non sempre il compilatore e' in grado di segnalare il "code-unreachable": come riportato qui  GCC non implementa sempre questa funzione mentre CLANG la tiene disabilitata in default.

Nessun commento: