Les développeurs du projet LLVM ont proposé une série de modifications visant à renforcer la sécurité des projets critiques en C++ et à fournir des moyens d'exclure les erreurs causées par les débordements de mémoire. Le travail est concentré sur deux axes : la fourniture d'un modÚle de développement permettant de travailler en toute sécurité avec des buffers, et l'amélioration de la protection de la bibliothÚque standard des fonctions libc++.
Le modÚle de programmation sécurisée proposé pour le C++ implique l'utilisation des classes fournies par la bibliothÚque standard lors de la manipulation des buffers plutÎt que de travailler avec des pointeurs nus. Par exemple, il est suggéré d'utiliser les classes std::array, std::vector et std::span, qui seront enrichies d'une vérification des débordements de mémoire réalisée au moment de l'exécution.
Pour lutter contre les pratiques de programmation dangereuses, clang propose d'émettre des avertissements du compilateur pour toutes les opérations arithmétiques avec des pointeurs, similaires aux avertissements du linter clang-tidy, qui sont générés lors de l'utilisation du drapeau « cppcoreguidelines-pro-bounds-pointer-arithmetic », dont le support sera ajouté dans la version LLVM 16. Un drapeau distinct sera ajouté à clang pour activer ces avertissements, celui-ci n'étant pas actif par défaut.
Dans libc++, un mode optionnel de protection renforcĂ©e est prĂ©vu, qui, une fois activĂ©, interceptera certaines situations menant Ă un comportement indĂ©fini lors de l'exĂ©cution. Par exemple, dans les classes std::span et std::vector, l'accĂšs en dehors de la zone de mĂ©moire allouĂ©e sera surveillĂ©, et en cas de dĂ©tection, le programme se terminera de maniĂšre inattendue. Les dĂ©veloppeurs estiment que l'ajout de telles modifications prĂ©servera la conformitĂ© de libc++ aux normes C++, car le choix de la mĂ©thode de gestion des cas de comportement indĂ©fini revient aux dĂ©veloppeurs de la bibliothĂšque, qui peuvent Ă©galement considĂ©rer le comportement indĂ©fini comme une dĂ©faillance nĂ©cessitant l'arrĂȘt du programme.
Les vĂ©rifications effectuĂ©es lors de l'exĂ©cution dans libc++ sont prĂ©vues pour ĂȘtre classĂ©es en catĂ©gories pouvant ĂȘtre activĂ©es individuellement. Certaines des vĂ©rifications proposĂ©es, qui ne compliquent pas les opĂ©rations ou ne modifient pas l'ABI, ont dĂ©jĂ Ă©tĂ© mises en Ćuvre dans le cadre du mode sĂ©curisĂ© de libc++ (safe mode).
De plus, il est prĂ©vu de prĂ©parer des outils pour modifier le code, permettant de remplacer les variables avec des pointeurs bruts par des conteneurs et d'appliquer des gestionnaires alternatifs dans les situations oĂč le conteneur ne peut pas remplacer directement le pointeur (par exemple, la construction « if(array_pointer) » peut ĂȘtre transformĂ©e en « if(span.data()) »). Les ajustements peuvent s'appliquer non seulement aux variables locales, mais aussi aux paramĂštres de types avec des pointeurs.
Source : opennet.ru
