Rivojlanish tsikli davomida tasdiqlash
Davomida rivojlanish tsikli, dasturchi odatda dasturni tasdiqlashlar yoqilgan holda boshqaradi. Tasdiqlashda xatolik yuz berganda, dasturchiga muammo haqida darhol xabar beriladi. Ko'pgina tasdiqlash dasturlari dasturning bajarilishini to'xtatadi: bu foydalidir, chunki agar dastur tasdiqlash buzilganidan keyin ishlashni davom ettirsa, bu uning holatini buzishi va muammo sababini topishni qiyinlashtirishi mumkin. Tasdiq etishmovchiligi bilan ta'minlangan ma'lumotdan foydalanish (masalan, xato joyi va ehtimol a stack iz, yoki hatto atrof-muhit qo'llab-quvvatlasa, to'liq dastur holati yadro chiqindilari yoki dastur a da ishlayotgan bo'lsa tuzatuvchi), dasturchi odatda muammoni hal qilishi mumkin. Shunday qilib, tasdiqlashlar disk raskadrovka jarayonida juda kuchli vositani taqdim etadi.
Ishlab chiqarish muhitidagi tasdiqlar
Agar dastur joylashtirilsa ishlab chiqarish, tasdiqlashlar, ular yuzaga kelishi mumkin bo'lgan ortiqcha va nojo'ya ta'sirlardan saqlanish uchun odatda o'chiriladi. Ba'zi hollarda, tasdiqlangan kodlar mavjud emas, masalan, makrolar orqali C / C ++ da. Boshqa holatlarda, masalan, Java, tasdiqlangan kodlarda mavjud va ularni disk raskadrovka uchun maydonda yoqish mumkin.[2]
Tasdiqlash, shuningdek, kompilyatorga berilgan chekka holatga erishish mumkin emasligini va'da berish uchun ham ishlatilishi mumkin va shu bilan ba'zi narsalarga ruxsat beradi. optimallashtirish aks holda buning iloji bo'lmaydi. Bunday holda, tasdiqlarni bekor qilish, aslida ish faoliyatini pasaytirishi mumkin.
Statik tasdiqlar
Kompilyatsiya vaqtida tekshiriladigan tasdiqlar statik tasdiqlar deyiladi.
Statik tasdiqlar kompilyatsiya vaqtida ayniqsa foydalidir shablonni metaprogramlash, lekin C kabi past darajadagi tillarda, agar tasdiq bajarilmasa (va faqatgina) noqonuniy kodni kiritish orqali ishlatilishi mumkin. C11 va C ++ 11 orqali to'g'ridan-to'g'ri statik tasdiqlarni qo'llab-quvvatlash statik_assert. Oldingi C versiyalarida statik tasdiqlash amalga oshirilishi mumkin, masalan:
#define SASSERT (pred) switch (0) {case 0: case pred :;}SASSERT( BOOLEAN ShART );
Agar (BOOLEAN SHART) qismi "false" deb baholanadi, keyin yuqoridagi kod kompilyatsiya qilinmaydi, chunki kompilyator ikkitasiga yo'l qo'ymaydi ish yorliqlari bir xil doimiylik bilan. Mantiqiy ifoda, masalan, kompilyatsiya vaqtining doimiy qiymati bo'lishi kerak (sizeof (int) == 4) bu kontekstda to'g'ri ifoda bo'lar edi. Ushbu qurilish fayl hajmida ishlamaydi (ya'ni funktsiya ichida emas) va shuning uchun uni funktsiya ichiga o'ralgan bo'lishi kerak.
Boshqa mashhur[3] tasdiqlovlarni C-da amalga oshirish usuli bu:
statik char konst statik_assertion[ (BOOLEAN ShART) ? 1 : -1 ] = {'!'};
Agar (BOOLEAN SHART) qismi noto'g'ri qiymatiga baho beradi, keyin yuqoridagi kod kompilyatsiya qilinmaydi, chunki massivlar salbiy uzunlikka ega bo'lmasligi mumkin. Agar aslida kompilyator salbiy uzunlikka yo'l qo'ysa, u holda initsializatsiya bayti ( '!' qismi) hatto bunday yengil kompilyatorlarning ham shikoyat qilishiga sabab bo'lishi kerak. Mantiqiy ifoda, masalan, kompilyatsiya vaqtining doimiy qiymati bo'lishi kerak (sizeof (int) == 4) bu kontekstda to'g'ri ifoda bo'lar edi.
Ushbu ikkala usul ham noyob nomlarni yaratish usulini talab qiladi. Zamonaviy kompilyatorlar a __COUNTER__ preprocessor har bir kompilyatsiya birligi uchun monotonik ravishda ko'payib boruvchi sonlarni qaytarib, noyob nomlarni yaratishni engillashtiradigan belgilaydi.[4]
D. dan foydalanish orqali statik tasdiqlarni beradi statik tasdiq.[5]
Do'stlaringiz bilan baham: |