Projekt LLVM vyvíja bezpečné zaobchádzanie s vyrovnávacou pamäťou v C++

Vývojári projektu LLVM navrhli množstvo zmien zameraných na posilnenie bezpečnosti kritických C++ projektov a poskytnutie prostriedkov na elimináciu chýb spôsobených pretečením vyrovnávacej pamäte. Práca je zameraná na dve oblasti: poskytnutie vývojového modelu, ktorý vám umožní bezpečne pracovať s vyrovnávacími pamäťami, a práca na posilnení bezpečnosti štandardnej knižnice funkcií libc++.

Navrhovaný bezpečný programovací model pre C++ je použiť triedy poskytované štandardnou knižnicou pri práci s vyrovnávacími pamäťami namiesto manipulácie s holými ukazovateľmi. Napríklad sa navrhuje použiť triedy std::array, std::vector a std::span, ktoré budú pridané s kontrolou za chodu pre mimo hraníc alokovanej pamäte.

Na boj proti nebezpečným programovacím praktikám pri clang sa navrhuje vydávať varovania kompilátora pre všetky aritmetické operácie ukazovateľov, podobne ako varovania linter clang-tidy pri použití príznaku „cppcoreguidelines-pro-bounds-pointer-aritmetic“, ktorého podpora sa objaví v vydanie LLVM 16. Na povolenie takýchto varovaní sa do clang pridá samostatný príznak, ktorý nie je štandardne aktívny.

Plánuje sa implementácia voliteľného spevneného ochranného režimu v libc++, ktorý, keď je povolený, zachytí niektoré situácie, ktoré vedú k nedefinovanému správaniu počas behu. Napríklad v triedach std::span a std::vector bude monitorovaný prístup mimo hraníc, v takom prípade program zlyhá. Vývojári veria, že pridaním takýchto zmien bude knižnica libc++ v súlade so štandardmi C++, pretože výber spôsobu riešenia prípadov nedefinovaného správania leží na vývojároch knižnice, ktorí môžu, okrem iného, ​​interpretovať nedefinované správanie ako zlyhanie, ktoré si vyžaduje program ukončiť.

Kontroly za behu v libc++ sa plánujú rozdeliť do kategórií, ktoré môžu byť zahrnuté jednotlivo. Niektoré z navrhovaných kontrol, ktoré nevedú k zložitejším operáciám alebo zmenám ABI, sú už implementované v bezpečnom režime libc++.

Okrem toho sa plánuje pripraviť súpravu nástrojov na opravu kódu, ktorá vám umožní nahradiť premenné holými ukazovateľmi na kontajneroch a použiť alternatívne obslužné nástroje v situáciách, keď kontajner nemôže priamo nahradiť ukazovateľ (napríklad „if (array_pointer)“ konstrukt je možné previesť na „if (span.data ()“). Úpravy je možné aplikovať nielen na lokálne premenné, ale aj na parametre typu s ukazovateľmi.

Zdroj: opennet.ru

Pridať komentár