Lo standard C ++ è rotto in modi importanti. Sfortunatamente, anziché proteggere gli utenti da questi problemi, gli sviluppatori di GCC hanno scelto di utilizzare comportamenti indefiniti come scusa per implementare ottimizzazioni marginali, anche quando è stato chiaramente spiegato loro quanto sia dannoso.
Qui una persona molto più intelligente di quanto spieghi in dettaglio. (Sta parlando di C ma la situazione è la stessa lì).
Perché è dannoso?
La semplice ricompilazione del codice sicuro funzionante in precedenza con una versione più recente del compilatore può introdurre vulnerabilità della sicurezza . Mentre il nuovo comportamento può essere disabilitato con un flag, ovviamente i makefile esistenti non hanno quel flag impostato. E poiché non viene prodotto alcun avviso, per lo sviluppatore non è ovvio che il comportamento precedentemente ragionevole sia cambiato.
In questo esempio, lo sviluppatore ha incluso un controllo per l'overflow di numeri interi, utilizzando assert
, che terminerà il programma se viene fornita una lunghezza non valida. Il team GCC ha rimosso il controllo sulla base del fatto che l'overflow di numeri interi non è definito, pertanto è possibile rimuovere il controllo. Ciò ha comportato la ri-vulnerabilità delle istanze reali di questa base di codice dopo che il problema è stato risolto.
Leggi tutto. È abbastanza per farti piangere.
OK, ma per quanto riguarda questo?
Molto tempo fa, c'era un idioma abbastanza comune che era simile a questo:
OPAQUEHANDLE ObjectType::GetHandle(){
if(this==NULL)return DEFAULTHANDLE;
return mHandle;
}
void DoThing(ObjectType* pObj){
osfunction(pObj->GetHandle(), "BLAH");
}
Quindi il linguaggio è: se pObj
non è null, si utilizza l'handle che contiene, altrimenti si utilizza un handle predefinito. Questo è incapsulato nella GetHandle
funzione.
Il trucco è che chiamare una funzione non virtuale in realtà non fa alcun uso del this
puntatore, quindi non vi è alcuna violazione di accesso.
Ancora non capisco
Esiste molto codice scritto in questo modo. Se qualcuno semplicemente lo ricompila, senza cambiare linea, ogni chiamata a DoThing(NULL)
è un bug che si arresta in modo anomalo - se sei fortunato.
Se non sei fortunato, le chiamate a bug che si arrestano in modo anomalo diventano vulnerabilità di esecuzione remota.
Questo può accadere anche automaticamente. Hai un sistema di compilazione automatizzato, giusto? L'aggiornamento all'ultimo compilatore è innocuo, giusto? Ma ora non lo è - non se il tuo compilatore è GCC.
OK, diglielo!
Gli è stato detto. Lo stanno facendo nella piena consapevolezza delle conseguenze.
ma perché?
Chi puo 'dirlo? Forse:
- Apprezzano la purezza ideale del linguaggio C ++ rispetto al codice reale
- Credono che le persone dovrebbero essere punite per non aver seguito lo standard
- Non hanno comprensione della realtà del mondo
- Stanno ... introducendo dei bug di proposito. Forse per un governo straniero. Dove vivi? Tutti i governi sono stranieri nella maggior parte del mondo e la maggior parte sono ostili ad alcuni del mondo.
O forse qualcos'altro. Chi puo 'dirlo?