LLVM projekat razvija bezbedno rukovanje baferom u C++

Programeri LLVM projekta su predložili niz promjena koje imaju za cilj jačanje sigurnosti C++ projekata kritičnih za misiju i obezbjeđivanje sredstava za eliminaciju grešaka uzrokovanih prekoračenjem bafera. Rad je fokusiran na dvije oblasti: obezbjeđivanje razvojnog modela koji omogućava siguran rad sa baferima i rad na jačanju sigurnosti libc++ standardne biblioteke funkcija.

Predloženi model sigurnog programiranja za C++ uključuje korištenje klasa koje obezbjeđuje standardna biblioteka kada se radi sa baferima umjesto manipulisanja golim pokazivačima. Na primjer, predlaže se korištenje klasa std::array, std::vector i std::span, koje će dodati provjeru vremena izvođenja za prekomjerno dodijeljenu memoriju.

Za borbu protiv opasnih programskih praksi u clang-u, predlaže se prikazivanje upozorenja kompajlera za sve aritmetičke operacije pokazivača, slično izlazu upozorenja clang-tidy linter kada se koristi “cppcoreguidelines-pro-bounds-pointer-arithmetic” zastavica, podrška za koju će pojavljuju se u izdanju LLVM 16. Da biste omogućili takva upozorenja, posebna zastavica će biti dodata clang-u, koja nije aktivna po defaultu.

Planirano je implementiranje opcionog poboljšanog načina zaštite u libc++, koji će, kada je omogućen, uhvatiti neke situacije u vrijeme izvođenja koje dovode do nedefiniranog ponašanja. Na primjer, u klasama std::span i std::vector, nadzirat će se pristup memoriji izvan granica i ako se otkrije, program će se srušiti. Programeri vjeruju da će dodavanje takvih promjena održati libc++ u skladu sa C++ standardima, budući da izbor načina na koji će postupati u slučajevima nedefiniranog ponašanja leži na programerima biblioteke, koji, između ostalog, nedefinirano ponašanje mogu tretirati kao neuspjeh, zahtijevajući program za prekid.

Planirano je da se provjere vremena izvršavanja u libc++ podijele u kategorije koje se mogu pojedinačno omogućiti. Neke od predloženih provjera, koje ne dovode do složenosti operacija ili promjena u ABI-ju, već su implementirane u libc++ sigurnom načinu rada.

Osim toga, planira se pripremiti alate za prilagođavanje koda, koji će vam omogućiti zamjenu varijabli golim pokazivačima sa kontejnerima i korištenje alternativnih rukovatelja u situacijama kada kontejner ne može direktno zamijeniti pokazivač (na primjer, konstrukcija „if(array_pointer)” može konvertovati u „if(span.data) ()"). Podešavanja se mogu primeniti ne samo na lokalne varijable, već i na parametre tipova pokazivača.

izvor: opennet.ru

Dodajte komentar