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 pObjnon è null, si utilizza l'handle che contiene, altrimenti si utilizza un handle predefinito. Questo è incapsulato nella GetHandlefunzione.
Il trucco è che chiamare una funzione non virtuale in realtà non fa alcun uso del thispuntatore, 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?