Il progetto LLVM sviluppa strumenti per lavorare in sicurezza con i buffer in C++.

Gli sviluppatori del progetto LLVM hanno proposto una serie di modifiche volte a migliorare la sicurezza dei progetti critici in C++ e a fornire strumenti per escludere errori causati dall'uscita dai limiti consentiti dei buffer. Il lavoro si concentra su due direzioni: fornire un modello di sviluppo che consenta di lavorare in sicurezza con i buffer e lavorare per rafforzare la protezione della libreria standard delle funzioni libc++.

Il modello di programmazione sicura proposto per C++ prevede l'uso delle classi fornite dalla libreria standard quando si lavora con i buffer, anziché manipolare puntatori grezzi. Ad esempio, si propone di utilizzare le classi std::array, std::vector e std::span, a cui sarà aggiunto un controllo dell'uscita dai limiti della memoria allocata, eseguito in fase di runtime.

Per contrastare le pratiche di programmazione pericolose in clang, si propone di generare avvisi del compilatore per tutte le operazioni aritmetiche con i puntatori, simili agli avvisi del linter clang-tidy, emessi utilizzando il flag "cppcoreguidelines-pro-bounds-pointer-arithmetic", il cui supporto sarà incluso nella versione LLVM 16. Per attivare questi avvisi in clang, sarà aggiunto un flag separato, disabilitato di default.

In libc++ è prevista l'implementazione di una modalità opzionale di protezione avanzata; quando attivata, durante l'esecuzione verranno catturate alcune situazioni che portano a comportamenti indefiniti. Ad esempio, nei classi std::span e std::vector verrà monitoraccesso oltre il limite dell'area di memoria allocata, il che causerà un arresto anomalo del programma. Gli sviluppatori ritengono che l'aggiunta di queste modifiche manterrà la conformità di libc++ agli standard C++, poiché la scelta del metodo di gestione dei casi di comportamento indefinito spetta agli sviluppatori della libreria, che possono anche interpretare il comportamento indefinito come un errore che richiede l'interruzione del programma.

Le verifiche eseguite in libc++ verranno suddivise in categorie che potranno essere incluse separatamente. Alcuni dei controlli proposti, che non complicano le operazioni o alterano l'ABI, sono già stati implementati nel contesto della modalità sicura di libc++ (safe mode).

Inoltre, è previsto lo sviluppo di strumenti per la correzione del codice che consentono di sostituire le variabili con puntatori nudi con contenitori e applicare gestori alternativi nelle situazioni in cui un contenitore non può sostituire direttamente un puntatore (ad esempio, la costruzione «if(array_pointer)» può essere trasformata in «if(span.data())»). Le correzioni possono essere effettuate non solo per le variabili locali, ma anche per i parametri di tipo con puntatori.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster