# 1 Verifikace a zajištění systémů ### IA169 ###### tags: `řvss`, `řss`, `verifikace`, `ia169` <span style="color:red">*Tam, kde sú otázniky, mi to nie je jasné, môžete to pokojne upraviť. Vopred sa ospravedlňujem za chyby a nezrozumiteľnosti, všetko som v rýchlosti ručne prepisoval z anglických slajdov, iné materiály neboli.*</span> --- ## 1. Principy, výhody, nevýhody a omezení metod pro testování systémů bez znalosti kódu a dalších technik pro formální verifikace počítačových systémů jako jsou symbolické exekuce *Neviem, čo všetko si pod týmto názvom predstaviť. Je tu spracovaná prvá prednáška (Fundamentals of Testing) a druhá prednáška (Symbolic Execution and Concolic Testing)* --- ## 1a. Princípy, výhody, nevýhody, obmedzenia bez znalosti kódu/Fundamental Questions of Testing Testovanie je empirické, technické skúmanie vedené s cieľom poskytnúť zúčastneným stranám informácie o kvalite testovaného produktu alebo služby. **Časti: Missions, Strategy, Oracle, Measure Methods, Incompletness** ### Ciele (Missions) *Prečo testujeme? Čo chceme dosiahnúť?* **Hlavné** - hľadanie bugov - identifikácia faktorov, ktoré znižujú kvalitu produktu **Vedľajšie** - Zber dát na podporu manažérskych rozhodnutí - Je produkt kompletný z hľadiska špecifikácie? - Sú jednotlivé komponenty logicky a ergonomicky spojené? - Minimalizovanie dôsledkov nízkej kvality - Potvrdenie súladu so špecifikáciou - ... ### Stratégia (Strategy) *Ako postupovať pre efektívne naplnenie cieľa?* **Stratégia je plán, ako splniť cieľ v definovanom kontexte.** V rôznych kontextoch sa naša stratégia pre splnenie zdanlivo rovnakého cieľa môže líšiť. - pr. tabuľkové výpočty (spreadsheet computation) pre PC hru vs. tabuľkové výpočty pre driver na RTG zariadenie Výber stratégie ovplyvňuje: - čo je naším cieľom? - ako agresívne chceme detekovať bugy? - ktoré bugy sú dôležitejšie ako ostatné? - ako dôkladne má byť testovanie zdokumentované? ### Oracle *Ako zistiť úspešnosť testovania?* **Oracle (v kontexte testovania) je detekčný mechanizmus alebo princíp, pomocou ktorého zisťujeme, či produkt prešiel alebo neprešiel testom.** - To, že tester tvrdí, že program prešiel testom, neznamená, že program je správny s ohľadom na testovanú vlastnosť. Záleží od použitého Oracle. - V zásade môže každý test prejsť/zlyhať s vhodným Oraclom. - Musíme poznať kontext, odhadnúť metriky, pomocou ktorých zákazník bude posudzovať problém. **Uľahčenie testovania:** - vyhýbať sa testom, ktoré neodhalia žiaden problém - vyhýbať sa testom, ktoré odhalia irelevantné problémy V prípadoch, keď nedokážeme jasne definovať ciele (*pr. ako presne sa veľkosti musia rovnať, aby sme mohli povedať, že veľkosti sú správne?*) alebo získanie úplných informácií a ich vyhodnocovanie je príliš komplikované a drahé, využijeme **heuristiku** (približné riešenie, založené na odhade, intuícii, skúsenosti, zdravom rozume). **Heuristika** - umožňuje zjednodušiť problém s rozhodovaním - radí, ako postupovať v danom kontexte - **nezaručuje** správne rozhnodnutie - by nemala byť založená na žiadnych skrytých vedomostiach - rôzne heuristiky môžu viesť k protichodným rozhodnutiam - **nevýhody:** - môže byť subjektívna - môže spôsobiť viac problémov ako úžitku **Konzistencia ako heuristika:** Chceme byť konzistentní s ostatnými funkciami produktu, podobnými produktami, špecifikáciou, štandardmi, očakávaniami zákazníka atď. **Nedokonalosti pri rozhodovaní** - *Neúmyselná slepota* - tester neberie do úvahy výstupy, ktorým nevenuje pozornosť alebo mu nie je povedané, že ich ma zahrnúť do výstupov - *Princíp neistoty* - prítomnosť pozorovateľa môže mať vplyv na to, čo sa pozoruje. - Z jedného testu **je nemožné** odpozorovať všetky možné výstupy. **Automatizácia Oraclu** - eliminuje ľudské chyby - vedie k opakovateľným postupom - umožňuje rýchlejšie vyhodnocovanie testov **Definujeme akýsi súbor očakávaných výstupov (SOV), ktorý sa musí rovnať výstupom testu.** *pr. MS Word môže byť použitý ako SOV pre testovanie WordPadu.* Sme schopní automatizovať len **čiastočne**, nikdy neautomatizujeme úplne všetko. **Problém automatizácie** - Amount of Agreement (výška dohody) - musí byť definovaný AoA - je 99% agreement stále agreement? - ako definujeme percento agreementu? - False Alarms (falošný poplach) - používanie zastaraných očakávaných výstupov - Neodhalené chyby - SOV vykazuje rovnakú chybu, ako výstup testu - neúmyselná slepota ### Metódy merania (Measure Methods) *Koľko z nášho plánu testovania bolo splneného? Ako ďaleko sme od naplnenia cieľa?* #### <u>Pokrytie testov ako metrika/Coverage as a Measure</u> - Pokrytím chápeme časť zdrojového kódu (riadky kódu, podmienky, volania funkcií, vetvenie...), ktorá bola skontrolované aspoň jedným testom. - Zväčša sa jedná o percento, ktoré vyjadruje, koľko finálneho produktu bolo otestovaného - jedným z cieľov testovania môže byť dosiahnutie daného percenta pokrytia. - pre manažérov sa jedná o číselné vyjadrenie koľko produktu ešte zostáva na otestovanie **Nevýhody** - môže prehliadnúť niektoré neočakávané vstupy - Netestuje správne časti produktu, ktoré sa spoliehajú na externé služby. **Na čo dávať pozor** - kompletné pokrytie **nezaručuje** kvalitu produktu - zvykneme uprednostňovať kvantitu pred kvalitou - zavádzajúce uspokonenie **Kritéria pokrytia pre control-flow grafy (CFG) (grafy riadenia toku):** ![](https://i.imgur.com/DNloWb8.png) - *Pokrytie statementov/Statement coverage* - každý statement (zadanie, vstup, výstup, podmienka - to, čo je v grafe vo vnútri geometrických útvarov) je spustený aspoň v jednom teste - hodnoty premenných nutné na dosiahnutie plného pokrytia (graf hore): (x=2, y=1, z=4, w=3); 1 test - *Pokrytie hrán/Edge coverage* - každá hrana grafu (vetva programu) je spustená aspoň raz - plné pokrytie: (x=2,y=1,z=4,w=3), (x=3,y=3,z=5,w=7); 2 testy - *Pokrytie podmienok/Condition coverage* - každá podmienka je boolean kombinácia **elementárnych podmienok** (`x<y`, `even(x)`) - každá elem. podmienka by mala byť vyhodnotená aspoň v jednom teste ako TRUE a v jednom ako FALSE. - V priloženom grafe stačia 2 testy (TRUE and TRUE; FALSE and FALSE). - *Pokrytie hrán/podmienok (Edge/Condition coverage)* - pokrytie zároveň hrán aj podmienok - *Pokrytie viacerých podmienok/Multiple condition coverage* - každá true/false kombinácia musí byť prítomná aspoň v jednom teste - exponenciálny nárast testov - 4 testy v priloženom grafe - *Pokrytie cesty/Path coverage* - každá spustiteľná cesta/priebeh je vykonaná aspoň v jednom teste (v prípade uvedeného grafu 2 testy) - počet ciest môže byť nekonečný pri neobmedzenom cykle v CFG Kritérium A **obsahuje** kritérium B (označené A → B), ak pri plnom pokrytí (full coverage) typu A zaručíme plné pokrytie typu B - *Cyklické pokrytie/Cycle coverage* - počet iterácií v cykle - žiadne pokrytie okrem *path coverage* neodráža počet iterácií v tele cyklu - Ak je hranica *n* známa pre počet vykonaní cyklu, skúste navrhnúť testy, kde sa cyklus vykoná (*n − 1*), (*n*) a (*n + 1*)-krát. **Pokrytie pre data-flow grafy (DFG) (grafy toku dát)** - detekuje nepoužité premenné - pri niektorých priechodoch/cestách môže byť premenná nastavená na konkrétny účel, no neskôr môže byť jej hodnota zneužitá na iný účel - pokrýva cesty cez CFG, ktoré prechádzajú miestom, kde sa premenná používa, ale nie je definovaná pozdĺž všetkých prichádzajúcich ciest cez CFG. **Weibullovo rozdelenie/Weibull Distribution** - Počet objavených chýb za časovú jednotku. - Môže sa využiť ako mierka pre zostávajúce množstvo testovania. ![](https://i.imgur.com/yfLaS81.png) - V momente keď krivka dosiahne vrchol, je možné predpovedať zostávajúcu časť krivky, preto je možné nastaviť časový okamih, kedy očakávaný počet chýb objavených za týždeň klesne pod daný threshold (prah). **Nedokonalosti Weibullovho rozdelenia** - Testovanie nesleduje obvyklé použitie produktu - Pravdepodobnosť odhalenia chyby je pri rôznych chybách iná - Oprava môže spôsobiť ďalšie nové chyby - Chyby sú od seba závislé - Počet chýb v produkte sa časom mení - **závery:** - Weibullovo rozdelenie nie je veľmi spoľahlivé - Možno použiť iba pri veľkých projektoch pre veľmi hrubý odhad. **Zhrnutie** - Existujú metódy na meranie pokroku vo fáze testovania. Tie sú ale nespoľahlivé. - Silné zameranie na konkrétnu metódu merania môže ovplyvniť účinnosť testovania. ### Neúplnosť testovania (Incompletness of Testing) *Uvedomujeme si, že testovanie nemôže dokázať absenciu chyby?* - Počet testov, ktoré sa majú vykonať, je extrémne veľký. - Zdroje na testovanie sú vždy obmedzené. Čo **NIE JE** kompletné testovanie - Kompletné pokrytie - Keď testeri nenájdu žiadnu ďalšiu chybu - Plán testovania je dokončený Čo **JE** kompletné testovanie - Produkt neobsahuje žiadne skryté alebo neznáme chyby. Ak vznikne nový problém, testovanie **nemôže** byť kompletné. **Príčiny neúplnosti** - Počet testov je príliš veľký (nekonečný). - Na vykonanie všetkých testov by sme museli otestovať: - všetky možné vstupné hodnoty každej vstupnej premennej. - všetky kombinácie vstupných premenných - každý jeden beh systému - všetky kombinácie HW a SW, aj tie z budúcnosti :) - každú cestu, ako môže užívateľ systém používať - typická argumentácia: *„Toto by zákazník s našim produktom neurobil.“* **Zhrnutie** - Testovanie **nemôže** dokázať absenciu chyby. - Nie je možné otestovať všetky validné vstupy. - Existencia plánu testovania brzdí tvorivosť/kreativitu pri testovaní ## 1b. Symbolické prevedenie a Concolic Testing/Symbolic Execution and Concolic Testing Chceme otestovať program pre všetky možné vstupy. Je ale ťažké odhaliť chyby, ktoré sa systematicky prejavujú iba pri špecifických vstupných hodnotách. ### Testovacie stratégie **Black-box** - Vnútorne detaily programu (zdrojový kód) sú neznáme, resp. neberieme ich v úvahu - analýza správania vstupov a výstupov **White-box** - Vnútorné detaily berieme do úvahy, napr. Code Coverage - Vloženie chyby, zmena produktu za účelom testovania - V podstate rozšírenie black-box testovania ### Symbolic Execution (SE) - Spústime program tak, aby sa hodnoty vstupných premenných namiesto skutočných hodnôt označovali symbolmi. ![](https://i.imgur.com/wdKt6hp.png) **Vetvenie (Branching):** Vetvenie v kóde zavádza určité obmedzenia dát v závislosti na stave bodu vetvenia **Podmienka cesty (Path Condition; PC):** - Vzorec nad symbolmi odkazujúci na vstupné hodnoty. - Kóduje históriu výpočtu, tj. kumulatívne obmedzenia vyplývajúce zo všetkých prechádzajúcich vetviacich bodov až do aktuálneho bodu provedení (point of execution). - Na začiatku nastavené na **true**. **Neuskutočniteľné cesty (Unfeasible Paths)** - Path condition môže byť neuskutočniteľný (**UNSAT**). V takom prípade neexistujú žiadne vstupy, ktoré by chod danou cestou uskutočnili (viď obrázok) ![](https://i.imgur.com/0mZQg1T.png) ### Symbolic Execution Tree (SET) - SET reprezentuje všetky možné prechody programom - získame ho "rozvinutím" CFG programu - **Node/uzol** stromu kóduje umiestnenie programu (location), symbolickú reprezentáciu premenných (symbolic valuation) a konkrétny path condition (obrázok) ![](https://i.imgur.com/878QO9S.png) - hrana v strome zodpovedá symbolickému vykonaniu programovej inštrukcie na danom mieste - Bod vetvenia (branching point) spôsobuje aktualizáciu path condition pre jednotlivé vetvy **Ukážka SET** ![](https://i.imgur.com/tFhxc6p.png) **Vlastnosti SET** - Žiadne uzly nie sú zlúčené, aj keď sú rovnaké - Jedno umiestnenie programu (location) môže byť obsiahnuté v (nekonečne) mnohých uzloch stromu. - SET môže obsahovať nekonečné cesty. - *Path Explosion problem* - Množstvo vetiev v SET môže byť veľmi veľké - Množstvo ciest môže narástať exponenciálne s počtom navštívených bodov vetvenia **Vlastnosti programov využívajúcich SET** - identifikácia ne/realizovateľných ciest - dôkaz o dosiahnuteľnosti daného umiestnenia programu. - detekcia chýb (delenie nulou, out-of-array access...) *Ak vzorec zakódovaný ako PC je vyhovujúci pre symbolický chod, model vzorca vracia konkrétne vstupné hodnoty, vďaka ktorým program bude nasledovať symbolický chod* **Automatizované generovanie testov** 1. Vygenerujte náhodné vstupné hodnoty 2. Vykonajte s tými hodnotami prechádzku cez SET a zaznamenaj PC 3. Vytvorte novú PC z tej z bodu 2 tak, že zrušte jedno z obmedzení týkajúce sa bodu vetvenia. 4. Nájdite vstupné hodnoty vyhovujúce novej PC 5. Opakujte od bodu 2, kým nedosiahnete požadované pokrytie kódu **Limity pre SE** - *Nerozhodnosť* - Použitie zložitých aritmetických operácií na neobmedzených doménach znamená všeobecnú nerozhodnosť problému spokojnosti so vzorcom (formula satisfaction problem). - SET je nekonečný (kvôli odvíjaniu cyklov s neviazanám počtom iterácií) - *Výpočetná zložitosť* - path explosion problem - Efektivita algoritmov pre uspokojenie vzorcov (formula satisfiability) na konečných doménach - *Ďalšie limity* - Symbolické operácie s nečíselnými premennými. - Nie je jasné, ako zaobchádzať s dynamickými dátovými štruktúrami. - Symbolické vyhodnocovanie volaní v externých funkciách ### Nástroje pre SAT riešenia **Satisfiability problem - SAT (problém uspokojiteľnosti)** - cieľom rozhodnúť, či existuje hodnota booleovských premenných výrokovej logickej formuly, vďaka ktorej je vzorec pravdivý (true) **Vlastnosti SAT problemu** - známy NP-úplný problém, polynomiálny algoritmus pravdepodobne nebude existovať. - existujú ale riešenia SAT, ktoré sú veľmi účinné a vďaka množstvu heuristík dokážu vyriešiť prekvapivo náročné problémy. **Satisfiability Modulo Theory - SMT** - Cieľom rozhodnúť o uspokojivosti logiky prvého rádu s predikátovými a funkčnými symbolmi, které kódujú jednu alebo viacej vybraných teorií, napr. - Aritmetika celých a desatinných čísel - Teórie o dátových štruktúrach (zoznamy, polia, bitové vectory...) - Inštancia SMT je zovšeobecnením boolovskej inštancie SAT, v ktorej sú rôzne množiny premenných nahradené predikátmi z rôznych základných teórií. Vzorce SMT poskytujú oveľa bohatší modelovací jazyk, ako je možné pri booleovských vzorcoch SAT (*wiki*). **Nástroj: ZZZ/Z3** - SAT a SMT (Satisfiability Modulo Theory) Solver - Štandardizované binárne API na použitie v iných overovacích nástrojoch. - od Microsoft Research - [https://www.rise4fun.com/Z3](https://www.rise4fun.com/Z3) **Príklad:** ![](https://i.imgur.com/KSwa5wJ.png) **Splniteľnosť a platnosť/Satisfiability and Validity** - Vzorec je splniteľný, iba ak je jeho negácia nesplniteľná. - SAT Solvers nielen rozhodujú o splniteľnosti vzorcov, za priaznivých okolností nám vrátia aj konkrétne hodnoty premenných, pre ktoré je vzorec splniteľný. - V prípade, že theorem je neplatný, Solvers nam poskytnú protipríklad (negácia je splniteľná) ### Concolic Testing = Concrete and Symbolic Testing **Problém** V praxi neznáme výsledky často znamenajú nesplniteľnosť (nebol nájdený žiaden svedok). Preskakovanie ciest, o ktorých si iba myslíme, že sú nerealizovateľné, však môže viesť k neodhaleniu chýb. Na druhú stranu, vykonanie (execution) nerealizovateľnej cesty môže hlásiť neskutočné chyby. **Parciálne riešenie** 1. Použijeme súčasne skutočné aj symbolické hodnoty, aby sme podporili rozhodnutia, ktoré sú prakticky nerozhodnuteľné SAT alebo SMT Solvermi. - **Conc**rete and Symb**olic** Testing=Concolic Testing 2. Heuristika 3. Vyhodnotenie: UNKNOWN⇒SAT <u>**Demo**</u> ``` 1. input A,B 2. if (A==(B*B)%30) then 3. ERROR 4. else 5. return A ``` **Concolic testing:** 1. A=22, B=7 (náhodné hodnoty), test spustený, žiadne chyby nenájdené. 2. (22==(7*7)%30) = *false*, path condition (PC):α != (β∗β)%30 3. Syntéza vstupných dát z negácie PC:α= (β∗β)%30 – **UNKNOWN** 4. Zakomponuj konkrétne hodnoty: α= (7∗7)%30 –**SAT**, α=195 A=19, B=7 6. Test objavil chybu v programe na riadku 3. ### SAGE Tool *len 1 informatívny slide* **Whitebox Fuzzing** 1. Začnite s dobre formovaným vstupom (nie náhodným) 2. Skombinujte s **generačným** vyhľadávaním/generational search (?) (Nie DFS) 1. Znegujte 1:1 **každé** obmedzenie v obmedzení cesty 2. Vytvorte **veľa** detí pre každý beh rodiča 3. Vyzvite **všetky** vrstvy aplikácie skôr/Challenge all the layers of the application sooner (???) 4. Využite drahý symbolic execution. - Vyhľadávacie priestory sú **obrovské**, hľadanie je len **čiastočné** ... napriek tomu **efektívne** pri hľadaní chýb! ![](https://i.imgur.com/3Ez5n6R.png) ## 2. Ověřování modelu pro formule LTL a CTL *prednášky 3-6* ## 2a. Overovanie modelu LTL/LTL Model Checking ### Verifikácia reaktívnych a paralelných programov/Verification of Reactive and Parallel Programs *Verifikácia==Overovanie **Paralelné programy** - Komponenty súčasne prispievajú k zmene stavu výpočtu. - Význam pochádza z vkládania akcií (transformačných krokov) jednotlivých komponent - **Významovú funkciu (meaning function) (?) kompozície nie je možné získať zložením významových funkcií zúčastnených zložiek.** - Výsledok závisí na konkrétnom vkládaní (interleaving) **Príklad nezlučiteľnosti** - paralelný systém: `(y=x; y++; x=y)‖(y=x; y++; x=y)` - I/O premenná $x$ - Významová funkcia oboch procesov: `λx->x+1` - Kompozícia:`(λx->x+1)·(λx->x+1)` - `(λx->x+1)·(λx->x+1)0 = 2` ![](https://i.imgur.com/YEX0QSl.png) Obecne nevieme odvodiť správnosť systému ze správnosti jeho komponent. Nemôžeme rozložit problém kontroly správnosti systému na dílčí problémy, tj. obmedziť ho iba na overenie správnosti všetkých zúčastnených komponent systému. **Špecifikácia/Specification** *Príklad:* - Eventy A a B nastanú pred eventom C. - Užívateľ nemôže zadať novú hodontu, pokiaľ systém nespracuje predošlú - Procedúra X nemôže byť spustená zároveň procesmi P a Q (vzájomné vylúčenie/mutual exclusion) - Po každej akcii A okamžite následuje sled akcíí B,C a D ### Model Checking - Prístup k formálnemu overovaniu systémov. - Založená na prieskume stavu a priestoru systému. **Prehľad** 1. Zostavte formálny model $M$ overovaného systému. 2. Vyjadrite špecifikáciu ako vzorec (formula) *φ* vybranej temporálnej logiky - (*Temporálna logika je odvetvie logiky, ktoré skúma logickú štruktúru výrokov o čase s ktorými klasická výroková alebo predikátová logika nedokážu plnohodnotne narábať.*) 3. Rozhodnite, či $M|=φ$, teda či *M* je model vzorca *φ* - Ako vedľajší účinok rozhodnutia môže vzniknúť **protiklad** (voliteľné) - Protipríkladom je sled stavov, ktoré sú svedkami porušenia vzorca (v prípade, že je systém chybný). - **Model checking (proces rozhodovania) môže byť plne automatizovaný pre všetky konečné (a niektoré nekonečné) modely systémov.** ![](https://i.imgur.com/eAkhZS0.png) **Model checkers:** Softvérové nástroje, ktoré môžu rozhodnúť o platnosti vzorca nad modelom overovaného systému. - SPIN, UppAal, SMV, Prism, DIVINE... **Modelovacie jazyky:** - procesy popísané ako konečné stavové automaty (finite state machines, FSM) - Rozšírenie umožňuje používať zdieľané alebo lokálne premenné a strážiť vykonávanie prechodu booleovským výrazom. - Niektoré prechody môžu byť synchronizované s prechodmi iných FSM/procesov ### Modelovanie a formalizácia overených systémov/Modelling and Formalization of Verified Systems - Systém je možné chápať ako množinu stavov, ktoré sú prechádzané vykonaním pokynov programu. - **Stav** = hodnota (alebo ohodnotenie -> valuation) modelovaných premenných. **Atomic Propositions (AP)** - Základné výroky popisujíce vlastnosti jednotlivých stavov, napr.: `max(x, y) ≥ 3` - Platnosť AP pre daný stav musí byť rozhodnuteľná informaciami zakódovanými len stavom. - Množstvo pozorovateľných udalostí a skutočností závisí od množstva abstrakcie použitej pri modelovaní systému. ### Kripkého štruktúra/Kripke Structure **Neformálne** Kripkeho štruktúra je variacia prechodového systému (transition system), ktorá sa používá pri kontrole modelu k reprezentácií správania systému. Skládá se z *grafu*, ktorého uzly predstavujú *dosiahnuteľné stavy* systému a ktorého hrany predstavujú *prechody stavov* (state transitions), spolu s *popisnou funkciou* (labelling function), ktorá mapuje každý uzol na množinu vlastností, ktoré majú odpovedajúci stav. *(wiki)* - Nech AP je množina atómových prepozícií - Kripkého štruktúra je štvorica $(S,T,I,s_0)$, kde - $S$ je konečná množina stavov - $T⊆S×S$ ke prechodový vzťah (transition relation) - $I:S→2^{AP}$ je interpretácia AP (labelling function podľa wiki) - $s_0∈S$ je počiatočný stav **Kripkeho prechodový systém/Kripke Transition System** - Nech *Act* je množina inštrukcií spustiteľná programom - Kripkeho štruktúru je možné rozšíriť pomocou prechodového označenia a vytvoriť Kripkeho prechodový systém - Kripke Transition System je pätica $(S,T,I,s_0,L)$, kde - *$(S,T,I,s_0)$* je Kripke structure - *L: T -> Act* je označovacia funkcia (labelling function) ![](https://i.imgur.com/M4h4kaj.png) ![](https://i.imgur.com/dbDVt7t.png) **Beh systému** - maximálna cesta (taká, ktorú nemožno predĺžiť) v grafe vyvolaná Kripkeho štruktúrou, začínajúc v počiatočnom stave. - Nech $M=(S, T, I, s_0)$ je Kripkeho štruktúra. **Beh** je postupnosť stavov $π=s_0,s_1,s_2,...$ takých, že $∀i∈N_0*(s_i, s_{i+1})∈T$. **Konečné cesty a behy** - Niektoré konečné cesty $π=s_0,s_1,s_2,...,s_k$ nemôžu byť rozšíriteľné, ak $∄s_{k+1}∈S.(s_k,s_{k+1})∈T$. - Technicky, vieme premeniť maximálnu konečnú cestu na nekonečnú opakovaním úplne posledného stavu. - Maximálna cesta $s0,...,s_k$ bude braná ako nekonečný beh $s_0,...,s_k,s_k,s_k,...$ **Implicitný a explicitný popis systému** Kripke structure, ktorá zachytáva správanie systému, nie je zvyčajne definovaná úplným výčtom stavov a prechodov (explicitne), ale zdrojovým kódom programu (implicitne). Implicitný popis má tendenciu byť exponenciálne stručnejší. **State-Space Generation (Stavovo-priestorová generácia?)** - výpočet explicitnej reprezentácie z implicitnej - interpretácia implicitnej reprezentácie musí byť formálne presná V praxi programovacie jazyky nemajú presnú formálnu sémantiku. Model checkers často stavia na modelovacích jazykoch ### Formalizácia vlastnosti systému/Formalizing System Properties *Ako formálne popísať vlastnosti jedného behu?* *Ako mechanicky overiť ich spokojnosť/uspokojenie (satisfaction)?* - Využitie konečného automatu ako mechanického pozorovateľa behu - Behy sú nekonečné - Konečné automaty pre nekonečné slová (ω-regulárne jazyky/ω-regular languages) - Podmienka prijatia Büchi - automat akceptuje slovo, ak neustále (nekonečne veľa) prechádza akceptačným stavom. ### Büchi automata/Buchi automat Büchiho automat je v teorii automatů ω-automat, který rozšiřuje koncept konečného automatu pro nekonečné vstupy (slova nekonečné délky). Büchiho automat akceptuje slovo, pokud existuje běh automatu, který navštíví alespoň jeden koncový stav nekonečněkrát (*wiki*) - n-tica $A=(Σ,S,s,δ,F)$, kde - Σ je konečná množina symbolov, - S je konečná množina stavov, - $s∈S$ je počiatočný stav, - $δ:S×Σ→2^S$ je prechodová funkcia (transition relation, na wiki to je transition function), - $F⊆S$ je množina *koncových/akceptačných stavov*; automat akceptuje slovo, pokud je alespoň jeden z koncových stavů navštíven nekonečněkrát - *(Barnat=accepting state, EN wiki=acceptance condition, CZ wiki=koncový stav)* **Jazyk akceptovaný Büchi automatom:** - Beh ρ automatu A nad nekonečným slovom $w=a_1a_2...$ je sekvencia stavov $ρ=s0,s1,...$ takých, že $s_0≡s$ a $∀i:s_i∈δ(s_{i−1},a_i)$ - $inf(ρ)$– Množina stavov ktoré sa vyskytnú nekonečne mnoho krát v ρ. - Beh ρ je akceptujúci práve keď $inf(ρ)∩F!=∅$ - Jazyk akceptovaný automatom je množina všetkých slov, pre ktoré existuje akceptujúci beh. - Označené ako $L(A)$ **Skratky pre Transition Guards (stráž medzi prechodmi)** 1. Nech $AP={X,Y,Z}$ 2. Prechod označený ako {X} označuje, že *X* musí byť *true* pri spústení prechodu, zatiaľ čo Y a Z sú false. 3. Ak chceme vyjadriť, že X je true, Z je false, a pre Y nám to je jedno, musíme vytvoriť dva prechody označené ako {X} a {X, Y}. **APs ako boolean vzorce** - Prechody medzi dvoma rovnakými stavmi možno kombinovať a označiť boolovským vzorcom nad APs. - Prechody {X}, {Y}, {X, Y}, {X, Z}, {Y, Z} a {X, Y, Z} je možné spojiť do jedného, označeného $X ∨ Y$. (*neviem, prečo tu nie je Z, možno chyba v materiáloch, môžete upraviť, ak tomu rozumiete*) - Ak neexistujú žiadne obmedzenia pri uskutočňovaní prechodu, môže byť označený ako $true≡X∨¬X$. ### Linear Temporal Logic (LTL)/Lineárna časová logika **Neformálne** - **Vzorec/Formula φ** - sa vyhodnotí na základe jedného behu Kripkeho štruktúry - vyjadruje platnosť APs v stavoch pozdĺž daného behu **Temporal operators of LTL:** - Fφ— φ eventuálne bude platiť (Budúcnosť/(F)uture). - Gφ— φ platí stále (Globálne/(G)lobally). - φUψ— φ platí, kým eventuálne ψ nebude platiť (Kým/(U)ntil). - Xφ— φ platí po vykonaní jedného prechodu, teda v ďalšom prechode (Ne(X)t/Ďalší). - φRψ— ψ platí, kým $φ∧ψ$ neplatí (( R )elease/Prepustenie). - φWψ— ako Until, ale ψ nikdy nemusí začať platiť ((W)eak Until). ![](https://i.imgur.com/NEXdMAg.png) **Syntax LTL** Nech $AP$ je množina atomic propositions - Ak $p∈AP$, potom p je vzorec LTL. - Ak φ je vzorec LTL, potom $¬φ$ je vzorec LTL. - Ak φ a ψ sú vzorce LTL, potom $φ∨ψ$ je vzorec LTL. - Ak φ je vzorec LTL, potom $Xφ$ je vzorec LTL. - Ak φ a ψ sú vzorce LTL, potom $φUφ$ je vzorec LTL. Alternatívne: $φ::=p|¬φ|φ∨φ|Xφ|φUφ$ **Syntaktické skratky:** ![](https://i.imgur.com/2dI3dkJ.png) **Modely LTL vzorcov** - Nech $AP$ je množina atomic propositions - Model LTL vzorca je beh $π$ Kripkeho štruktúry - Nech $π=s_0,s_1,s_2,...$ - Prípona behu $π$ začínajúca na $s_k$ sa označuje ako $π^k=s_k,s_{k+1},s_{k+2},...$ - K-tý stav behu sa označuje ako $π(k) =s_k$. **Sémantika LTL** Predpoklady: - Nech $AP$ je množina atomic propositions - Nech $π$ je beh Kripkeho štruktúry $M=(S,T,I,s0)$ - Nech $φ,ψ$ je syntakticky správna LTL formula - Nech $p ∈AP$ označuje atomic proposition ![](https://i.imgur.com/68taFOK.png) **LTL Model Checking** - systém sa berie ako množina behov - Systém spĺňa vzorec LTL tehdy a jen tehdy, pokiaľ všetky behy systému spĺňajú formulu. - Inými slovami, akýkoľvek beh porušující formulu je svedkom toho, že systém vzorec nespĺňa. **Lemma**: - Pokiaľ konečný stavový systém (finite state system) nespĺňa LTL vzorec, môže to byť svedkom **lasso-shaped** behu. ![](https://i.imgur.com/5u7G9Vn.png) - Všimnime si, že $π^ω$ označuje nekonečné opakovanie $π$ ### Prístup založený na automatoch na LTL model checking *Snáď túto časť môžeme skipnúť, je celkom hard... Pár slajdov je dokonca šedo zafarbených, neviem, či to Barnát sám nepreskakoval.* ### Detekcia akceptačných cyklov/Detection of Accepting Cycles Akýkoľvek automat môže nekonečne mnohokrát navštíviť akceptačný stav, iba ak obsahuje cyklus cez ten akceptačný stav. <span style="color:red"> **Akceptačný cyklus/Accepting cycle =??**</span> *môžete doplniť podľa vášho uváženia, ja to neviem popísať, v slajdoch nie je priama definícia* - Detekovať akceptačný cyklus dokážeme s pomocou **Nested DFS** algoritmu pri zložitosti $O(|V| + |E|)$ *Zvyšok časti viacmenej grafové algoritmy, skipujem* ### Klasifikácia Büchi automatov *Konečný stav == Akceptačný stav asi?* **Konečné Büchi automaty/Terminal Büchi Automata** - Všetky akceptačné cykly sú vlastné smyčky (self-loops) na akceptačných stavoch označených ako true. **Slabé Büchi automaty/Weak Büchi Automata** - Každá silne spojená komponenta automatu sa skladá buď z akceptačných alebo neakceptačných stavov **Automat $A¬φ$** - pre radu LTL formulí φ je $A¬φ$ konečný alebo slabý - $A¬φ$ je typicky celkom malý - Typ $A¬φ$ môže byť vyrátaný pred verifikáciou - Typy komponent automatu $A¬φ$: - **Neakceptačný (Non-accepting)** - Neobsahuje žiadne akceptačné cykly - **Silno akceptačný (strongly accepting)** - každý cyklus je akceptačný **<u>$A¬φ$ je konečný Buchi automat (BA)</u>** - Pre dôkaz existencie akceptačného cyklu stačí dokázať dosiahnuteľnosť ktoréhokoľvek akceptačného stavu v $A¬φ$ - Proces overovania je redukovaný na problém dosiahnuteľnosti. **“Bezpečnostné” vlastnosti/"Safety" properties** - Tie vlastnosti LTL formule φ, pre ktoré $A¬φ$ je konečným BA - Dosiahnuteľnosť je dostačujúca na dokázanie vlastnosti (proof the property) **<u>$A¬φ$ je slabý Buchi automat (BA)</u>** - Neobsahuje žiadne čiastnočné akceptačné komponenty - Pre dôkaz existencie akceptačného cyklu stačí dokázať existenciu dosiahnuteľného cyklu v silne akceptačnej komponente. - Dokáže byť detekovaná jedinou DFS procedúrou - Existuje časovo optimálny algoritmus, ktorý sa ale nespolieha na DFS. **"Slabé" LTL vlastnosti/"Weak" LTL properties** - Tie vlastnosti LTL formule φ, pre ktoré $A¬φ$ je slabým BA - Typicky, responzivita: $G (a⇒F (b))$ *(?)* **Klasifikácia LTL vlastností** Každá LTL formula spadá do jednu z týchto tried: - Reactivity (reaktivita) - Recurrence (opakovanie) - Persistance (stálosť) - Obligation (povinnosť/záväzok) - Safety (bezpečnosť) - Guarantee (záruka) Vlastnosti *Guarantee* triedy môžu byť popísané konečným Buchi automatom. Vlastností tried *persistance, obligation, safety* môžu byť popísanú slabým Buchi automatom **Negácia vo verifikačnom procese ($φ→A¬φ)$)** - $φ∈Safety⇐⇒¬φ∈Guarantee$ - $φ∈Recurrence⇐⇒ ¬φ∈Persistance$ ![](https://i.imgur.com/2gglIrD.png) ### Vysporiadavanie sa s "výbuchom" stavového priestoru/Fighting State Space Explosion *Boj proti štátnej vesmírnej explózii :space_invader:* **State Space Explosion (SSE):** Systém je bežne zložený kompozíciou paralelných procesov. V závislosti od poradia vykonávania akcií paralelných procesov vznikajú rôzne prechodné stavy. Počet dosiahnuteľných stavov môže byť **exponenciálne** väčší ako počet riadkov kódu. **Následky**: - Hlavná pamäť nedokáže uložiť všetky stavy automatu produktu, lebo ich je príliš veľa - Algoritmy pre detekciu akceptačných cyklov trpia nedostatkom pamäti **Metódy vysporiadavania sa so SSE** - *Stavová kompresia/State compression* - lossless/lossy (bezstrátová či stratová) - *Overovanie za behu* - *Symbolická reprezentácia stavového priestoru* - *Znížený počet stavov produktového automatu* - zavedenie atomických blokov - čiastočné poradie vykonávania akcií procesu - vyhýbanie sa skúmaniu symetrických častí - *paralelná a distruibuovaná verifikácia* <u>**Partial Order Reduction**</u> Predstavme si systém pozostávajúci z procesov A a B. A je schopný vykonávať akciu α, zatiaľ čo B je sekvencia akcií β, napr. $β_1,...,β_m$ **Unreduced State Space** ![](https://i.imgur.com/cuWjRO5.png) Vlastnosť, ktorú chceme verifikovať: **Dosiahnuteľnosť stavu $r$** Behy $(αβ_1β_2...β_m), (β_1αβ_2...β_m), ... ,(β_1β_2...β_mα)$ sú totožné s ohľadom na skúmanú vlastnosť *r*. Stačí nam teda brať do úvahy zástupcu z tejto triedy ekvivalencie, napr. $(β_1β_2...β_mα)$ ![](https://i.imgur.com/3JIrrCn.png) Zástupcu získame odkladom akcie α. Nevyberajte všetkých bezprostredných nástupcov počas skúmania stavového priestoru (state-space exploration), ale vyberajte opatrne iba niektorých z nich. Vybrať správnu a optimálnu podmnožinu nástupcov je rovnako ťažké ako vygenerovať celý stavový priestor. Preto sa používa heuristika. - Zmenšený stavový priestor musí obsahovať akceptujúci cyklus a iba vtedy, ak to robí neredukovaný stavový priestor. - Vzorec LTL nesmie používať operátor *X* (podtrieda LTL). **Distributed and Parallel Verification/ Distribuovaná a paralelná verifikácia** *Princíp:* Využitie agregovaného výkonu viacerých CPU, zvýšená pamäť a výpočetný výkon PC Typická implementácia Nested DFS algoritmu sa spolieha na hashovací mechanizmus, preto sa k hlavnej pamäti pristupuje veľmi náhodne. Ak nároky na pamäť presiahnu množstvo dostupnej pamäte, nastane **[thrashing](https://cs.wikipedia.org/wiki/Memory_thrashing)**. Preto namiesto DFS sa používajú iné grafové postupy: - Bread-first search alebo value propagation (šírenie hodnôt?) je možné efektívne vypočítať paralelne. ### Zhrnutie - Overovanie Modelu **Validita vlastností/Properties validity** - Vlastnosť, ktorá sa má overiť, môže byť porušená jedným konkrétnym (aj keby mimoriadne nepravdepodobným) behom systému, ktorý je predmetom kontroly. - Postup rozhodovania sa opiera o skúmanie stavového grafu (exploration of state space graph) systému. **State Space Explosion** - Ak k tomu nie sú dôvody,všetky systémové behy musia byť brané v úvahu - počet stavov, ktoré môže systém dosiahnuť, je exponenciálne väčší, ako veľkosť popisu systému - Dôvody: Data explosion, asynchronný paralelizmus **Výhody Model Checkingu** - aplikovateľné na HW, SW, Embedded systémy, Model-based development... - *matematická presnosť* - Výsledkom rozhodovacieho postupu je $M |= φ$, len a len v takom prípade - *Model checkery* - pri rozhodovaní nevyžaduje prítomnosť človeka, poskytuje svedkov a protipríklady **Nevýhody Model checkingu** - *nie vhodné na všetko*- napr. či program na výpočet faktoriálu skutočne vyráta n! pre dané n - je ale úplne OK skontrolovať, či pre hodnotu 5 vždy vratí hodnotu 120 - *spolieha sa na konštrukciu modelu* - validita formule je garantovaná pre model, nie vymodelovaný systém (?) - *veľkosť stavového priestoru*- kvôli SSE, praktická aplikovateľnosť je limitovaná. - Aplikovateľné najmä na konečné statové priestory (finite state space) - *verifikuje len to, čo bolo špecifikované* - problemy nezahrnutú vo vzorcoch nemusia byť objavené ## 2b. Overovanie modelu CTL/CTL Model Checking **Systém ako množina behov** - **Run/Beh** - množina stavových sekvencií. - vlastnosti systému = vlastnosti behu - popísateľný s **Linear-time logic/LTL** **Systém ako rozvetvená štruktúra** - *Computation Tree/Výpočtový strom* - rozvetvené štruktúra možných spustení z jednotlivých stavov systému - vlastnosti systému = vlastností stromu - popísateľný s branching-time logic/**Computation tree logic/CTL** ![](https://i.imgur.com/9hvEFhi.png) ### Computation Tree Logic (CTL) **Neforemne:** Pre daný uzol výpočtového stromu popisuje podstrom zakorenený v danom uzle všetky možné behy, ktoré systém ešte môže vykonať. Každý takýto beh je možným budúcim výpočtom. **CTL formuly umožňujú** - Špecifikáciu stavových kvalít s atómovými propozíciami. - Kvantifikáciu možných budúcich výpočtov - Obmedziť množinu možných budúcich výpočtov (kvantifikovanými) LTL operátormi *Príklad:* $φ≡EF(a)$ - =Je možné vykonať budúci výpočet tak, aby $a$ nakoniec vo výpočte platilo (*It is possible to take a future computation such that 'a' will hold true in the computation eventually*) **Syntax CTL** A = along (A)ll paths (inevitable) = **platí vždy** E = along at least (there (E)xists) one path (possibly) = **platí aspoň raz** *pre zvyšnú notáciu, pozri LTL vyššie* Nech AP je množina atomic propositions: - Ak $p∈AP$, potom $p$ je CTL formula - Ak $φ$ je CTL formula, potom $¬φ$ je CTL formula - Ak $φ$ a $ψ$ sú CTL formuly, potom $φ∨ψ$ je CTL formula - Ak $φ$ je CTL formula, potom $EXφ$ je CTL formula - Ak $φ$ a $ψ$ sú CTL formuly, potom $E[φUψ]$ je CTL formula - Ak $φ$ a $ψ$ sú CTL formuly, potom $A[φUψ]$ je CTL formula **Alternatívne: $φ::=p|¬φ|φ∨φ|EXφ|E[φUφ]|A[φUφ]$** ![](https://i.imgur.com/lN1wJBT.png) **Modely CTL formuly** - Nech AP je množina atomic propositions - Model CTL formuly je stav s∈S Kripkeho štruktúry $M=(S,T,I,s0)$ - *pripomenutie:* - Beh Kripkeho štruktúry je maximálna cesta začínajúca od počiatočného stavu štruktúry - Konečné maximálne dráhy sa považujú za nekonečné behy z dôvodu nekonečného opakovania posledného stavu na ceste - $P_M(s)$ = ($π|π$ je beh iniciovaný v stave $s$) **Sémantika CTL** - Nech AP je množina atomic propositions - Nech $p∈AP$ je atomic proposition - Nech $s∈S$ je stav kripkeho štruktúry $M= (S,T,I,s_0)$ - Nech $φ,ψ$ označujú syntakticky korektné CTL formuly ![](https://i.imgur.com/ZuRfKs1.png) ### Model Checking CTL/Overovanie Modelu CTL Ak je platnosť vzorcov/formuly $φ$ a $ψ$ známa pre všetky stavy, je možné z nich ľahko odvodiť platnosť vzorcov $¬φ,φ∨ψ,EXφ,...$ **CTL Model Checking - Sketch** - Nech $M=(S,T,I)$ je Kripke structure a φ CTL formula - Označovacia funkcia (labelling function) **label: $S → 2^{2φ}$** sa počíta tak, že dáva platnosť všetkých podvzorcov φ pre všetky stavy Kripkeho štruktúry M. - **$s_0|=φ⇐⇒φ ∈ label(s_0)$** - Funkcia **label** sa počíta postupne pre jednotlivé podformule φ, počnúc najjednoduchšou podformulou, pokračujúc k zložitejším podformulám, končiac samotným φ. **Sub-formuly vzorca φ** - φ je CTL formula - Množina všetkých podformulí/subformulí vzorca φ označujeme ako $2^φ$ - $2^φ$ je definované indukčne podľa štruktúry vzorca φ, viď obrázok: ![](https://i.imgur.com/jsy2vBQ.png) **Ekvivalentné existenčné formy CTL** - Je jednoduchšie dokázať platnosť existenčne kvantifikovaných [modálnych operátorov](https://en.wikipedia.org/wiki/Modal_operator) ako platnosť univerzálne kvantifikovaných - Na účely overenia vlastností špecifikovaných CTL, je možné vyjadriť vzorec CTL v ekvivalentne expresívnej existenciálnej podobe CTL. **Ekvivalentná CTL Syntax** **$φ::=p|¬φ|φ∨φ|EXφ|E[φUφ]|EGφ$** **Komplexita algoritmu pre CTL Model Checking** - Algoritmus CTLMC vykazuje **$O(|φ||S|)$** priestorovú a **$O(|φ|(|S|+|T|))$** časovú komplexitu. ### CTL Príklad - mikrovlnná rúra ![](https://i.imgur.com/cH9kweK.png) <br/> **Transformácia a validita** ![](https://i.imgur.com/yxmiWE9.png) ### CTL* - rozšírenie CTL Každé použitie temporálneho/časového operátora vo vzorci CTL musí bezprostredne predchádzať kvantifikátor, t.j. použitie modálneho operátora bez kvantifikácie nie je možné. **Logika CTL*** Ako pri CTL, využíva rozvetvenú časovú logika (branching time logic). Narozdiel od CTL ale povoľuje samostatné využívanie modálnych operátorov **Príklad** $A[p∧X(¬p)]$ - je CTL*, nie je CTL **Syntax CTL*** - Kvantifikátory E a A sú samostatnými operátormi v pravidlách konštrukcie syntaxe. Výsledkom sú dva typy vzorcov v CTL*: **path/cestné** a **state/stavové** formuly. - Aplikácia operátorov E a A na path formulu (vzorec, ktorého model je *behom* Kripkeho štruktúry) má za následok state formulu (vzorec, ktorého model je *stavom* Kripkeovej štruktúry) **state formula**: $φ::=p|¬φ|φ∨φ|Eψ$ **path formula**: $ψ::=φ|¬ψ|ψ∨ψ|Xψ|ψUψ$ **Sémantika CTL*** - Nech AP je set atomic propositions a p∈AP - Nech M=(S,T,I) je Kripke structure - Nech $φ_i$ označuje CTL* state formulu, a $ψ_i$ path formulu ![](https://i.imgur.com/KNsR7Nm.png) ### Porovnanie výpovednej sily (expressive power) LTL, CTL a CTL* - každá LTL formula je CTL* path formula - každá CTL formula je CTL* state formula - Model path formule je beh Kripkeho štruktúry - Model state formule je stav Kripkeho štruktúry - = Nie veľmi vhodné na porovnávanie **Dôsledky** *Dôkazy vynecháme...* - LTL a CTL sú neporovnateľné čo sa týka výpovednej sily - AG(EF(q)) je CTL formula nevyjadriteľná v LTL - FG(q) je LTL formula nevyjadriteľná v CTL - CTL* je striktne viac výpovedný ako LTL - každá LTL formula je CTL* formula - CTL* formula AG(EFq) sa nedá v LTL vyjadriť - CTL* je striktne viac výpovedný ako CTL - každá CTL formula je CTL* formula - CTL* formula FG(q) sa nedá v CTL vyjadriť (*pred chvíľou to bola LTL formula, teraz CTL\*, neviem, či chyba alebo nie*) - Existujú vlastnosti vyjadriteľné v LTL aj v CTL - CTL formula A[p U q] je rovná LTL formule *p U q* ### Ordered Binary Decision Diagrams/OBDD - Verifikačné algoritmy ukládajú množiny stavov - Množina stavov môže byť videná ako množina binárnych vektorov - Množina binárnych vektorov môže byť popísaná ako **Boolean funkcia** - formula vo výrokovej logike nad danou množinou boolean premenných **Binary Decision Tree/Binárny rozhodovací strom (BDT)** - Nasmerovaný strom s jedným koreňovým stavom - Každý vnútorný uzol je označený booleovskou premennou (v) a má presne dvoch nástupcob označovaných ako (low (v), high (v)). - Každému listu je priradená binárna hodnota, tj. 0 alebo 1. - Každá kombinácia hodnôt vstupných premenných zodpovedá presne jednej ceste od koreňa BDT po list. - Hodnoty uložené na listoch vracajú hodnotu funkcie pre príslušné vstupné hodnoty ![](https://i.imgur.com/Mh67rFF.png) **Binary Decision Diagram/binárny rozhodovaná diagram (BDD)** - BDT sú zbytočne náročné na priestor (obsahujú nadbytočné informácie). - Acyklický smerovaný graf, ktorého vrcholy majú výstupný stupeň buď nula (list) alebo dva (vnútorný vrchol). - Inak rovnaké vlastnosti, ako BDT ![](https://i.imgur.com/NaH8Q5J.png) **Ordered Binary Decision Diagram/ Usporiadaný BDD (OBDD)** - Niektoré prechodné znázornenia vypočítané počas minimalizácie BDD sú tiež platné BDD. - Daná boolovská funkcia môže byť reprezentovaná viacerými rôznymi BDD - Minimálny BDD vypočítaný z BDD alebo BDT s pevným poradím premenných vo vnútorných vrcholoch **je unikátny**. - BDD s fixným usporiadaním premenných sa označuje ako **ordered/usporiadaný BDD** (OBDD) ![](https://i.imgur.com/KjT6JJM.png) Každý OBDD reprezentuje nejakú boolean funkciu. Boolean funkcie môžu byť komnibované/kompozované s použitím unárnych a binárnych operátorov, ako $¬,∧,∨,⇒,XOR,...$. OBDD môže byť zložený rovnako. ### Symbolický prístup ku CTL Model Checkingu **Algorithm Idea** - Nech M=(S,T,I) je Kripke structure a φ je CTL formula - Labelling funkcia $label:S→2φ$ sa vyráta, hovoriac ktoré subformule z φ sú validné v ktorých stavoch *M* - samozrejme, $s0|=φ⇐⇒φ∈label(s0)$ - Funkcia **label** sa počíta postupne pre každú subformulu φ, počínajúc nejjednoduššími subformulami (atomic propositions/atomové výroky) a končiac po výpočtu validity φ **Realizácia** 1. Sada stavov reprezentovaných s OBDDs 2. Boolean funkcie na vyhodnotenie atomic propositions formujú počiatočné OBDDs 3. Podľa štruktúry overenej formule sa vyrátajú OBDDs pre zložitejšie podformule 4. Testovanie členstva počiatočného stavu Kripkeovej štruktúry v množine stavov vyhovujúcich overenej formule **Pripomenutie Syntaxe CTL** $φ::=p|¬φ|φ∨φ|EXφ|E[φUφ]|EGφ$ **Výpočet množiny stavov splňujúcich (satysfying) CTL formulu** *Notácia:* - F(ψ)označuje množinu stavov splňujúcich ψ - *Succ(X)* označuje bezprostredných nástupcov stavov v množine *X* - *Pred(X)* označuje bezprostredných predchodcov stavov v množine *X* *Boolean funkcie pre atomic propositions:* - atomic propositions popisujú vlastnosti stavu premenných - at. prop. môžu byť zakódované ako boolean funkcie *Výpočet boolean operátorov $¬$ a $∨$* - $F(¬ψ1) =¬(Fψ1)$ - $F(φ∨ψ) =F(φ)∨F(ψ)$ ### Model Checking - Zhrnutie **Enumeratívny vs. symbolický prístup** *Enumeratívny* - zameraný na "control-flow" (*poradie operácií atď.*) *Symbolický* - zameraný na "data-flow" (*kde sú data smerované, ake transformácie sú prevedené atď.*) **Výhody v súvislosti s testovaním** - nevyžaduje zdrojový kód (môžeme aplikovať na modely) - vhodné na testovanie paralelných programov **Výhody v súvislosti so statickou analýzou** - Kompletné pre systémy s konečným stavovým priestorom. - Verifikácia temporálnych/časových vlastností **Nevýhody** - State space explosion ## 3. Ohraničené overovanie modelu/Bounded Model Checking (BMC) *prednáška 8* ### Kontrola bezpečnostných vlastností cez SAT redukciu **Safety property/bezpečnostná vlastnosť:** Bezpečnostná vlastnosť tvrdí že nič zle počas exekúcie nenastane (A safety property asserts that nothing bad happens during execution)*(oreilly)* **Bounded Model Checking** **Hypotéza:** Ak systém obsahuje chybu, je možné ju reprodukovať iba s malým počtom kontrolovaných krokov **Myšlienka metódy:** Keď používame model checking pre detekciu chyby, je rozumné skontrolovať či chyba (porušenie [violation] špecifikácie) nastane v prvých *k* krokoch spustenia **Redukcia BMC na SAT** *Prerekvizity:* - Množina prefixov dĺžky *k* všetkých behov Kripkeho štruktúre *M* môže byč zakódovaná Boolean formulou $[M]^k$ - Porušenie bezpečnostnej vlastnoti (safety property), ktoré môže byť pozorované do *k* krokoch systému, môže byť zakódované ako $[¬φ]^k$ *Redukcia:* - Skontrolujeme uspokojivosť $[M]^k∧[¬φ]^k$ - uspokojivosť indikuje existenciu protipríkladu dĺžky *k* - neuspokojivosť indikuje neexistenciu protipríkladu dĺžky *k* **Kripke Structure ako Boolean formula** *Prerekvizity:* - M=(S,T,I) je Kripke structure s počiatočným stavom $s_0∈S$ - ľubovoľný stav s∈S môže byť reprezentovaný bitovým vektorom dĺžky *n*, teda stav $s=〈a_0,a_1,...,a_{n−1}$ *Zakódovanie M Boolean formulou* - *Init(s)* - formula ktorá je uspokojivá pre ohodnotenie (valuation) premenných $a_1,a_2,...,a_n$, ktoré popisujú stav $s_0$ - *Trans(s,s')* - formula ktorá je uspokojivá pre dvojicu stavových vektorov s,s' iff (vtedy a len vtedy) ohodnotenia $a_1,a_2,...,a_n,a′_1,a′_2,...,a′_n$ popisujú stavy medzi ktorými prechod (transition) $(s,s') ∈ T$ existuje. **Zakódovanie konečných behov M** *Popis systémových behov dĺžky $k$* - beh dĺžky *k* pozostáva z *k+1* stavov $s_0,s_1,...,s_k$ - množina všetkých behov dĺžky *k* štruktúry *M* je označená ako **$[M]^k$** a popísaná následovným vzorcom: ![](https://i.imgur.com/ZOyV3Rk.png) *Príklad:* ![](https://i.imgur.com/5znVrly.png) ### Úplnosť BMC/Completeness of BMC <span style="color:red">*V tejto sekcii sa dosť hovorí o grafe. Neviem, o aký graf sa jedná, v slajdoch k tomu nič nie je. Môžete doplniť, ak tomu rozumiete.* *(A možno rovno skipnúť pri tom množstve matematickej notácie)*</span> **Graph diameter/priemer grafu (d)** je dĺžka najdlhšej z najkratších ciest medzi každou dvojicou vrcholov v grafe. **Úplnosť BMC na zisťovanie porušení bezpečnosti** Porušenie nie je možné dosiahnuť pomocou cesty dĺžky *k*. Cesty kratšie ako *k* nie sú zakódované v $[M]^k$ *Horná hranica na k* - Ak $k≥d$, kde *d* je priemer grafu (**???**), všetky možné miesta chýb (error location) sú objavené - Priemer grafu (**???**) je ohraničený hodnotou $2^n$, kde *n* je počet bitov stavového vektoru *Riešenie*: **Iteratívna exekúcia BMC pre každé $k∈[0,d]$** **Automatická detekcia priemeru grafu** - Pýtať sa užívateľa je nereálne - Bezpečné horné ohraničenie je mimoriadne nadhodnotené - Chceli by sme, aby verifikačná procedúra sama vedela zistiť, či by *k* malo byť ešte navýšené alebo nie **Kostra algoritmu pre úplný BMC:** ![](https://i.imgur.com/iHLauEj.png) **Ukončenie BMC - acyklické cesty** *Notácia cesty:* ![](https://i.imgur.com/qc5NsGO.png) *Notácia cesty bez cyklu (acyklickej):* ![](https://i.imgur.com/5tPRUjb.png) *Podmienka ukončenia v kostre algoritmu BMC* - Žiadna ďalšia acyklická cesta z počiatočného stavu už neexistuje, nasledujúca formula je neuspokojivá: $Init(s_0)∧loopFree(s_{[0..i+1]})$ - **Platí symetricky pre spätnú dosiahnuteľnosť z chybových stavov.** ![](https://i.imgur.com/AFkXg6J.png) *Kritérium ukončenia s vyššou účinnosťou* - Pri aplikácií spätnej dosiahnuteľnosti zo stavov $¬φ$ nemusia byť brané v úvahu cesty, ktoré navštevujú iné stavy $¬φ$. - Symetricky platí aj pre doprednú dosiahnuteľnosť s viacerými počiatočnými stavmi: pre detekciu úplnosti nie je potrebné brať do úvahy cesty, ktoré navštívia iné počiatočné stavy. ![](https://i.imgur.com/IRnASos.png) **BMC nezačínajúce s k=0** - Pre malé hodnoty *k*, SAT dotazy nevrátia ani protipríklad, ani neumožnia ukončenie. - BMC chceme začať s k>0. *Originálny test na existenciu protipríkladu:* $SAT(Init(s_0)∧path(s_{[0..k]})∧ ¬φ(s_k))$ musíme zmeniť, aby sme nevynechali protipríklady kratšie ako počiatočnú hodnotu *k* *Nový test na existenciu protipríkladu:* $SAT(Init(s_0)∧path(s_{[0..k]})∧ all.φ(s_k))$ **Acyklické vs najkratšie cesty v BMC** Acyklická cesta môže byť oveľa dlhšia, ako priemer grafu. ![](https://i.imgur.com/HiHCjol.png) - BMC je korektné, ak *loopFree* nahradíme *shortest* - Predikát *shortest* ale potrebuje kvantifikátory a nie je až taká čistá SAT aplikácia ### LTL a BMC LTL je dobre definovaný iba pre nekonečné behy. Na hodnotenie LTL na konečných cestách používame logiku s tromi hodnotami (true, false, cannot say). O platnosti niektorých vzorcov LTL nemožno rozhodnúť na nijakej konečnej ceste (napr. *GF a*). Cykly, ktoré pozostávajú iba z niekoľkých stavov, BMC rozvinú na acyklické dráhy dĺžky *k*. Povolíme kódovanie laso-shaped ciest. To je, **(k,l)-cyklické cesty.** **(k,l)-cyklické behy** ![](https://i.imgur.com/DovY31u.png) - Ak π je k-l cyklický, π je taktiež (k+1, l+1) cyklický - Považovanie konečných ciest za (k, k)-cyklické je nesprávne (mohlo by to vytvoriť neexistujúci chod v N). - Každá cesta dĺžky *k* je buď acyklická alebo (k,l)-cyklická **BMC pre LTL** - Zostrojíme boolovský vzorec [M, φ, k], ktorý je uspokojivý, ak má Kripkeova štruktúra M chod π taký, že π |= kφ. - $[M,φ,k]≡[M]^k∧[φ,k]$ *Kódovanie* ![](https://i.imgur.com/5Ff7YxO.png) **LTL triky v BMC** *Fragment **LTL-X*** - Znižuje počet prechodov (menšia inštancia SAT). - podobný partial order reduction ### Závery o BMC **Výhody BMC** - Redukuje na štandardný SAT problém, pokroky v SAT solving pomáhajú s BMC. - Často nachádza protipríklady minimálnej dĺžky (nie vždy). - Booleovské vzorce môžu byť kompaktnejšie ako reprezentácia OBDD *Verifikácia HW* - Vďaka k-indukcii veľmi úspešná metóda. *Verifikácia SW* - V současné době je podle Software Verification Competition(TACAS 2014), BMC v souvislosti s SMT je v současné době mezi nejlepšími metodami ověřování softwaru (ve skutečnosti padělání). **Nevýhody BMC** - Obecne není úplné (not complete) - Veľké inštancie SAT sú stále neriešiteľné. *Verifikácia SW* - Kódovanie celého CFG (control-flow graph) ako inštancie SAT je v súčasnosti nereálne - K-indukcia nemôže byť použitá (graf je nekompletný, žiadné zadné hrany [back edges] grafu) - Problémy s analýzou dynamických dátových štruktúr - Analýza slučky (loop analysis) je náročná - Neefektívne pre úplnú aritmetiku (čiastočne vyriešené SMT). ## 4.Abstrakcia prechodových systémov/Abstract Interpretation *prednáška 11* **Analýza programu** - Odvodiť vlastnosti programu zo zdrojového kódu a... - využiť ich na programovú optimalizáciu (program optimization) - využiť ich na **programovú verifikáciu** (program verification) *Nerozhodnuteľnosť* - Platnosť všetkých zaujímavých vlastností programu napísaných vo všeobecnom programovacom jazyku je algoritmicky nerozhodnuteľná. **Abstrakcia:** Skrytie podrobností s cieľom zjednodušiť analýzu. Zameriava sa na správne, aj keď neúplné riešenie. *Použitie:* - Vytvoriť (zvyčajne konečný stavový) model overovaného systému. (Nasledovaný napr. Model checkingom) - Spustenie systému v kontexte abstrakcie - **abstraktná interpretácia.** *Ďalšie prístupy:* - testovanie - fixkná vstupná množina hodnôt - BMC - obmedzený prieskum celého stavového priestoru - Symbolic Execution - praktická nerozhodnuteľnosť (practical undecidability) ### Datova a predikátová abstrakcia /Data and Predicate Abstraction **Data Abstraction** *Abstraction:* mapovanie konkrétnych stavov na abstraktné *Konkretizácia:* mapovanie abstraktných stavov na konkrétne ![](https://i.imgur.com/LTEor6e.png) **Abstract Transition System(ATS)/Abstraktný prechodový systém** *Prechody* - príkaz v programovom kóde: `A := A + A` - Konkrétna sémantika: - `<PC:12, A:15, B:0> -> <PC:13, A:30, B:0>` - Abstraktná sémantika: - `<PC:12, A:Odd, B:Even> -> <PC:13, A:Even, B:Even>` *Nedeterminizmus v ATS* - Abstraktný stav: `<PC:13, A:Even, B:Even>` - kod: `A:=A div 2` ![](https://i.imgur.com/6jNghgw.png) **Vzťah mezi abstraktnými a konkrétnymi prechodovými systémami** *approximation/aproximácia:* a value or quantity that is nearly but not exactly correct. *over-approximation:* An approximation that is higher than the true value. *under-approximation:* An approximation that is lower than the true value. *Over-approximation* - Každý beh konkrétneho systému je prítomný v konkretizácii nejakého abstraktného behu (beh abstrahovaného prechodového systému) - Môžu existovať behy, ktoré sú obsiahnuté v konkretizácii nejakého abstraktného behu, ale nie sú povolené v konkrétnom prechodovom systéme *Under-approximation* - Každý beh prítomný v konkretizácii ľubovoľného abstraktného behu je existujúci beh konkrétneho prechodového systému. - Môžu existovať behy konkrétnych prechodových systémov, ktoré nie sú prítomné pri konkretizácii abstraktného behu **Verifikácia aproximovaných prechodových systémov** *Verifikácia over-approx. systémov* - Absencia chyby v ATS dokazuje absenciu chyby v CTS (concrete transition system/konkrétny prechodový systém) - Chyba v ATS môže, ale nemusí indikovať chybu v CTS - Chyba v ATS, ktoré nie je chybou v CTS, sa označuje ako *false positive* (spurious error, false alarm) *Verifikácia under-approx. systémov* - Chyba v ATS dokazuje prítomnosť chyby v CTS - Absencia chyby v ATS nedokazuje absenciu chyby v CTS - Chyba v CTS, ktorá nie je prítomná v ATS je označovaná ako *false negative* **Predikátová abstrakcia** *Predikáty* - boolean výrazy o hodnotách premenných. Príklad definície ATS: *〈Program Counter, Validity of selected predicates〉* *Množstvo abstrakcie* - množstvo predikátov ovplyvňuje presnosť abstrakcie - *menej predikátov* -> veľká nejednoznačnosť, menší stavový priestor - *viac predikátov* -> väčšia presnosť, väčší stavový priestor **Poznámky ku predikátovej abstrakcii** *Analýza abstraktných behov vedúcich k chybe:* - Rozhodnutie o platnosti behu (je to false alarm?) - Odobranie nových predikátov na spresnenie abstrakcie *Veľkosť ATS:* Veľkosť stavového priestoru rastie **exponenciálne** s počtom predikátov *Možné riešenie (neviem čoho, asi tej veľkosti?):* Predikáty sú viazané na konkrétne umiestnenia programu. ## 5. Metóda CEGAR/CEGAR Approach *11. prednáška* *CEGAR works by iteratively constructing and refining abstractions until a proper precision is reached (wiki)* **Princíp CEGAR metódy** - Vzhľadom na počiatočnú množinu predikátov je systém abstrahovaný (abstracted) predikátovou abstrakciou. - ATS (over-approximation) je overený model checking procesom - V prípade, že sa nahlásený protipríklad považuje za falošný, analyzuje sa s cieľom odvodiť nové predikáty a spresniť abstrakciu predikátov. - Proces sa opakuje, pokiaľ nenájdeme skutočný protipríklad alebo pokiaľ systém nie je úspešne overený *Poznámky:* - Odvodiť nové predikáty je veľmi ťažké. **Schéma CEGAR metódy** ![](https://i.imgur.com/mrOBQmI.png) ### Základy abstraktnej interpretácie a statickej analýzy programov *Neviem, či to ešte súvisi s CEGARom, je to v rovnakej prednáške* Reprezentácia programu - **Flow-graph** (FG) - "špeciálna verzia" control-flow grafu (CFG) - každá hrana je strážená jedným guardom alebo definuje jedno priradenie *Cieľ:* Vypočítať vlastnosti jednotlivých vrcholov FG - *príklady:* - Zistite rozsah hodnôt, ktoré môže mať konkrétna premenná v danom umiestnení programu. - Vypočítajte množinu aktívnych premenných v danom umiestnení programu. **Všeobecný pohľad na abstraktnú interpretáciu** *Rozklad vlastnosti* - Vlastnosť, ktorá sa má overiť všeobecným postupom analýzy programu, je možné rozložiť na hodnoty lokálnych údajov priradené k jednotlivým vrcholom ( C )FG. - Výsledok overenia je zložený alebo odvodený od lokálnych hodnôt k vrcholom FG *Zlepšenie hodnoty (Value Improvement)* - Je definované, ako hrana ( C )FG zlepšuje (lokálne aktualizuje) rozkladanú hodnotu vlastnosti, ktorá sa má overiť. - Aplikácia lokálnych aktualizácií postupne (monotónne) vylepšuje (aproximuje) celkové riešenie **Všeobecný algoritmus pre výpočet abstraktnej interpretácie** *Inicializácia* - Spočiatku je každému vrcholu priradená vhodná hodnota. - Každá hrana grafu je zaznačená ako *nespracovaná (unprocessed)* *Výpočet* 1. Vyberte nespracovanú hranu grafu a vykonajte lokálnu aktualizáciu relevantnú pre hranu a súvisiace vrcholy. Ak aktualizácia vylepšila riešenie, označte hranu ako *nespracovanú* znova. 2. Opakujte, kým existujú nespracované hrany, teda kým sa nedosiadne *pevný bod (fix point)* **Abstraktná interpretácia (AI)** - Výber správneho nastavenia môže mať za následok overenie (výpočet) mnohých zaujímavých vlastností programu. Toto sa často kombinuje s určitou datovou abstrakciou pre premenné. - AI môžeme vykonať na čiastočne odvinutých (unwinded) grafoch *Parametre* - Aká abstraktná doména je použitá - Smer update funkcie/funkcie aktualizácie (vpred, vzad, oba). - Čo update funkcia robí - Ako sú hodnoty zlúčené cez viac prichádzajúcich hrán. - Poradie spracovania nespracovaných hrán. - Detekcia ukončenia **Relevantné otázky abstraktnej interpretácie** *Existuje fix-point?* Zloženie domén hodnôt spojených s vrcholmi často vytvára úplnú mriežku. Knaster-Tarskiho veta hovorí, že každá monotónna funkcia nad takouto doménou má pevný bod. *Skončí niekedy výpočet?* Ak v zložení lokálnych domén neexistuje nekonečne stúpajúca postupnosť možných riešení, tak **áno**. V opačnom prípade nemusí byť ukončená. **Widening/Rozšírenie** - Pomocná transformácia medziproduktov taká, že zachováva správnosť a zároveň bráni existencii dlhej (možno nekonečnej) vzostupnej postupnosti hodnôt v príslušnej doméne. *Príklad:* Majme hranice presnosti, v ktorých chceme poznať rozsah možných hodnôt nejakej premennej. Za hranicami presnosti sa hodnoty rozšíria do nekonečna, tj. $+∞$ alebo $−∞$. ![](https://i.imgur.com/o9CxpUU.png) **Narrowing/Zúženie** - Používanie rozšírenia môže viesť k veľmi nepresným výsledkom. Urýchľuje však analýzu slučiek. - Po rozšírení môžu nadhodnotené hodnoty podliehať zúženiu (podobná, ale dvojitá technika). - Po W + N možno vypočítať iný fixný bod. - *pr.* interval [0,+∞] bude po narrowingu zmenšený na [0,n].