CHECK(fn);
(*fn)(x);
To'g'ridan-to'g'ri to'g'ridan-to'g'ri boshqarish oqimini uzatish ( C/C++
da funktsiya ko'rsatkichlari orqali qo'ng'iroqlar yoki C++ da virtual
jo'natish) hisobga olingan holda, ushbu nazorat oqimi o'tkazmalarining
haqiqiy maqsadlari nima? Ilovaning aniq nazorat-oqim grafigi ushbu
amaldagi barcha maqsadlarni sanab o'tadi,
ammo aniq nazorat oqimi
grafigini yaratish boshqa nom tufayli qiyin , ya'ni statik tahlil orqali kod
ko'rsatgichining mumkin bo'lgan haqiqiy qiymatlarini chiqarish qiyin.
Eng yaxshi statik CFI tahlili kontekst va oqimga sezgir taxallus tahlili
asosida har bir joy uchun aniq maqsadlar to'plamini , potentsial
ravishda dinamik yo'l kuzatuvi bilan aniqlaydi [4].
har bir bilvosita,
oldinga chekka, nazorat oqimini uzatish uchun joriy
maqsadlar to'plami. Masalan, void (*funcPtr)(int, int) tipidagi funktsiya
ko'rsatkichi faqat prototipga mos keladigan va manzil olingan
dasturdagi funksiyalarni ko'rsatishi mumkin . Ishlash vaqtida CFI
funktsiya ko'rsatkichining kuzatilgan qiymati statik ravishda aniqlangan
haqiqiy maqsadlar to'plamida ekanligini tekshirish
uchun asboblardan
foydalanadi . 6.6-rasmda CFI tekshiruvi va maqsad to'plami (va
maqsadni kamaytirish) ko'rsatilgan.
Tahlilning murakkabligi tufayli mavjud CFI mexanizmlari
6 Mudofaa strategiyasi
Shakl 6.6: Boshqarish-oqimning yaxlitligi: ish vaqtida faqat yaroqli tar
olish (qora o'qlar)ga ruxsat beriladi, yaroqsiz maqsadlar
(qizil o'qlar) tugatishga olib keladi.
98
Machine Translated by Google
99
6 Mudofaa strategiyasi
har bir joylashuv asosida haqiqiy maqsadlar to'plamini aniqlash uchun
muqobil sxemalarga e'tibor qarating. Eng oddiy CFI tahlil sxemasi har
qanday bilvosita boshqaruv oqimini uzatish joyidan har qanday joriy
funktsiyani chaqirish mumkin bo'lgan haqiqiy funktsiyalar to'plamidan foydalanadi .
Boshqa, ko'proq jalb qilingan sxema argumentlar sonini hisoblaydi va
har bir hisob uchun bitta to'plam
yaratadi, ya'ni argumentsiz barcha
funktsiyalar, 1 argumentli funktsiyalar, ikkita argumentli funktsiyalar va
hokazo. C CFI tahlilining hozirgi holati funktsiya prototipidan foydalanadi
va har bir funktsiya prototipi uchun bitta maqsadlar to'plamini yaratadi. C
uchun qaysi funksiyalar manzili olinganligini o'lchash orqali sxemani
yaxshilash mumkin. Funktsiya ko'rsatkichlaridagi ko'rsatgich
arifmetikasi
aniqlanmaganligi sababli, faqat manzili olingan va funktsiya ko'rsatkichiga
tayinlangan funktsiyalardan foydalanish mumkin. C++ uchun bu sxema
sinf ierarxiyasi tahlili orqali takomillashtiriladi. Qo'ng'iroqlar sayti ma'lum
bir turdan foydalanadi va mavjud bo'lishi kerak bo'lgan sinf ierarxiyasini
hisobga olgan holda , ushbu qo'ng'iroq joyi uchun faqat ushbu tur va
meros zanjiridagi quyi turlarga ruxsat beriladi.
Machine Translated by Google