Лоиҳаи LLVM коркарди бехатари буфериро дар C++ таҳия мекунад

Таҳиягарони лоиҳаи LLVM як қатор тағиротҳоро пешниҳод карданд, ки ба таҳкими амнияти лоиҳаҳои муҳими C++ нигаронида шудаанд ва василаи рафъи хатогиҳои аз ҳад зиёди буфер ба вуҷуд омадаанд. Кор ба ду самт нигаронида шудааст: пешниҳоди модели рушд, ки ба шумо имкон медиҳад, ки бо буферҳо бехатар кор кунед ва кор оид ба таҳкими амнияти китобхонаи стандартии функсияҳои libc++.

Модели пешниҳодшудаи барномасозии бехатар барои C++ ин истифодаи синфҳои аз ҷониби китобхонаи стандартӣ пешниҳодшуда ҳангоми кор бо буферҳо ба ҷои коркарди нишондиҳандаҳои бараҳна мебошад. Масалан, пешниҳод карда мешавад, ки синфҳои std::array, std::vector ва std::span истифода шаванд, ки бо санҷиши вақти корӣ барои хотираи берун аз ҳудуди ҷудошуда илова карда мешаванд.

Барои мубориза бо амалияҳои хатарноки барномасозӣ дар clang, пешниҳод карда мешавад, ки огоҳиҳои компилятор барои ҳама амалҳои арифметикии нишондиҳандаҳо, ба монанди огоҳиҳои linter clang-tidy ҳангоми истифодаи парчами "cppcoreguidelines-pro-bounds-pointer-arithmetic", ки дастгирии онҳо дар озодкунии LLVM 16. Барои фаъол кардани чунин огоҳиҳо, парчами алоҳида ба clang илова карда мешавад, ки он бо нобаёнӣ фаъол нест.

Ба нақша гирифта шудааст, ки дар libc++ як ҳолати ихтиёрии муҳофизати сахтшуда татбиқ карда шавад, ки ҳангоми фаъол шудан баъзе ҳолатҳоеро, ки дар вақти кор ба рафтори номуайян оварда мерасонанд, фаро мегирад. Масалан, дар синфҳои std::span ва std::вектор, дастрасии берун аз ҳудуд назорат карда мешавад, ки дар ин ҳолат барнома вайрон мешавад. Таҳиягарон боварӣ доранд, ки илова кардани чунин тағирот libc++-ро бо стандартҳои C++ мувофиқ нигоҳ медорад, зеро интихоби тарзи коркарди ҳолатҳои рафтори номуайян ба дӯши таҳиягарони китобхона аст, ки метавонад дар байни чизҳои дигар, рафтори номуайянро ҳамчун садама шарҳ диҳад, ки барнома барои баромадан.

Санҷиши вақти корӣ дар libc++ ба нақша гирифта шудааст, ки ба категорияҳо тақсим карда шаванд, ки метавонанд ба таври инфиродӣ дохил карда шаванд. Баъзе санҷишҳои пешниҳодшуда, ки ба амалиёти мураккабтар ё тағйироти ABI оварда намерасонанд, аллакай дар ҳолати бехатари libc++ амалӣ карда шудаанд.

Илова бар ин, омода кардани асбобҳо барои ислоҳи код ба нақша гирифта шудааст, ки ба шумо имкон медиҳад, ки тағирёбандаҳоро бо нишондиҳандаҳои бараҳна дар контейнерҳо иваз кунед ва коркардкунандагони алтернативӣ дар ҳолатҳое истифода баред, ки контейнер мустақиман нишондодро иваз карда наметавонад (масалан, "if (array_pointer)" конструксия метавонад ба "агар (span.data ()" табдил дода шавад). Тасҳеҳҳоро на танҳо ба тағирёбандаҳои маҳаллӣ, балки инчунин ба навъи параметрҳои бо нишондодҳо истифода бурдан мумкин аст.

Манбаъ: opennet.ru

Илова Эзоҳ