De ontwikkelaars van het LLVM-project hebben een reeks wijzigingen voorgesteld die gericht zijn op het verbeteren van de veiligheid van kritieke projecten in C++ en het bieden van middelen om fouten die voortvloeien uit overschrijdingen van geheugenbuffers te voorkomen. Het werk richt zich op twee gebieden: het bieden van een ontwikkelingsmodel dat veilig werken met buffers mogelijk maakt en het versterken van de beveiliging van de standaardfunctie bibliotheek libc++.
Het voorgestelde model voor veilig programmeren in C++ stelt voor om de door de standaardbibliotheek aangeboden klassen te gebruiken bij het werken met buffers, in plaats van te werken met blote pointers. Zo wordt voorgesteld om de klassen std::array, std::vector en std::span te gebruiken, waarbij runtime-controle op geheugenoverschrijdingen zal worden toegevoegd.
Om gevaarlijke programmeerpraktijken in clang aan te pakken, worden er compilerwaarschuwingen voorgesteld voor alle rekenkundige bewerkingen met pointers, vergelijkbaar met de waarschuwingen van de clang-tidy linter die verschijnen bij gebruik van de vlag "cppcoreguidelines-pro-bounds-pointer-arithmetic", waarvan de ondersteuning zal verschijnen in de release van LLVM 16. Voor het inschakelen van dergelijke waarschuwingen zal er een aparte vlag in clang worden toegevoegd, die standaard niet is ingeschakeld.
In libc++ is het de bedoeling om een optionele modus voor versterkte beveiliging te implementeren, waarbij tijdens runtime bepaalde situaties die leiden tot onbepaald gedrag worden opgevangen. Bijvoorbeeld, in de klassen std::span en std::vector zal het toegang tot gebieden buiten de toegewezen geheugenruimte worden gevolgd, en als dit wordt vastgesteld, zal de applicatie worden afgebroken. De ontwikkelaars zijn van mening dat het toevoegen van dergelijke wijzigingen de compatibiliteit van libc++ met de C++-standaarden zal behouden, aangezien de keuze van de methode voor het omgaan met gevallen van onbepaald gedrag ligt bij de bibliotheekontwikkelaars, die onbepaald gedrag ook kunnen interpreteren als een fout die een programma-afsluiting vereist.
De runtime-controles in libc++ zijn van plan om te worden onderverdeeld in categorieën die afzonderlijk kunnen worden ingeschakeld. Sommige van de voorgestelde controles die geen complicaties in de operaties of veranderingen in de ABI veroorzaken, zijn al geïmplementeerd binnen de veilige modus van libc++ (safe mode).
Daarnaast is het gepland om tools te ontwikkelen voor het aanpassen van de code, waarmee variabelen met ruwe pointers kunnen worden vervangen door containers en alternatieve handlers kunnen worden toegepast in situaties waarin een container niet direct een pointer kan vervangen (bijvoorbeeld kan de constructie "if(array_pointer)" worden omgezet in "if(span.data()"). Aanpassingen kunnen zowel op lokale variabelen als op typeparameters met pointers worden toegepast.
Bron: opennet.ru
