Le projet LLVM développe une gestion sécurisée des tampons en C++

Les développeurs du projet LLVM ont proposé un certain nombre de changements visant à renforcer la sécurité des projets C++ critiques et à fournir un moyen d'éliminer les erreurs causées par des dépassements de mémoire tampon. Le travail se concentre sur deux domaines : fournir un modèle de développement qui vous permet de travailler en toute sécurité avec des tampons et travailler sur le renforcement de la sécurité de la bibliothèque de fonctions standard libc++.

Le modèle de programmation sécurisé proposé pour C++ consiste à utiliser les classes fournies par la bibliothèque standard lorsque vous travaillez avec des tampons au lieu de manipuler des pointeurs nus. Par exemple, il est proposé d'utiliser les classes std::array, std::vector et std::span, qui seront ajoutées avec une vérification à l'exécution de la mémoire allouée hors limites.

Pour lutter contre les pratiques de programmation dangereuses dans Clang, il est proposé d'émettre des avertissements du compilateur pour toutes les opérations arithmétiques de pointeur, similaires aux avertissements linter de clang-tidy lors de l'utilisation de l'indicateur "cppcoreguidelines-pro-bounds-pointer-arithmetic", dont la prise en charge apparaîtra dans la version LLVM 16. Pour activer de tels avertissements, un indicateur distinct sera ajouté à clang, qui n'est pas actif par défaut.

Il est prévu d'implémenter un mode de protection renforcé facultatif dans la libc++, qui, lorsqu'il est activé, détectera certaines situations conduisant à un comportement indéfini au moment de l'exécution. Par exemple, dans les classes std::span et std::vector, un accès hors limites sera surveillé, auquel cas le programme plantera. Les développeurs pensent que l'ajout de tels changements maintiendra la libc++ conforme aux standards C++, puisque le choix de la manière de gérer les cas de comportement non défini appartient aux développeurs de la bibliothèque, qui peuvent, entre autres choses, interpréter un comportement non défini comme un crash nécessitant le programme pour quitter.

Il est prévu que les contrôles d'exécution dans libc++ soient divisés en catégories pouvant être incluses individuellement. Certaines des vérifications suggérées qui n'entraînent pas d'opérations plus complexes ou de modifications de l'ABI sont déjà implémentées dans le mode sans échec de la libc++.

De plus, il est prévu de préparer une boîte à outils pour corriger le code, permettant de remplacer les variables par des pointeurs nus sur les conteneurs et d'appliquer des gestionnaires alternatifs dans les situations où le conteneur ne peut pas remplacer directement le pointeur (par exemple, le "if (array_pointer)" La construction peut être convertie en « if (span.data () »). Les ajustements peuvent être appliqués non seulement aux variables locales, mais également aux paramètres de type avec des pointeurs.

Source: opennet.ru

Ajouter un commentaire