Кіріспе
Белгілі бір алгоритмдердің дұрыстығын дәлелдеу немесе жоққа шығару. Аппараттық және бағдарламалық жүйелер контекстінде, формальды тексеру – математиканың формальды әдістерін қолдана отырып, белгілі бір формальды сипаттамаға немесе қасиетке қатысты жүйенің дұрыстығын дәлелдеу немесе жоққа шығару амалы. Формальды тексеру жүйелерді формальды түрде сипаттауға ынталандыратын маңызды фактор және формальды әдістердің өзегі болып табылады. Ол электрондық жобалауды автоматтандырудағы талдау мен тексерудің маңызды аспектісі және бағдарламалық жасақтаманы тексерудің бір жолы. Формальды тексеруді қолдану компьютерлік қауіпсіздікті сертификаттаудың жалпы талаптары аясында бағалаудың ең жоғары деңгейін (EAL7) қамтамасыз етеді. Формальды тексеру мынадай жүйелердің дұрыстығын дәлелдеуге көмектеседі: криптографиялық протоколдар, комбинациялық тізбектер, ішкі жадысы бар цифрлық тізбектер және бағдарламалау тіліндегі бастапқы код түрінде жазылған бағдарламалық қамтамасыз ету. Тексерілген бағдарламалық жүйелердің көрнекті мысалдары – CompCert тексерілген C компиляторы және seL4 жоғары сенімділік операциялық жүйе ядросы. Бұл жүйелердің тексеруі жүйелердің математикалық моделіне формальды дәлелдің бар екенін қамтамасыз ету арқылы жүзеге асырылады. Жүйелерді модельдеу үшін қолданылатын математикалық объектілердің мысалдары: соны күйдегі автоматтары, белгіленген өту жүйелері, Хорн шарттары, Петри торлары, векторлық қосу жүйелері, уақытталған автоматтары, гибридтік автоматтары, процесс алгебрасы, бағдарламалау тілдерінің формальды семантикасы, мысалы, операциялық семантика, денотациялық семантика, аксиоматикалық семантика және Хоар логикасы.
In the context of hardware and software systems, formal verification is the act of proving or disproving the correctness of a system with respect to a certain formal specification or property, using formal methods of mathematics. Formal verification is a key incentive for formal specification of systems, and is at the core of formal methods. It represents an important dimension of analysis and verification in electronic design automation and is one approach to software verification. The use of formal verification enables the highest Evaluation Assurance Level (EAL7) in the framework of common criteria for computer security certification. Formal verification can be helpful in proving the correctness of systems such as: cryptographic protocols, combinational circuits, digital circuits with internal memory, and software expressed as source code in a programming language. Prominent examples of verified software systems include the CompCert verified C compiler and the seL4 high assurance operating system kernel. The verification of these systems is done by ensuring the existence of a formal proof of a mathematical model of the system. Examples of mathematical objects used to model systems are: finite state machines, labelled transition systems, Horn clauses, Petri nets, vector addition systems, timed automata, hybrid automata, process algebra, formal semantics of programming languages such as operational semantics, denotational semantics, axiomatic semantics and Hoare logic.
Қадамдар
Бір тәсіл және қалыптасу – модельді тексеру, ол математикалық модельдің жүйелі түрде толық зерттелуінен тұрады (бұл шекті модельдер үшін мүмкін, сондай-ақ кейбір шексіз модельдер үшін де, онда шексіз күйлер жиынтығы абстракцияны пайдалану арқылы немесе симметриядан тиімді пайдалану арқылы шекті түрде бейнеленуі мүмкін). Әдетте, бұл модельдегі барлық күйлер мен өтулерді зерттеуден тұрады, осы үшін ақылды және салаға қатысты абстракция әдістерін қолдану арқылы бір операцияда күйлердің бүкіл топтарын қарастырып, есептеу уақытын қысқартуға болады. Іске асыру әдістеріне күй кеңістігін санау, символды күй кеңістігін санау, абстрактілі интерпретация, символды модельдеу, абстракцияны жетілдіру жатады. Тексерілетін қасиеттер көбінесе уақыт логикасында, мысалы, сызықтық уақыт логикасы (LTL), қасиеттерді сипаттау тілі (PSL), SystemVerilog Assertions (SVA) немесе есептеу ағашы логикасы (CTL) сияқты түрде сипатталады. Модельді тексерудің үлкен артықшылығы – ол көбінесе толық автоматты; оның негізгі кемшілігі – ол, әдетте, үлкен жүйелерге дейін кеңейтілмейді; символдық модельдер әдетте бірнеше жүз бит күймен шектеледі, ал нақты күйді санау зерттелген күй кеңістігінің салыстырмалы түрде кіші болуын қажет етеді. Тағы бір тәсіл – дедуктивті тексеру. Ол жүйеден және оның спецификацияларынан (немесе басқа да түсіндірмелерден) математикалық дәлелдеу міндеттемелерінің жиынтығын құрудан тұрады, олардың шындығы жүйенің спецификациясына сәйкес екенін көрсетеді, және осы міндеттемелерді дәлелдеуге көмектесетін құралдарды (интерактивті теорема дәлелдеушілерді) (мысалы, HOL, ACL2, Isabelle, Coq немесе PVS) немесе автоматты теорема дәлелдеушілерді, әсіресе, қанағаттандыру модулі теориялары (SMT) шешушілерді пайдалану арқылы орындаудан тұрады. Бұл тәсілдің кемшілігі – ол пайдаланушыдан жүйенің дұрыс жұмыс істеуінің себебін егжей-тегжейлі түсінуді және осы ақпаратты тексеру жүйесіне дәлелденуге тиісті теоремалардың тізбегі түрінде немесе жүйелік компоненттердің (мысалы, функциялар немесе процедуралар) және мүмкін, ішкі компоненттердің (мысалы, циклдар немесе деректер құрылымдары) спецификациялары (инварианттар, алғышарттар, постшарттар) түрінде жеткізуді талап етуі мүмкін.
Бағдарламалық жасақтама
Бағдарламалық бағдарламаларды ресми тексеру – бағдарламаның мінез-құлқының ресми сипаттамасына сәйкес келетінін дәлелдеуді қамтиды. Ресми тексерудің кіші салаларына дедуктивті тексеру (жоғарыда қараңыз), абстрактілі интерпретация, автоматтандырылған теоремаларды дәлелдеу, типтік жүйелер және жеңіл формалды әдістер жатады. Типке негізделген тексерудің перспективті тәсілі – тәуелді типті бағдарламалау, онда функциялардың типтері (кем дегенде бір бөлігі) сол функциялардың сипаттамаларын қамтиды, ал кодты типтік тексеру оның осы сипаттамаларға сәйкес дұрыстығын растайды. Толық мүмкіндіктермен жабдықталған тәуелді типтелген тілдер дедуктивті тексеруді ерекше жағдай ретінде қолдайды. Тағы бір толықтыратын тәсіл – бағдарлама туындылау, онда тиімді код функционалдық сипаттамалардан корректтілікті сақтайтын қадамдар сериясы арқылы жасалады. Бұл тәсілдің мысалы – Bird–Meertens формализмі, және оны құрылысы бойынша дұрыстықтың тағы бір түрі деп қарастыруға болады. Бұл әдістер дұрыс болуы мүмкін, яғни тексерілген қасиеттерді семантикадан логикалық тұрғыдан шығаруға болады, немесе дұрыс емес, яғни мұндай кепілдік жоқ. Дұрыс техника тек мүмкіндіктердің барлық кеңістігін қамтығаннан кейін ғана нәтиже береді. Дұрыс емес техниканың мысалы – мүмкіндіктердің тек бір бөлігін ғана қамтитын, мысалы, белгілі бір санға дейінгі бүтін сандарды ғана қамтитын және «жеткілікті жақсы» нәтиже беретін техника. Техникалар сондай-ақ шешілетін болуы мүмкін, яғни олардың алгоритмдік іске асырылуы жауаппен аяқталуы кепілдендірілген, немесе шешілмейтін, яғни олар ешқашан аяқталмауы мүмкін. Мүмкіндіктердің ауқымын шектеу арқылы, шешілетін дұрыс емес техникалар, шешілетін дұрыс техникалар болмаған жағдайда құрастырылуы мүмкін.
Тексеру және растау
Тексеру – өнімнің мақсатына сай келетіндігін сынаудың бір аспектісі. Валидация – осыған толықтыратын аспект. Көбінесе жалпы тексеру процесін V & V деп атайды.
Валидация: «Біз дұрыс нәрсе жасауға тырысып ба жатырмыз?», яғни өнім пайдаланушының нақты қажеттіліктеріне сәйкес берілген бе? Тексеру: «Біз жасағымыз келген нәрсені жасадық па?», яғни өнім талаптарға сай келе ме? Тексеру процесі статикалық/құрылымдық және динамикалық/мінез-құлық аспектілерінен тұрады. Мысалы, бағдарламалық өнім үшін бастапқы кодты (статикалық) қарап шығуға және нақты сынақ жағдайларымен (динамикалық) сынауға болады. Валидация көбінесе тек динамикалық түрде жүзеге асырылады, яғни өнімді әдеттегі және ерекше жағдайларда қолданып сынау арқылы тексеріледі («Барлық қолдану жағдайларын қанағаттандырады ма?» деген сұраққа жауап беріледі).
Бағдарламаны автоматты түрде жөндеу
Бағдарламаны жөндеу оракулға сәйкес жүзеге асырылады, оракул – бұл түзетілген нұсқаны тексеру үшін қолданылатын бағдарламаның қажетті функционалдығын қамтиды. Мысалы, тест жиынтығы – кіріс/шығыс жұптары бағдарламаның қызметін көрсетеді. Әртүрлі техникалар қолданылады, ең маңыздысы – қанағаттандыру теорияларымен (SMT) шешілетін мәселелерді қолдану және генетикалық бағдарламалау, эволюциялық есептеулерді түзетуге мүмкін үміткерлерді жасау және бағалау үшін пайдалану. Алғашқы әдіс детерминистік, ал екіншісі – кездейсоқ. Бағдарламаны жөндеу формалды тексеру және бағдарламаны синтездеу техникаларын біріктіреді. Формалды тексерудегі қателерді анықтау техникалары синтез модульдерімен жұмыс істейтін, мүмкін қате орналасқан бағдарламалық нүктелерді анықтау үшін қолданылады. Жөндеу жүйелері іздеу кеңістігін қысқарту үшін көбінесе белгілі бір, шешілген қателер класына назар аударады. Қазіргі техникалардың есептеу шығындарына байланысты өндірісте қолдану шектеулі.