Mi sono perso nell'apertura di questo post su reddit.
In che modo if (sscanf(buf, "%i", &mode) != 1 || TRUE)
può essere riscritta in if (TRUE)
? Questo presuppone che il sscanf
non fallisca mai?
Mi sono perso nell'apertura di questo post su reddit.
In che modo if (sscanf(buf, "%i", &mode) != 1 || TRUE)
può essere riscritta in if (TRUE)
? Questo presuppone che il sscanf
non fallisca mai?
L'autore del codice chiama sscanf e quindi ignora il suo valore di ritorno assumendo che sia vero. Puoi sostituire il codice con 'if (TRUE)' a condizione che tu chiami prima sscanf.
Usando le tabelle di verità, puoi mostrare che restituirà sempre -EINVAL, quindi non hai nemmeno bisogno di
if (TRUE)
return -EINVAL;
potrebbe essere solo
return -EINVAL
FWIW, dal momento che non ho il contesto, questo è quasi certamente un bug.
(mode != 2 || mode != 1)
probabilmente avrebbe dovuto essere
(mode != 2 && mode != 1)
Penso che stia partendo dal presupposto che anche se sscanf non fallisce, non cura .
Poiché il risultato viene ignorato, non vedo affatto il punto di avere questo nel "se". Vorrei indovinare che la chiamata sscanf fosse originariamente a parte, quindi i dati di duff iniziarono ad arrivare (in buf ) e fare casino alla chiamata sscanf, quindi "|| TRUE" è stato aggiunto per sopprimere l'errore. Correzione classica, rapida e sporca.
Personalmente, preferirei vederlo rielaborato:
sscanf( buf, "%i", &mode ); /* buf may or may not contain a valid mode */
Ovviamente, l'elemento di dati indirizzato dalla modalità & potrebbe essere lasciato in uno stato incoerente - probabilmente un valore analizzato da buf , probabilmente no - ma questo codice non importa in alcun modo.
Sicuramente questo è un odore? L'uso di "OR true" in un'istruzione condizionale è un errore di lettura e non ha alcun valore funzionale.
if (statement OR true) {...} sarebbe meglio scritto come statement; {...}?
Leggi altre domande sui tag coding-style programming-practices