LLVM-ontwikkelaars stellen veilige bufferverwerking voor in C++

LLVM-logo

LLVM is een raamwerk voor het ontwikkelen van compilers en het helpen bouwen van nieuwe programmeertalen en het verbeteren van bestaande talen.

De ontwikkelaars van het LLVM-project hebben een aantal wijzigingen voorgesteld om de beveiliging te versterken van de projecten C + + missiekritiek en bieden een middel om fouten veroorzaakt door bufferoverschrijdingen te elimineren.

Als zodanig is het voorstel dat ze hebben uitgebracht gericht op het werk op twee gebieden in het bijzonder: het bieden van een ontwikkelingsmodel dat veilig werken met buffers mogelijk maakt en het werken aan het versterken van de beveiliging van de libc++ standaardfunctiebibliotheek.

Er wordt vermeld dat het voorgestelde veilige programmeermodel voor C++ «is om de klassen te gebruiken die door de standaardbibliotheek worden geleverd bij het werken met buffers in plaats van onbewerkte aanwijzers te manipuleren». Er wordt bijvoorbeeld voorgesteld om de klassen std::array, std::vector en std::span te gebruiken, die zullen worden toegevoegd met een runtime-controle voor toegewezen out-of-bounds geheugen.

Ons doel is om de beveiliging van kritieke C++-codebases te verbeteren. Hiervoor gaan we aan de slag met twee ideeën.

Hardened C++ Standard Library
C++ Safe Buffer Programming Model en Adoption Tools
Hardened libc++ is bedoeld om de C++ standaard bibliotheekinterfaces in het algemeen veiliger te maken.

Het veilige bufferprogrammeermodel van C++ samen met het geharde libc++ zorgen voor runtimebeperking van out-of-bounds geheugentoegang. Adoptietools automatiseren de migratie van code naar dit nieuwe programmeermodel.

Daarnaast vermeldt het ook dat: om "gevaarlijke" programmeerpraktijken te bestrijden in gerinkel, als stelt voor om compilerwaarschuwingen te geven voor alle rekenkundige bewerkingen van de aanwijzer, vergelijkbaar met clang-tidy linter-waarschuwingen bij gebruik van de vlag "cppcoreguidelines-pro-bounds-pointer-arithmetic", waarvoor ondersteuning zal verschijnen in LLVM 16. Om dergelijke waarschuwingen in te schakelen, wordt een aparte vlag toegevoegd aan clang, standaard inactief .

Het is de bedoeling om een ​​optionele beschermingsmodus in libc++ te implementeren, die, indien ingeschakeld, sommige situaties zal detecteren die leiden tot ongedefinieerd gedrag tijdens runtime. Bijvoorbeeld in lessen std::span en std::vector, zal een out-of-bounds toegang worden gecontroleerd, in welk geval het programma zal mislukken.

Deze extra runtime-controles worden gegroepeerd in verschillende categorieën die afzonderlijk kunnen worden beheerd. Het is de bedoeling dat een leverancier die libc++ op zijn platform verzendt, kan beslissen welke controles in de verzendbibliotheek (indien aanwezig) moeten worden ingeschakeld, afhankelijk van het gewenste beveiligingsniveau.

De ontwikkelaars zijn van mening dat het toevoegen van dergelijke wijzigingen ervoor zorgt dat libc++ in overeenstemming blijft met de C++-standaarden, aangezien de keuze van hoe om te gaan met gevallen van ongedefinieerd gedrag berust bij de bibliotheekontwikkelaars, die onder andere ongedefinieerd gedrag kunnen behandelen als een slot dat vereist dat het programma Uitgang.

De runtime-controles in libc++ zijn gepland om in categorieën te worden verdeeld die afzonderlijk kunnen worden opgenomen. Sommige van de voorgestelde controles die niet resulteren in complexere operaties of ABI-wijzigingen zijn al geïmplementeerd in de veilige modus van libc++ (veilige modus).

Nogmaals, het uiteindelijke doel is dat de verzonden bibliotheek deze controles in productie mogelijk maakt; dit is geen "alleen debug"-functie, hoewel het uiteindelijk de lang kapotte "debug-modus" zal vervangen.

Bovendien heeft het is de bedoeling om een ​​set tools voor codecorrectie voor te bereiden waarmee variabelen kunnen worden vervangen door onbewerkte aanwijzers in containers en om alternatieve handlers toe te passen in situaties waarin de container de aanwijzer niet rechtstreeks kan vervangen (de constructie "if(array_pointer)" kan bijvoorbeeld worden geconverteerd naar "if(span.data ( )»). Instellingen kunnen niet alleen worden toegepast op lokale variabelen, maar ook om parameters met aanwijzers te typen.

Er wordt ook vermeld dat overweegt een "clang static analyzer checker" routegevoelig die waarschuwt als standaard::overspanning is opgebouwd uit een container die kleiner is dan de grootte die is opgegeven in de constructor van de overspanning. De genoemde checker is op zichzelf staand en nuttig op zichzelf, als alles goed gaat, wordt deze standaard ingeschakeld voor alle gebruikers

Eindelijk als u er meer over wilt wetenkunt u de details in het volgende link.


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: AB Internet Networks 2008 SL
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.