LLVM-projektissa kehitetään työkaluja puskureiden turvalliseen työskentelyyn C++:ssa

LLVM-projektin kehittäjät ovat ehdottaneet useita muutoksia, joiden tarkoituksena on vahvistaa tehtäväkriittisten C++-projektien turvallisuutta ja tarjota keinoja eliminoida puskureiden ylityksistä aiheutuvia virheitä. Työ keskittyy kahteen osa-alueeseen: puskureiden turvallisen työskentelyn mahdollistavan kehitysmallin tarjoamiseen ja libc++-standardin funktiokirjaston turvallisuuden vahvistamiseen.

Ehdotettu turvallinen ohjelmointimalli C++:lle sisältää vakiokirjaston tarjoamien luokkien käyttämisen puskureiden kanssa työskennellessä paljaiden osoittimien manipuloinnin sijaan. Esimerkiksi ehdotetaan käytettäväksi luokkia std::array, std::vector ja std::span, mikä lisää ajonaikaisen tarkistuksen ylivaratun muistin varalta.

Clangin vaarallisten ohjelmointikäytäntöjen torjumiseksi ehdotetaan, että kääntäjän varoitukset näytetään kaikille osoittimen aritmeettisille operaatioille, jotka ovat samanlaisia ​​​​kuin naksahtavia linterivaroituksia käytettäessä "cppcoreguidelines-pro-bounds-pointer-aritmetic" -lippua, jonka tuki näkyvät julkaisussa LLVM 16. Tällaisten varoitusten mahdollistamiseksi lisätään erillinen lippu clangiin, joka ei ole oletuksena aktiivinen.

Libc++:ssa on tarkoitus ottaa käyttöön valinnainen parannettu suojaustila, joka, kun se on käytössä, havaitsee ajon aikana joitain tilanteita, jotka johtavat määrittelemättömään toimintaan. Esimerkiksi luokissa std::span ja std::vector valvotaan rajojen ulkopuolista muistin käyttöä, ja jos se havaitaan, ohjelma kaatuu. Kehittäjät uskovat, että tällaisten muutosten lisääminen pitää libc++:n C++-standardien mukaisena, koska kirjaston kehittäjät voivat päättää, miten määrittelemättömän toiminnan tapaukset käsitellään, ja he voivat muun muassa käsitellä määrittelemätöntä käyttäytymistä epäonnistumisena, mikä vaatii lopettava ohjelma.

Libc++:n ajonaikaiset tarkistukset on tarkoitus jakaa luokkiin, jotka voidaan ottaa käyttöön yksitellen. Jotkut ehdotetuista tarkistuksista, jotka eivät johda toimintojen monimutkaisuuteen tai ABI:n muutoksiin, on jo toteutettu libc++-vikasietotilassa.

Lisäksi on tarkoitus valmistella työkaluja koodin säätämiseen, joiden avulla voit korvata muuttujat paljailla osoittimilla konteilla ja käyttää vaihtoehtoisia käsittelijöitä tilanteissa, joissa kontti ei voi suoraan korvata osoitinta (esim. "if(array_pointer)" -rakenne voi muunnetaan muotoon "if(span.data) ()". Säädyksiä voidaan soveltaa paitsi paikallisiin muuttujiin myös osoitintyyppien parametreihin.

Lähde: opennet.ru

Lisää kommentti