LLVM նախագիծը մշակում է բուֆերային անվտանգ մշակում C++-ում

LLVM նախագծի մշակողները առաջարկել են մի շարք փոփոխություններ, որոնք ուղղված են առաքելության համար կարևոր C++ նախագծերի անվտանգության ամրապնդմանը և բուֆերների գերազանցման հետևանքով առաջացած սխալները վերացնելու միջոցներին: Աշխատանքը կենտրոնացած է երկու ոլորտների վրա՝ տրամադրելով զարգացման մոդել, որը թույլ է տալիս ապահով աշխատել բուֆերների հետ, և աշխատել libc++ ֆունկցիաների ստանդարտ գրադարանի անվտանգության ամրապնդման վրա:

C++-ի համար առաջարկվող անվտանգ ծրագրավորման մոդելը բուֆերների հետ աշխատելիս ստանդարտ գրադարանի կողմից տրամադրված դասերի օգտագործումն է՝ մերկ ցուցիչները շահարկելու փոխարեն: Օրինակ՝ առաջարկվում է օգտագործել std::array, std::vector և std::span դասերը, որոնք կավելացվեն գործարկման ժամանակի ստուգմամբ՝ սահմաններից դուրս հատկացված հիշողության համար:

«cppcoreguidelines-pro-bounds-pointer-athmetic» դրոշը օգտագործելիս առաջարկվում է կոմպիլյատորների նախազգուշացումներ տալ ցուցիչի բոլոր թվաբանական գործողությունների համար, որոնք նման են «cppcoreguidelines-pro-bounds-pointer-athmetic» դրոշակին օգտագործելիս. LLVM 16 թողարկումը: Նման նախազգուշացումները միացնելու համար կլանգին կավելացվի առանձին դրոշ, որը լռելյայն ակտիվ չէ:

Նախատեսվում է libc++-ում կիրառել կամընտիր կարծրացված պաշտպանության ռեժիմ, որը, երբ միացված է, կբռնի որոշ իրավիճակներ, որոնք հանգեցնում են անորոշ պահվածքի գործարկման ժամանակ: Օրինակ, std::span և std::vector դասերում վերահսկվելու է սահմաններից դուրս մուտքը, որի դեպքում ծրագիրը խափանում է: Մշակողները կարծում են, որ նման փոփոխությունների ավելացումը կպահպանի libc++-ը C++ ստանդարտներին համապատասխան, քանի որ չսահմանված վարքագծի դեպքերը վարելու ընտրությունը պատկանում է գրադարանի մշակողներին, որոնք, ի թիվս այլ բաների, կարող են մեկնաբանել չսահմանված վարքագիծը որպես խափանում, որը պահանջում է. ելքի ծրագիր.

Runtime ստուգումները libc++-ում նախատեսվում է բաժանել կատեգորիաների, որոնք կարող են ներառվել առանձին: Առաջարկվող ստուգումներից մի քանիսը, որոնք չեն հանգեցնում ավելի բարդ գործողություններ կամ ABI փոփոխություններ, արդեն իրականացվել են libc++-ի անվտանգ ռեժիմում:

Բացի այդ, նախատեսվում է պատրաստել գործիքակազմ՝ կոդը ուղղելու համար, որը թույլ կտա փոխել փոփոխականները բեռնարկղերի վրա մերկ ցուցիչներով և կիրառել այլընտրանքային մշակիչներ այն իրավիճակներում, երբ կոնտեյները չի կարող ուղղակիորեն փոխարինել ցուցիչը (օրինակ՝ «if (array_pointer)» կոնստրուկտը կարող է փոխակերպվել «if (span.data ()»): Կարգավորումները կարող են կիրառվել ոչ միայն տեղական փոփոխականների, այլև ցուցիչներով պարամետրերի մուտքագրման համար:

Source: opennet.ru

Добавить комментарий