Het LLVM-project ontwikkelt tools om veilig met buffers te werken in C++

De ontwikkelaars van het LLVM-project hebben een aantal wijzigingen voorgesteld die gericht zijn op het versterken van de veiligheid van bedrijfskritische C++-projecten en het bieden van een manier om fouten veroorzaakt door bufferoverschrijdingen te elimineren. Het werk is gericht op twee gebieden: het bieden van een ontwikkelingsmodel dat veilig werken met buffers mogelijk maakt, en het werken aan het versterken van de beveiliging van de libc++ standaardbibliotheek met functies.

Het voorgestelde veilige programmeermodel voor C++ omvat het gebruik van klassen die door de standaardbibliotheek worden geleverd bij het werken met buffers in plaats van het manipuleren van kale wijzers. Er wordt bijvoorbeeld voorgesteld om de klassen std::array, std::vector en std::span te gebruiken, die een runtimecontrole toevoegen op overmatig toegewezen geheugen.

Om gevaarlijke programmeerpraktijken in clang tegen te gaan, wordt voorgesteld om compilerwaarschuwingen weer te geven voor alle rekenkundige bewerkingen met pointers, vergelijkbaar met de clang-tidy linter-waarschuwingen die worden uitgevoerd bij gebruik van de vlag “cppcoreguidelines-pro-bounds-pointer-arithmetic”, waarvoor ondersteuning zal worden geboden verschijnen in de release LLVM 16. Om dergelijke waarschuwingen mogelijk te maken, wordt een aparte vlag aan clang toegevoegd, die standaard niet actief is.

Het is de bedoeling om een ​​optionele verbeterde beschermingsmodus in libc++ te implementeren, die, indien ingeschakeld, tijdens runtime enkele situaties zal opvangen die tot ongedefinieerd gedrag leiden. In de klassen std::span en std::vector wordt bijvoorbeeld een geheugentoegang buiten het bereik gecontroleerd en als dit wordt gedetecteerd, crasht het programma. De ontwikkelaars zijn van mening dat het toevoegen van dergelijke wijzigingen ervoor zal zorgen dat libc++ blijft voldoen aan de C++-standaarden, aangezien de keuze hoe om te gaan met gevallen van ongedefinieerd gedrag bij de bibliotheekontwikkelaars ligt, die onder andere ongedefinieerd gedrag als een mislukking kunnen beschouwen, waarbij de programma te beëindigen.

Het is de bedoeling dat runtimecontroles in libc++ worden onderverdeeld in categorieën die afzonderlijk kunnen worden ingeschakeld. Sommige van de voorgestelde controles, die niet leiden tot complexiteit van handelingen of wijzigingen aan de ABI, zijn al geïmplementeerd in de veilige modus libc++.

Bovendien is het de bedoeling om hulpmiddelen voor te bereiden voor het aanpassen van de code, zodat u variabelen door kale pointers kunt vervangen door containers en alternatieve handlers kunt gebruiken in situaties waarin de container de pointer niet rechtstreeks kan vervangen (de constructie “if(array_pointer)” kan bijvoorbeeld worden geconverteerd naar “if(span.data) ()"). Aanpassingen kunnen niet alleen worden toegepast op lokale variabelen, maar ook op parameters van pointertypen.

Bron: opennet.ru

Voeg een reactie