Il progetto LLVM sviluppa la gestione sicura del buffer in C++

Gli sviluppatori del progetto LLVM hanno proposto una serie di modifiche volte a rafforzare la sicurezza dei progetti C++ mission-critical e fornire un mezzo per eliminare gli errori causati dai sovraccarichi del buffer. Il lavoro si concentra su due aree: fornire un modello di sviluppo che consenta di lavorare in sicurezza con i buffer e lavorare sul rafforzamento della sicurezza della libreria di funzioni standard libc++.

Il modello di programmazione sicura proposto per C++ prevede l'utilizzo delle classi fornite dalla libreria standard quando si lavora con i buffer invece di manipolare semplici puntatori. Ad esempio, si propone di utilizzare le classi std::array, std::vettore e std::span, che verranno aggiunte con un controllo in fase di esecuzione per la memoria allocata fuori dai limiti.

Per combattere le pratiche di programmazione pericolose in clang, si propone di emettere avvisi del compilatore per tutte le operazioni aritmetiche dei puntatori, simili agli avvisi linter di clang-tidy quando si utilizza il flag "cppcoreguidelines-pro-bounds-pointer-arithmetic", il cui supporto apparirà in la versione LLVM 16. Per abilitare tali avvisi, verrà aggiunto un flag separato a clang, che non è attivo per impostazione predefinita.

Si prevede di implementare una modalità di protezione avanzata opzionale in libc++ che, se abilitata, rileverà alcune situazioni che portano a comportamenti indefiniti in fase di esecuzione. Ad esempio, nelle classi std::span e std::vettore verrà monitorato un accesso fuori limite, nel qual caso il programma andrà in crash. Gli sviluppatori ritengono che l'aggiunta di tali modifiche manterrà libc++ conforme agli standard C++, poiché la scelta di come gestire i casi di comportamento indefinito spetta agli sviluppatori della libreria, che potrebbero, tra le altre cose, interpretare il comportamento indefinito come un arresto anomalo che richiede l'intervento del sistema. programma per uscire.

I controlli di runtime in libc++ sono pianificati per essere divisi in categorie che possono essere incluse individualmente. Alcuni dei controlli suggeriti che non comportano operazioni più complesse o modifiche ABI sono già implementati nella modalità provvisoria di libc++.

Inoltre, si prevede di preparare un toolkit per la correzione del codice, che consenta di sostituire variabili con puntatori nudi sui contenitori e applicare gestori alternativi in ​​situazioni in cui il contenitore non può sostituire direttamente il puntatore (ad esempio, il "if (array_pointer)" può essere convertito in "if (span.data ()"). Le modifiche possono essere applicate non solo alle variabili locali, ma anche ai parametri di tipo con puntatori.

Fonte: opennet.ru

Aggiungi un commento