La tua supposizione sul fatto che il codice sia una perdita di sicurezza può o non può essere vera a seconda della lingua che stai utilizzando. Nel codice C potrebbe essere un problema (soprattutto perché in C un booleano è solo un int che è diverso da zero o zero) - ma nei linguaggi più tipicamente tipizzati (ad esempio controllo del tipo di runtime) se la passwordCheckvariabile è stata dichiarata come booleana, non c'è modo di assegnargli qualcos'altro. In effetti, tutto in un ifpredicato deve risolversi in un valore booleano, sia che si utilizzino gli operatori booleani sia che si utilizzi semplicemente il valore. Se sei riuscito ad avere un altro tipo di oggetto associato al passwordCheckruntime genererebbe un tipo di eccezione di cast illegale.
I costrutti if / else semplici sono molto più facili da leggere rispetto ai costrutti if / if e sono meno inclini a problemi involontari se qualcuno tenta di capovolgere il costrutto. Facciamo lo stesso esempio per un secondo:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Il significato delle clausole reciprocamente esclusive che si desidera eseguire sopra è perso. Questo è ciò che trasmette il costrutto if / else. Due rami di esecuzione reciprocamente esclusivi, in cui uno di essi funzionerà sempre. Questa è una parte importante della sicurezza: garantire che non ci sia modo di farlo letThemIndopo aver chiamato denyAccess.
Ai fini della chiarezza del codice e allo scopo di garantire che le sezioni critiche siano maggiormente protette, dovrebbero trovarsi all'interno della clausola primaria (la ifparte). Il comportamento predefinito non conforme dovrebbe essere nella clausola alternativa (la elseparte). Per esempio:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
NOTA: lavorando con lingue diverse, ho sviluppato un habbit di codifica che aiuta a evitare la domanda "che cosa succede se si tratta di una stringa?" In sostanza, è quello di mettere la costante al primo posto nell'espressione booleana. Ad esempio, invece di verificare, passwordCheck == falsesto verificando false == passwordCheck. Questo evita anche il problema di assegnazione accidentale possibile in C ++. Usando questo approccio, il compilatore si lamenterà se scrivo =invece di ==. In linguaggi come Java e C #, il compilatore tratterà l'assegnazione nella clausola if come un errore, ma C ++ lo accetterà felicemente. Ecco perché tendo anche a fare il controllo nullo con il nullprimo.
Se cambi sistematicamente le lingue, posizionare la costante per prima è molto utile. Tuttavia, nel mio team è contrario allo standard di codifica e il compilatore rileva comunque questi problemi. Può essere un duro habbit da rompere.