LLVM loyihasi C++ da bufer bilan xavfsiz ishlashni ishlab chiqadi

LLVM loyihasini ishlab chiquvchilari C++ missiyasi uchun muhim loyihalar xavfsizligini kuchaytirish va buferlarning haddan tashqari ko'payishi natijasida yuzaga keladigan xatolarni bartaraf etish vositalarini taqdim etishga qaratilgan bir qator o'zgarishlarni taklif qilishdi. Ish ikki yo‘nalishga qaratilgan: buferlar bilan xavfsiz ishlash imkonini beruvchi ishlab chiqish modelini ta’minlash va libc++ standart funksiyalar kutubxonasi xavfsizligini kuchaytirish ustida ishlash.

C++ uchun tavsiya etilgan xavfsiz dasturlash modeli yalang'och ko'rsatgichlarni manipulyatsiya qilish o'rniga buferlar bilan ishlashda standart kutubxona tomonidan taqdim etilgan sinflardan foydalanishni o'z ichiga oladi. Masalan, std::array, std::vector va std::span sinflaridan foydalanish taklif etiladi, ular ortiqcha ajratilgan xotira uchun ish vaqtini tekshirishni qo'shadi.

Clang-da xavfli dasturlash amaliyotiga qarshi kurashish uchun barcha ko'rsatkich arifmetik operatsiyalari uchun kompilyator ogohlantirishlarini ko'rsatish taklif etiladi, ular qo'llab-quvvatlanadigan "cppcoreguidelines-pro-bounds-pointer-arithmetic" bayrog'idan foydalanilganda jiringlashli linter ogohlantirishlari chiqishiga o'xshash. LLVM 16 nashrida paydo bo'ladi. Bunday ogohlantirishlarni yoqish uchun clangga alohida bayroq qo'shiladi, sukut bo'yicha faol emas.

Libc++ da ixtiyoriy kengaytirilgan himoya rejimini amalga oshirish rejalashtirilgan, u yoqilganda, ish vaqtida aniqlanmagan xatti-harakatlarga olib keladigan ba'zi vaziyatlarni ushlaydi. Masalan, std::span va std::vector sinflarida xotiradan tashqariga kirish nazorat qilinadi va agar aniqlansa, dastur ishdan chiqadi. Ishlab chiquvchilarning fikriga ko'ra, bunday o'zgarishlarni qo'shish libc++ ning C++ standartlariga muvofiqligini ta'minlaydi, chunki noaniq xatti-harakatlar holatlarini qanday hal qilishni tanlash kutubxona ishlab chiquvchilari zimmasiga tushadi, ular boshqa narsalar qatorida noaniq xatti-harakatni muvaffaqiyatsizlik deb hisoblashlari mumkin. tugatish uchun dastur.

Libc++ da ish vaqti tekshiruvlarini alohida-alohida yoqish mumkin bo'lgan toifalarga bo'lish rejalashtirilgan. Murakkab operatsiyalarga yoki ABIga o'zgartirishlarga olib kelmaydigan taklif qilingan tekshiruvlarning ba'zilari libc++ xavfsiz rejimida allaqachon amalga oshirilgan.

Bundan tashqari, o'zgaruvchilarni konteynerlar bilan yalang'och ko'rsatkichlar bilan almashtirish va konteyner ko'rsatgichni to'g'ridan-to'g'ri almashtira olmaydigan holatlarda muqobil ishlov beruvchilardan foydalanish imkonini beruvchi kodni sozlash uchun vositalarni tayyorlash rejalashtirilgan (masalan, "if(array_pointer)" konstruktsiyasi "if(span.data) ()" ga aylantirilishi mumkin). Tuzatishlar nafaqat mahalliy o'zgaruvchilarga, balki ko'rsatkich turlarining parametrlariga ham qo'llanilishi mumkin.

Manba: opennet.ru

a Izoh qo'shish