Die LLVM-projek ontwikkel bufferveilige hantering in C++

Die ontwikkelaars van die LLVM-projek het 'n aantal veranderinge voorgestel wat daarop gemik is om die sekuriteit van missiekritieke C++-projekte te versterk en om 'n manier te verskaf om foute wat veroorsaak word deur buffers wat oorskry word, uit te skakel. Die werk is gefokus op twee areas: die verskaffing van 'n ontwikkelingsmodel wat veilige werk met buffers moontlik maak, en werk om die sekuriteit van die libc++ standaard biblioteek van funksies te versterk.

Die voorgestelde veilige programmeringsmodel vir C++ behels die gebruik van klasse wat deur die standaardbiblioteek verskaf word wanneer met buffers gewerk word in plaas daarvan om blote wysers te manipuleer. Daar word byvoorbeeld voorgestel om die std::array, std::vector en std::span klasse te gebruik, wat 'n runtime check sal byvoeg vir oortoegewysde geheue.

Om gevaarlike programmeringspraktyke in clang te bekamp, ​​word voorgestel om samestellerwaarskuwings vir alle wyserrekenkundige bewerkings te vertoon, soortgelyk aan die klang-netjiese linterwaarskuwingsuitset wanneer die “cppcoreguidelines-pro-bounds-pointer-arithmetic” vlag gebruik word, waarvoor ondersteuning verskyn in die vrystelling LLVM 16. Om sulke waarskuwings te aktiveer, sal 'n aparte vlag by clang gevoeg word, nie by verstek aktief nie.

Daar word beplan om 'n opsionele verbeterde beskermingsmodus in libc++ te implementeer, wat, wanneer dit geaktiveer is, sommige situasies tydens looptyd sal opvang wat tot ongedefinieerde gedrag lei. Byvoorbeeld, in die std::span en std::vektorklasse, sal 'n buite-grens geheue toegang gemonitor word, en as dit bespeur word, sal die program ineenstort. Die ontwikkelaars glo dat die byvoeging van sulke veranderinge libc++ in ooreenstemming met die C++-standaarde sal hou, aangesien die keuse van hoe om gevalle van ongedefinieerde gedrag te hanteer by die biblioteekontwikkelaars lê, wat onder andere ongedefinieerde gedrag as 'n mislukking kan behandel, wat die program te beëindig.

Looptydkontroles in libc++ word beplan om in kategorieë verdeel te word wat individueel geaktiveer kan word. Sommige van die voorgestelde kontroles, wat nie lei tot kompleksiteit van bedrywighede of veranderinge aan die ABI nie, is reeds binne die libc++ veilige modus geïmplementeer.

Daarbenewens word daar beplan om gereedskap vir die opdatering van die kode voor te berei, sodat jy veranderlikes met blote wysers met houers kan vervang en alternatiewe hanteerders kan gebruik in situasies waar die houer nie direk die wyser kan vervang nie (byvoorbeeld, die "if(array_pointer)"-konstruk kan omgeskakel word na "if(span.data) ()"). Aanpassings kan nie net op plaaslike veranderlikes toegepas word nie, maar ook op parameters van wysertipes.

Bron: opennet.ru

Voeg 'n opmerking