Udviklerne af LLVM-projektet har foreslået en række ændringer, der skal styrke sikkerheden i kritiske projekter skrevet i C++ og give værktøjer til at undgå fejl forårsaget af overskridelse af buffergrænser. Arbejdet fokuserer på to områder: at tilbyde en udviklingsmodel, der muliggør sikker arbejde med buffere, og at styrke beskyttelsen af standardbiblioteket libc++.
Den foreslåede model for sikker programmering i C++ indebærer brug af de klasser, der stilles til rådighed af standardbiblioteket, når man arbejder med buffere i stedet for at manipulere med rå pegere. For eksempel foreslås det at bruge klasserne std::array, std::vector og std::span, som vil blive udstyret med grænsekontrol for at forhindre overskridelse af tildelt hukommelse, udført under kørslen.
For at bekæmpe farlige programmeringsmetoder foreslås det i clang at generere advarsler fra compileren for alle aritmetiske operationer med pegere, ligesom advarsler fra linteren clang-tidy, der genereres ved brug af flaget 'cppcoreguidelines-pro-bounds-pointer-arithmetic', hvis støtte vil blive tilføjet i LLVM 16. For at aktivere disse advarsler vil der blive tilføjet et separat flag i clang, som ikke er aktivt som standard.
I libc++ planlægges implementeringen af en valgfri tilstand for forbedret beskyttelse, hvor visse situationer, der fører til ubestemt opførsel, vil blive fanget under kørslen. For eksempel vil klasserne std::span og std::vector overvåge adgangen uden for det tildelte hukommelsesområde, og hvis dette opdages, vil programmet blive afsluttet abrupt. Udviklerne mener, at tilføjelsen af sådanne ændringer vil holde libc++ i overensstemmelse med C++-standarderne, da valg af metode til håndtering af ubestemt opførsel ligger hos biblioteksudviklerne, som også kan fortolke ubestemt opførsel som et fejl, der kræver programafslutning.
De runtime-checks, der udføres i libc++, planlægges at blive opdelt i kategorier, som kan aktiveres individuelt. Nogle af de foreslåede checks, der ikke medfører kompleksitet i operationer eller ændringer i ABI, er allerede implementeret som en del af libc++'s sikre tilstand (safe mode).
Der er planlagt at udvikle værktøjer til korrektur af koden, der muliggør at erstatte variabler med nøgne pegere med containere og anvende alternative behandlere i situationer, hvor en container ikke kan erstatte en peger direkte (for eksempel kan konstruktionen «if(array_pointer)» omdannes til «if(span.data())»). Korrigeringer kan anvendes ikke kun til lokale variable, men også til parameter typer med pegere.
Kilde: opennet.ru
