Filialni qamrab olish chora-tadbirlari, agar unga rioya qilingan bo'lsa, har
bir filial uchun. Shunga qaramay, qamrovni
kuzatish oddiy massiv va
bajarilgan filiallarni belgilaydigan asboblar yordamida amalga oshirilishi mumkin.
Sinov kirishlari a = 5, b = 1 va a = 1, b = 5 to'liq tarmoq qamroviga (va
to'liq bayonot qamroviga) erishadi, ammo dastur orqali barcha mumkin
bo'lgan yo'llar bajarilmaydi. a = 1, b = 1 kiritilishi ikkala bayonot bir vaqtning
o'zida to'g'ri bo'lganda xatolikka olib keladi. To'liq yo'l qamrovi barcha
mumkin bo'lgan yo'llarni baholaydi. Barcha mumkin bo'lgan yo'llarni
baholash
tezda qimmatga tushadi, chunki har bir filial baholangan yo'llar
sonini ikki baravar oshiradi yoki hatto chegaralar noma'lum bo'lgan tsikllar
uchun imkonsizdir. Bu yo'llar miqdorining eksponentsial o'sishi hisoblanadi
Loopdagi chekdan pastadir oxirigacha bo'lgan novdaning chekkasi
hech qachon kuzatilmaydi.
Listing 6.2: Filial qamrovini cheklash.
1
int
arr[5] = { 0, 1, 2, 3, 4}; 2
int
func(int a,
int
b) { 3
int
idx = 4; 4
agar
(a < 5) idx -= 4;
Aks
holda
idx -= 1; 5
agar
(b < 5) idx -= 1;
boshqa
idx += 1; 6
qaytish
arr[idx]; 7 }
6 Mudofaa strategiyasi
64
Filial qamrovi asosiy
blokning bajarilishini ham, berilgan asosiy
blokdagi filialni ham belgilaydi
va shuning uchun oddiy bayonot
qamrovining super to'plamidir. Filialni to'liq qamrab olish to'liq
bayonotni qamrab olishni nazarda tutadi. Afsuski, filial qamrovi
etarlicha aniq bo'lmasligi mumkin:
Machine Translated by Google
yo'l portlashi deb ataladi . Loop qamrovi (har bir tsiklni 0, 1, n marta
bajaring), filial qamrovi bilan birgalikda davlat maydonini ehtimoliy
ravishda qamrab oladi. Yo'l qamrovini amalga oshirish yo'llarning ish
vaqtini kuzatishni talab qiladi, chunki taxminan 40
dan ortiq filiallari
bo'lgan dasturlarni tekis massivga solishtirib bo'lmaydi va joriy (va
kelajakdagi) xotirani hisobga olgan holda barcha yo'llarni sanab bo'lmaydi.
Shu sababli, amalda filial qamrovi eng samarali vosita bo'lib, dasturiy
ta'minot uchun filial qamrovini kuzatish imkonini beruvchi bir qancha
mexanizmlar mavjud . Ikkita misol - gcov va Sanitizer qamrovi. Filial qamrovi
CFG ning qirralarini kuzatib boradi va har bir bajarilgan chetni afzalligi bilan
belgilab beradi, chunki har bir chekka uchun faqat bir oz ma'lumot
talab
qilinadi (va bajarilgan yo'llar soniga bog'liq dinamik ma'lumot yo'q ).
Sanitizerlar - bu dasturni qo'shimcha tekshiruvlar bilan jihozlaydigan
kompilyatsiya ramkalari . Sinov bilan bajarilganda
Bu qamrovni kuzatishning eng aniq usuli, ammo yuqori qo'shimcha
xarajatlarni o'z ichiga oladi.
Sinov holatlari xatolarni noto'g'ri taqqoslangan natijalar,
tasdiqlash xatolari,
segmentatsiya xatolari, nolga bo'linish, qo'lga olinmagan istisnolar yoki
jarayonni tugatishga olib keladigan yumshatishlar orqali aniqlaydi.
Ma'lumotlar oqimining qamrovi yo'l qamrovidan tashqariga chiqadi va
dastur orqali to'liq ma'lumotlar oqimini yanada
yuqori xarajatlar bilan
kuzatib boradi. Yo'l cheklovlariga qo'shimcha ravishda (har bir yo'l qarori
uchun mantiqiy), barcha dastur qiymatlarining qiymatlari ham kuzatilishi kerak.
Do'stlaringiz bilan baham: