---
# System prepended metadata

title: 1 Verifikace a zajištění systémů
tags: [řvss, verifikace]

---

# 1 Verifikace a zajištění systémů
###### tags: `řvss`, `verifikace`
---


## 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?*

#### Pokrytie testov ako metrika/Coverage as a Measure
 
- 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&lt;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 &#34;rozvinutím&#34; 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.
    - **Concrete and Symbolic** Testing=Concolic Testing
2. Heuristika
3. Vyhodnotenie: UNKNOWN⇒SAT

**Demo**
```
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 -&gt; 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$ je 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 -&gt; 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.

&lt;span style=&#34;color:red&#34;&gt; **Akceptačný cyklus/Accepting cycle =??**&lt;/span&gt;
*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ý
    
**&lt;u&gt;$A¬φ$ je konečný Buchi automat (BA)&lt;/u&gt;**
- 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/&#34;Safety&#34; 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)

**&lt;u&gt;$A¬φ$ je slabý Buchi automat (BA)&lt;/u&gt;**
- 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.

**&#34;Slabé&#34; LTL vlastnosti/&#34;Weak&#34; 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 &#34;výbuchom&#34; 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*

&lt;u&gt;**Partial Order Reduction**&lt;/u&gt;
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 &#39;a&#39; 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)
&lt;br/&gt;
**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 &#34;control-flow&#34; (*poradie operácií atď.*)
*Symbolický* - zameraný na &#34;data-flow&#34; (*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&#39;)* - formula ktorá je uspokojivá pre dvojicu stavových vektorov s,s&#39; 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&#39;) ∈ 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

&lt;span style=&#34;color:red&#34;&gt;*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)*&lt;/span&gt;

**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&gt;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:
    - `&lt;PC:12, A:15, B:0&gt; -&gt; &lt;PC:13, A:30, B:0&gt;`
- Abstraktná sémantika:
    - `&lt;PC:12, A:Odd, B:Even&gt; -&gt; &lt;PC:13, A:Even, B:Even&gt;`

*Nedeterminizmus v ATS*
- Abstraktný stav: `&lt;PC:13, A:Even, B:Even&gt;`
- 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* -&gt; veľká nejednoznačnosť, menší stavový priestor
    - *viac predikátov* -&gt; 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)
- &#34;špeciálna verzia&#34; 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].