Projekt LLVM razvija sigurno rukovanje međuspremnikom u C++

Programeri projekta LLVM predložili su niz promjena usmjerenih na jačanje sigurnosti kritičnih C++ projekata i pružanje sredstava za uklanjanje pogrešaka uzrokovanih prekoračenjem međuspremnika. Rad je usmjeren na dva područja: pružanje razvojnog modela koji vam omogućuje siguran rad s međuspremnicima i rad na ojačavanju sigurnosti standardne knjižnice funkcija libc++.

Predloženi model sigurnog programiranja za C++ je korištenje klasa koje pruža standardna biblioteka pri radu s međuspremnicima umjesto manipuliranja golim pokazivačima. Na primjer, predlaže se korištenje klasa std::array, std::vector i std::span, koje će biti dodane s provjerom vremena izvođenja za izvan granica dodijeljene memorije.

Za borbu protiv opasnih praksi programiranja u clangu, predlaže se izdavanje upozorenja prevoditelja za sve aritmetičke operacije pokazivača, slično clang-tidyjevim upozorenjima o linteru kada se koristi zastavica "cppcoreguidelines-pro-bounds-pointer-arithmetic", podrška za koju će se pojaviti u izdanje LLVM 16. Kako bi se omogućila takva upozorenja, posebna zastavica bit će dodana u clang, koja nije aktivna prema zadanim postavkama.

Planirano je implementirati neobavezni ojačani način zaštite u libc++, koji će, kada je omogućen, uhvatiti neke situacije koje dovode do nedefiniranog ponašanja tijekom izvođenja. Na primjer, u klasama std::span i std::vector nadzirat će se pristup izvan granica, u kojem slučaju će se program srušiti. Programeri vjeruju da će dodavanje takvih promjena libc++ održati usklađenim sa C++ standardima, budući da je izbor kako postupiti u slučajevima nedefiniranog ponašanja na programerima biblioteke, koji mogu, između ostalog, protumačiti nedefinirano ponašanje kao rušenje koje zahtijeva program za izlaz.

Provjere vremena izvođenja u libc++ planiraju se podijeliti u kategorije koje se mogu pojedinačno uključiti. Neke od predloženih provjera koje ne rezultiraju složenijim operacijama ili ABI promjenama već su implementirane u libc++ sigurnom načinu rada.

Osim toga, planira se pripremiti set alata za ispravljanje koda, koji vam omogućuje zamjenu varijabli golim pokazivačima na spremnicima i primjenu alternativnih rukovatelja u situacijama kada spremnik ne može izravno zamijeniti pokazivač (na primjer, "if (array_pointer)" konstrukt se može pretvoriti u "if (span.data ()"). Prilagodbe se mogu primijeniti ne samo na lokalne varijable, već i na parametre tipa s pokazivačima.

Izvor: opennet.ru

Dodajte komentar