LLVM proiektua C++-n bufferekin modu seguruan lan egiteko tresnak garatzen ari da

LLVM proiektuaren garatzaileek hainbat aldaketa proposatu dituzte misio kritikoko C++ proiektuen segurtasuna indartzera eta bufferen gainditzeek eragindako akatsak ezabatzeko bitartekoa eskaintzeko. Lana bi arlotan oinarritzen da: bufferekin lan segurua ahalbidetzen duen garapen eredu bat eskaintzea eta libc++ funtzioen liburutegi estandarraren segurtasuna indartzeko lan egitea.

C++rako proposatutako programazio eredu seguruak liburutegi estandarrak emandako klaseak erabiltzean datza bufferekin lan egitean erakusle hutsak manipulatu beharrean. Adibidez, std::array, std::vector eta std::span klaseak erabiltzea proposatzen da, gehiegi esleitutako memoriaren exekuzio-denbora egiaztatzea gehituko dutenak.

Clang-en programazio-praktika arriskutsuei aurre egiteko, erakusleen eragiketa aritmetiko guztietarako konpiladoreen abisuak bistaratzea proposatzen da, "cppcoreguidelines-pro-bounds-pointer-arithmetic" bandera erabiltzean clang-tidy linter warnings irteeraren antzera. LLVM 16 bertsioan agertzen dira. Halako abisuak gaitzeko, beste bandera bat gehituko da clang-era, lehenespenez aktibo ez dena.

Babes-modu hobetua aukerako bat ezartzea aurreikusi da libc++-n, eta, gaituta dagoenean, exekuzioan definitutako portaera ekartzen duten egoera batzuk harrapatuko ditu. Adibidez, std::span eta std::vector klaseetan, mugaz kanpoko memoria-sarbidea kontrolatuko da, eta detektatzen bada, programa huts egingo du. Garatzaileek uste dute aldaketa horiek gehitzeak libc++ C++ estandarrak beteko dituela, izan ere, definitu gabeko portaera kasuak nola kudeatu aukeratzea liburutegiko garatzaileei dagokie, eta hauek, besteak beste, definitu gabeko portaera hutsegite gisa trata dezakete, eta amaitzeko programa.

Libc++-en exekuzio-denbora egiaztatzeak banan-banan gaitu daitezkeen kategorietan banatzea aurreikusita dago. Proposatutako egiaztapen batzuk, eragiketen konplexutasunik edo ABI-n aldaketarik eragiten ez dutenak, dagoeneko libc++ modu seguruan inplementatuta daude.

Gainera, kodea doitzeko tresnak prestatzea aurreikusten da, aldagaiak erakusle hutsekin edukiontziekin ordezkatzeko eta kudeatzaile alternatiboak erabiltzeko aukera emanez, edukiontziak erakuslea zuzenean ordezkatu ezin duen egoeretan (adibidez, β€œif(array_pointer)” eraikuntzak. "if(span.data) ()") bihurtuko da). Doikuntzak aldagai lokaletan ez ezik, erakusle-moten parametroetan ere aplika daitezke.

Iturria: opennet.ru

Gehitu iruzkin berria