La LLVM-projekto evoluigas bufran sekuran uzadon en C++

La programistoj de la LLVM-projekto proponis kelkajn ŝanĝojn celantajn plifortigi la sekurecon de misi-kritikaj C++-projektoj kaj disponigado de rimedo por elimini erarojn kaŭzitajn de bufrotranspaso. La laboro estas koncentrita sur du areoj: provizanta disvolvan modelon kiu permesas vin sekure labori kun bufroj, kaj labori pri hardado de la sekureco de la libc++ norma biblioteko de funkcioj.

La proponita sekura programa modelo por C++ devas uzi la klasojn disponigitajn per la norma biblioteko dum laborado kun bufroj anstataŭe de manipulado de nudaj montriloj. Ekzemple, estas proponite uzi la klasojn std::array, std::vector kaj std::span, kiuj estos aldonitaj kun rultempa kontrolo por eksterlima asignita memoro.

Por kontraŭbatali danĝerajn programajn praktikojn en clang, estas proponite eligi kompililajn avertojn por ĉiuj punteraj aritmetikaj operacioj, simile al la linter-avertoj de clang-tidy kiam oni uzas la flagon "cppcoreguidelines-pro-bounds-pointer-arithmetic", por kiu subteno aperos en la eldono LLVM 16. Por ebligi tiajn avertojn, aparta flago estos aldonita al clang, kiu ne estas aktiva defaŭlte.

Estas planite efektivigi laŭvolan harditan protektoreĝimon en libc++, kiu, kiam ĝi estas ebligita, kaptos iujn situaciojn, kiuj kondukas al nedifinita konduto ĉe rultempo. Ekzemple, en la klasoj std::span kaj std::vector, eksterlima aliro estos monitorita, en kiu kazo la programo kraŝos. La programistoj kredas, ke aldoni tiajn ŝanĝojn, libc++ konforma al C++-normoj, ĉar la elekto pri kiel trakti kazojn de nedifinita konduto apartenas al la programistoj de la biblioteko, kiuj povas, interalie, interpreti nedifinitan konduton kiel kraŝo kiu postulas la programo por eliri.

Rultempaj kontroloj en libc++ estas planitaj por esti dividitaj en kategoriojn kiuj povas esti inkluditaj individue. Kelkaj el la proponitaj kontroloj, kiuj ne rezultigas pli kompleksajn operaciojn aŭ ABI-ŝanĝojn, jam estas efektivigitaj en la sekura reĝimo de libc++.

Krome, estas planite prepari ilaron por korekti la kodon, permesante al vi anstataŭigi variablojn per nudaj montriloj sur ujoj kaj apliki alternativajn traktilojn en situacioj kie la ujo ne povas rekte anstataŭigi la montrilon (ekzemple, la "se (array_pointer)" konstruo povas esti konvertita al "se (span.data ()"). Alĝustigoj povas esti aplikitaj ne nur al lokaj variabloj, sed ankaŭ al tajpi parametrojn per montriloj.

fonto: opennet.ru

Aldoni komenton