LLVM-projektet utvecklar verktyg för att arbeta med buffertar på ett säkert sätt i C++

Utvecklarna av LLVM-projektet har föreslagit ett antal ändringar som syftar till att stärka säkerheten för uppdragskritiska C++-projekt och tillhandahålla ett sätt att eliminera fel orsakade av överskridanden av buffertar. Arbetet är fokuserat på två områden: att tillhandahålla en utvecklingsmodell som tillåter säkert arbete med buffertar, och att arbeta för att stärka säkerheten för libc++ standardfunktionsbibliotek.

Den föreslagna modellen för säker programmering för C++ innebär att man använder klasser som tillhandahålls av standardbiblioteket när man arbetar med buffertar istället för att manipulera nakna pekare. Till exempel föreslås det att använda klasserna std::array, std::vector och std::span, vilket kommer att lägga till en körtidskontroll för överallokerat minne.

För att bekämpa farliga programmeringsmetoder i klang, föreslås det att kompilatorvarningar visas för alla pekararitmetiska operationer, liknande de klangsnygga lintervarningarna när man använder flaggan "cppcoreguidelines-pro-bounds-pointer-arithmetic", vilket stöds visas i utgåvan LLVM 16. För att aktivera sådana varningar kommer en separat flagga att läggas till clang, inte aktiv som standard.

Det är planerat att implementera ett valfritt förbättrat skyddsläge i libc++, som, när det är aktiverat, kommer att fånga vissa situationer under körning som leder till odefinierat beteende. Till exempel, i klasserna std::span och std::vektor kommer en minnesåtkomst utanför gränserna att övervakas, och om det upptäcks kommer programmet att krascha. Utvecklarna tror att att lägga till sådana ändringar kommer att hålla libc++ i överensstämmelse med C++-standarderna, eftersom valet av hur man ska hantera fall av odefinierat beteende ligger hos biblioteksutvecklarna, som bland annat kan behandla odefinierat beteende som ett misslyckande, vilket kräver att program för att avsluta.

Körtidskontroller i libc++ är planerade att delas in i kategorier som kan aktiveras individuellt. Några av de föreslagna kontrollerna, som inte leder till komplexitet i operationer eller ändringar av ABI, är redan implementerade i libc++ säkert läge.

Dessutom är det planerat att förbereda verktyg för att justera koden, så att du kan ersätta variabler med blotta pekare med behållare och använda alternativa hanterare i situationer där behållaren inte direkt kan ersätta pekaren (till exempel kan "if(array_pointer)"-konstruktionen konverteras till "if(span.data) ()"). Justeringar kan tillämpas inte bara på lokala variabler utan även på parametrar för pekartyper.

Källa: opennet.ru

Lägg en kommentar