Gli sviluppatori del progetto LLVM hanno proposto una serie di modifiche volte a migliorare la sicurezza dei progetti critici in linguaggio C++ e a fornire strumenti per escludere errori causati da accessi oltre i limiti consentiti dei buffer. Il lavoro si concentra su due direzioni: fornire un modello di sviluppo che consenta di lavorare in modo sicuro con i buffer e svolgere attività 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 durante il lavoro con i buffer, invece di manovrare puntatori 'nudi'. Ad esempio, si suggerisce di utilizzare le classi std::array, std::vector e std::span, alle quali sarà aggiunto un controllo sugli accessi oltre i limiti della memoria allocata, eseguito durante il runtime.
Per combattere pratiche di programmazione pericolose, clang prevede di emettere 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 arriverà con la versione LLVM 16. Per abilitare tali avvisi in clang sarà aggiunto un flag separato, non attivo di default.
In libc++ si prevede di implementare una modalità opzionale di protezione avanzata, alla quale, se attivata, durante l'esecuzione saranno rilevate alcune situazioni che portano a un comportamento indefinito. Ad esempio, nelle classi std::span e std::vector sarà monitorato l'accesso oltre l'area di memoria allocata; qualora venga rilevato tale accesso, il programma si interromperà in modo anomalo. Gli sviluppatori ritengono che l'aggiunta di tali modifiche manterrà libc++ conforme agli standard C++, poiché la scelta del metodo di trattamento dei casi di comportamento indefinito spetta agli sviluppatori della libreria, che possono anche considerare il comportamento indefinito come un errore che richiede l'interruzione del programma.
Le verifiche eseguite durante l'esecuzione in libc++ si prevede siano suddivise in categorie che potranno essere abilitate singolarmente. Alcune delle verifiche proposte, che non portano a complicazioni nelle operazioni o a modifiche dell'ABI, sono già implementate nell'ambito della modalità sicura di libc++ (safe mode).
Inoltre, si prevede di preparare strumenti per la modifica del codice, che consentano di sostituire le variabili con puntatori nudi con contenitori e di applicare gestori alternativi in situazioni in cui il contenitore non può sostituire direttamente il puntatore (ad esempio, la struttura "if(array_pointer)" può essere trasformata in "if(span.data())"). Le modifiche possono essere applicate non solo a variabili locali, ma anche a parametri di tipo con puntatori.
Fonte: opennet.ru
