• No results found

Bounded Model Checking Using Java PathFinder

N/A
N/A
Protected

Academic year: 2021

Share "Bounded Model Checking Using Java PathFinder"

Copied!
52
0
0

Loading.... (view fulltext now)

Full text

(1)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INTELIGENTN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INTELLIGENT SYSTEMS

BOUNDED MODEL CHECKING

V N ´

ASTROJI JAVA PATHFINDER

DIPLOMOV ´

A PR ´

ACE

MASTER’S THESIS

AUTOR PR ´

ACE

Bc. VENDULA HRUB ´

A

AUTHOR

(2)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INTELIGENTN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INTELLIGENT SYSTEMS

BOUNDED MODEL CHECKING

V N ´

ASTROJI JAVA PATHFINDER

BOUNDED MODEL CHECKING USING JAVA PATHFINDER

DIPLOMOV ´

A PR ´

ACE

MASTER’S THESIS

AUTOR PR ´

ACE

Bc. VENDULA HRUB ´

A

AUTHOR

VEDOUC´I PR ´

ACE

Ing. BOHUSLAV K ˇ

RENA, Ph.D.

SUPERVISOR

(3)

Abstrakt

Diplomov´a pr´ace je vˇenovan´a aplikaci form´aln´ı metody bounded model checking pro au-tomatickou opravu chyb. Oprava se specializuje na chyby spojen´e se soubˇeˇznost´ı. Pr´ace je zamˇeˇrena na programy napsan´e v jazyce Java, a proto pro verifikaˇcn´ı metodu byl zvolen mo-del checker Java Pathfinder, kter´y je urˇcen pro Java programy. Vlastn´ı verifikaˇcn´ı metoda spoˇc´ıv´a v aplikaci strategie pro navigaci stavov´ym prostorem do m´ısta verifikace. Z dan´eho m´ısta je spuˇstˇen bounded model checking pro ovˇeˇren´ı opravy. Navigace stavov´ym prosto-rem je implementov´ana pomoc´ı strategie record&replay trace. Pro aplikaci bounded model checkingu jsou implementov´any dalˇs´ı parametry a moduly pro verifikaci speci´aln´ıch vlast-nost´ı syst´emu, kter´e ovˇeˇruj´ı koreknost opravy chyby. Bounded model checking se prov´ad´ı v okol´ı opravy.

Kl´ıˇ

cov´

a slova

Model Checking, Java PathFinder, Bounded model checking, verifikace, Record&Replay trace, automatick´a oprava, soubˇeˇznost, ovˇeˇrov´an´ı opravy

Abstract

This thesis deals with the application of bounded model checking method for self-healing as-surance of concurrency related problems. The self-healing is currently interested in the Java programming language. Therefore, it concetrate mainly on the model checker Java PathFin-der which is built for handling Java programs. The verification method is implemented like the Record&Replay trace strategy for navigation through a state space and performance bounded model checking from reached state through the use of Record&Replay trace stra-tegy. Java PathFinder was extended by new moduls and interfaces in order to perform the bounded model checking for self-healing assurance. Bounded model checking is applied at the neighbourhood of self-healing.

Keywords

Model Checking, Java PathFinder, Bounded model checking, verification, Record&Replay trace, self-healing, concurrency, healing assurance

Citace

Vendula Hrub´a: Bounded model checking v n´astroji Java PathFinder, diplomov´a pr´ace, Brno, FIT VUT v Brnˇe, 2008

(4)

Bounded model checking

v n´

astroji Java PathFinder

Prohl´

sen´ı

Prohlaˇsuji, ˇze jsem tuto diplovomou pr´aci vypracovala samostatnˇe pod veden´ım pana Ing. Bohuslava Kˇreny, Ph.D.

. . . . Vendula Hrub´a 19. kvˇetna 2008

Podˇ

ekov´

an´ı

Chtˇela bych podˇekovat cel´e sv´e rodinˇe, pr´atel˚um a spoluˇz´ak˚um za jejich podporu a pomoc pˇri studiu.

Tato pr´ace byla podpoˇrena Evropskou uni´ı v r´amci FP6-IST projektu SHADOWS (ˇc. smlou-vy IST-035157). Za obsah pr´ace odpov´ıd´a pouze jej´ı autor. Tato pr´ace nevyjadˇruje n´azor Evropsk´e unie a Evropsk´a unie nen´ı odpovˇedn´a za uˇzit´ı jak´ekoliv informace v pr´aci uveden´e.

Acknowledgment

This work is supported by the European Community under the Information Society Techno-logies (IST) programme of the 6th FP for RTD – project SHADOWS contract IST-035157. The authors are solely responsible for the content of this thesis. It does not represent the opi-nion of the European Community, and the European Community is not responsible for any use that might be made of data appearing therein.

c

Vendula Hrub´a, 2008.

Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Vysok´em uˇcen´ı technick´em v Brnˇe, Fakultˇe in-formaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena autorsk´ym z´akonem a jej´ı uˇzit´ı bez udˇelen´ı opr´ av-nˇen´ı autorem je nez´akonn´e, s v´yjimkou z´akonem definovan´ych pˇr´ıpad˚u.

(5)

Obsah

1 Uvod´ 3

2 Rozbor problematiky 5

2.1 Proces automatick´e opravy . . . 5

2.1.1 Princip opravy probl´emu . . . 6

2.1.2 Princip ovˇeˇren´ı opravy . . . 7

2.2 Form´aln´ı metody . . . 7

3 Model Checking 10 3.1 Model syst´emu . . . 11

3.2 Specifikace syst´emu. . . 12

3.3 V´ystup verifikace . . . 14

3.4 Probl´em stavov´e exploze . . . 14

3.5 Bounded Model Checking . . . 16

3.6 Navigace stavov´ym prostorem . . . 17

4 Java PathFinder 19 4.1 Z´akladn´ı charakterisitika . . . 20

4.2 Specifikace. . . 21

4.3 Prohled´av´an´ı stavov´eho prostoru . . . 22

4.4 Rozˇsiˇritelnost . . . 24

5 Implementace 25 5.1 Record&Replay trace v JPF . . . 26

5.1.1 Record&Replay pomoc´ı ChoiceGener´ator˚u. . . 27

5.1.2 Record&Replay pomoc´ı byte-code instrukc´ı . . . 28

5.1.3 Pˇr´ıklad na Record&Replay trace . . . 31

5.2 Bounded model checking v JPF . . . 33

5.2.1 Pˇr´ıklad na Bounded Model Checking . . . 35

5.3 Modifikace Replay trace pro projekt SHADOWS . . . 37

5.3.1 Replay trace pomoc´ı p˚uvodn´ım k´odu . . . 39

5.3.2 Replay trace pomoc´ı instrumentovan´eho k´odu . . . 39

5.4 V´ysledky a Testy . . . 41

5.4.1 Rychlost bˇehu programu ve pouˇzit´ych n´astroj´ıch . . . 42

5.4.2 Rychlost metody Record&Replay trace. . . 43

(6)
(7)

Kapitola 1

´

Uvod

V dneˇsn´ı dobˇe se setk´av´ame s poˇc´ıtaˇci nebo poˇc´ıtaˇcov´ymi programy t´emˇeˇr na kaˇzd´em kroku. At’ uˇz se jedn´a o mobiln´ı telefony, bankovn´ı ´uˇcty, pr˚umyslov´e stroje nebo ˇr´ıd´ıc´ı stˇrediska. Vˇzdy chceme, aby n´am naˇse pˇr´ıstroje pracovaly spr´avnˇe, coˇz ale jiˇz z principu nelze. O ˇz´adn´em rozs´ahlejˇs´ım programu nem˚uˇzeme prohl´asit, ˇze neobsahuje chyby, lze pouze ˇr´ıci, jak´e chyby neobsahuje. Jsou pˇr´ıpady, kdy n´am nevad´ı, ˇze program

”zatuhne“ nebo provede neplatnou akci, napˇr. pˇri pos´ıl´an´ı emailu se nepodaˇr´ı komunikace se serverem, email se neodeˇsle a jeho obsah je ztracen. V takov´em pˇr´ıpadˇe n´as chyba zamrz´ı, mus´ıme email napsat znova. M˚uˇze ovˇsem nastat situace, kdy se jedn´a o d˚uleˇzit´e ud´alosti, kter´e mohou zp˚usobit z´avaˇznˇejˇs´ı probl´emy – nepˇriˇcten´ı spr´avn´e ˇc´astky na bankovn´ı ´uˇcet, porucha na l´ekaˇrsk´ych pˇr´ıstroj´ıch, atd. V takov´em pˇr´ıpadˇe rozhodnˇe nechceme, aby program zatuhl nebo vykonal neoˇcek´avanou akci. Z toho d˚uvodu se vynakl´ad´a spousta penˇez na testov´an´ı a ovˇeˇrov´an´ı korektnosti program˚u, aby programy vykon´avaly pouze poˇzadovan´e ud´alosti.

I pˇres veˇsker´e snahy v programech z˚ust´avaj´ı chyby, kter´e se dostanou aˇz k uˇzivateli. D´av´a tedy smysl se zab´yvat opravou tˇechto chyb, kter´e se neodhal´ı pˇri testov´an´ı a snaˇzit se je opravit za bˇehu aplikace. Pr´avˇe o to se snaˇz´ı projekt SHADOWS, jehoˇz souˇc´ast´ı je i tato diplomov´a pr´ace. SHADOWS – A Self-healing Approach to Designing Complex Software Systems je evropsk´y projekt, kter´y se zab´yv´a procesem automatick´e opravy (self-healing approach). Princip procesu a jeho c´ıl se daj´ı specifikovat pomoc´ı n´asleduj´ıc´ıch ˇctyˇr z´akladn´ıch krok˚u:

1. zjiˇstˇen´ı probl´emu (problem detection) – pˇredt´ım neˇz se zaˇcne s opravou (l´eˇcen´ım) je potˇreba urˇcit, zda je v syst´emu nˇejak´y probl´em a ˇceho se t´yk´a,

2. nalezen´ı pˇr´ıˇciny probl´emu (problem localization) – druh´ym krokem po urˇcen´ı moˇzn´eho probl´emu v syst´emu je tˇreba tento probl´em lokalizovat resp. urˇcit m´ısto v programu (sledovan´em syst´emu), kde se probl´em vyskytuje,

3. oprava probl´emu (problem healing) – dalˇs´ım krokem je v´ybˇer akce, ze seznamu nab´ızen´ych l´eˇc´ıc´ıch akc´ı, kter´e je moˇzn´e pro opravu detekovan´eho probl´emu pouˇz´ıt, 4. ovˇeˇren´ı opravy (problem assurance) – posledn´ım krokem je ovˇeˇren´ı, zda

pro-vedn´ı opravn´e akce nezp˚usobilo v syst´emu jin´y probl´em. L´eˇc´ıc´ı akce zmˇen´ı chov´an´ı syst´emu, pˇredpokl´ad´ame, ˇze se nyn´ı syst´em bude chovat korektnˇe vzhledem k urˇcen´ym poˇzadavk˚um. Nicm´enˇe opravn´a akce m˚uˇze zmˇenit chov´an´ı syst´emu takov´ym zp˚usobem, ˇze se objev´ı jin´y probl´em. Z toho d˚uvodu je potˇreba prov´est ovˇeˇren´ı opravy.

(8)

Projekt SHADOWS se zab´yv´a splnˇen´ım funkˇcn´ıch poˇzadavk˚u, v´ykonem a v neposledn´ı ˇradˇe spr´avn´ym pouˇzit´ım soubˇeˇzn´eho prov´adˇen´ı v programu. Fakulta informaˇcn´ıch techno-logi´ı se v projektu vˇenuje ˇc´asti zamˇeˇren´e na soubˇeˇzn´e prov´adˇen´ı (concurrency). Pˇresnˇeji se vˇenuje l´eˇcen´ı chyb, kter´e vznikaj´ı pomoc´ı paralelismu resp. soubˇeˇznosti v syst´emu. Jedn´a se o chyby typu deadlocks, data races, lost notification, atd. L´eˇcen´ı se zamˇeˇruje na opravy chyb v Java programech, ve kter´ych se soubˇeˇznost implementuje velice snadno pomoc´ı vl´aken.

Tato diplomov´a pr´ace je vˇenovan´a posledn´ımu z uveden´ych krok˚u opravn´eho procesu – ovˇeˇren´ı l´eˇc´ıc´ı akce. K tomu, aby bylo moˇzn´e navrhnout vhodnou metodu pro ovˇeˇren´ı l´eˇc´ıc´ı akce, je zapotˇreb´ı zn´at, co l´eˇc´ıc´ı akce prov´ad´ı a jak´ym zp˚usobem funguje. Pokud zn´ame princip opravn´e akce, je moˇzn´e navrhnout a posl´eze implementovat metody pro ovˇeˇren´ı korektnosti opravy.

Dalˇs´ı text je dˇelen do n´asleduj´ıc´ıch kapitol. V druh´e kapitole jsou podrobnˇeji rozeps´any jednotliv´e kroky opravn´eho procesu pro lepˇs´ı porozumˇen´ı cel´eho procesu opravy. D´ale jsou zde struˇcnˇe pops´any form´aln´ı metody, ze kter´ych byla pro ovˇeˇren´ı opravy zvolena metoda model checking. O model checkingu, jeho z´akladech a principu pojedn´av´a tˇret´ı kapitola. Zde jsou tak´e pops´any jeho modifikace, probl´em stavov´e exploze a jeho moˇzn´a ˇreˇsen´ı. Ve ˇctvrt´e kapitole jsou nejprve uvedeny r˚uzn´e model checkery, ze kter´ych byl pro verifikaci zvolen mo-del checker – Java PathFinder. Jeho popis a nastaven´ı jeho vlastnost´ı jsou v t´eto kapitole tak´e uvedeny. Dalˇs´ı kapitola popisuje hloubˇeji zvolenou metodu pro verifikaci syst´emu z hle-diska implementace v Java PathFinderu. Jsou zde uvedeny pˇr´ıklady a dosaˇzen´e v´ysledky. Posledn´ı kapitolou je z´avˇer, kter´y obsahuje shrnut´ı v´ysledk˚u a n´astin dalˇs´ı pr´ace na pro-jektu.

(9)

Kapitola 2

Rozbor problematiky

2.1

Proces automatick´

e opravy

V n´asleduj´ıc´ıch odstavc´ıch budou podrobnˇeji rozeps´any jednotliv´e kroky procesu automa-tick´e opravy. Kroky procesu popisuj´ı princip l´eˇcen´ı chyb, kter´e vznikaj´ı soubˇeˇznost´ı v Java programech [12].

Zjiˇstˇen´ı probl´emu. V prvn´ım kroku se monitoruje vykon´av´an´ı programu. Monito-rov´an´ı prob´ıh´a pomoc´ı instrumentace programu nad byte-codem. Pokud by se chyba hledala na ´urovni byte-codu pomoc´ı ladˇen´ı (debugging), je velk´a pravdˇepodobnost, ˇze chyba ne-bude nalezena. Program na ´urovni byte-codu umoˇzˇnuje velk´e mnoˇzstv´ı moˇznost´ı prokl´ad´an´ı instrukc´ı a t´ım se sniˇzuje pravdˇepodobnost nalezen´ı chyby bˇehem testov´an´ı. Pomoc´ı instru-mentace se do programu zav´ad´ı tak´e ˇsum (dalˇs´ı instrukce), pomoc´ı kter´ych se zvyˇsuje pravdˇepodobnost odhalen´ı chyb vznikl´ych nespr´avn´ym prokl´ad´an´ım instrukc´ı (data race). Instrumentace k´odu se prov´ad´ı pomoc´ı n´astroje ConTest, kter´y pracuje nad Java byte-codem a jehoˇz bliˇzˇs´ı popis a specifikace jsou uvedeny v [5]. ConTest je n´astroj vyv´ıjen´y v´yzkumnou laboratoˇr´ı IBM pro testov´an´ı Java program˚u, kter´e obsahuj´ı v´ıce vl´aken [6].

Nalezen´ı pˇr´ıˇciny probl´emu. Nalezen´ı pˇr´ıˇciny probl´emu je obt´ıˇzn´y ´ukol i pro ˇclovˇeka, t´ım tˇeˇzˇs´ım ´ukolem se st´av´a navrˇzen´ı mechanizmu pro automatickou detekci pˇr´ıˇciny chyby. V projektu SHADOWS byly navrˇzeny metody pro automatickou detekci. Prvn´ı meto-dou je spr´avn´y odhad a v´ybˇer opravn´e akce ze speci´aln´ıho seznamu, kter´y byl navrˇzen pro v´ybˇer spr´avn´e opravy chyb vznikl´ych soubˇeˇznost´ı. Jedn´a se o n´asleduj´ıc´ı detektory: da-taRace detektor, atomRace detektor nebo deadlock detektor. Jinou moˇznost´ı je prov´adˇen´ı velk´eho mnoˇzstv´ı test˚u s r˚uzn´ymi body instrumentace a n´asledn´e statistick´e vyhodno-cen´ı dosaˇzen´ych v´ysledk˚u. Pomoc´ı z´ıskan´ych statistick´ych dat a korektnosti chov´an´ı pro-gramu v dan´em testu se d´a urˇcit probl´em. Oba v´yˇse popsan´e pˇr´ıstupy lze kombinovat s form´aln´ımi metodami (napˇr. model checkingem, statickou anal´yzou) a pomoc´ı nich sn´ıˇzit poˇcet false alarm˚u. False alarmy vznikaj´ı v pˇr´ıpadˇe, pokud je nadetekov´an probl´em, kter´y ve skuteˇcnosti v programu nen´ı. Z principu funkce form´aln´ıch metod, by se tyto metody daly aplikovat na samotnou lokalizaci probl´emu v syst´emu. Nicm´enˇe jejich aplikace na re´aln´y syst´em je problematick´a z d˚uvodu stavov´e exploze. Ta je kritick´ym probl´emem form´aln´ıch metod, kter´y br´an´ı jejich nasazen´ı na re´aln´e syst´emy a proveden´ı jejich celkov´e verifikaci.

Oprava probl´emu. N´astroj (tool) pro opravu probl´emu m˚uˇze b´yt zaloˇzen na v´ybˇeru opravn´e akce, kter´e jsou vyjmenov´any ve speci´aln´ım seznamu. Zvolen´a oprava detekovan´eho probl´emu m˚uˇze b´yt nab´ıdnuta v´yvoj´aˇri jako moˇzn´e ˇreˇsen´ı bˇehem v´yvoje syst´emu. V´yvoj´aˇr se pak s´am rozhodne, zda nab´ızenou akci provede ˇci nikoliv. C´ılem projektu je ovˇsem

(10)

l´eˇcit chyby, kter´e se projev´ı u uˇzivatele. Z´amˇerem je tedy l´eˇcit chyby, kter´e se jiˇz jednou v syst´emu vyskytly a na nˇe aplikovat opravu, a t´ım zamezit jejich opˇetovn´emu v´yskytu v aplikaci u uˇzivatele. Prozat´ım se l´eˇc´ıc´ı akce zamˇeˇruj´ı na probl´emy typu data races. Data races vznikaj´ı v d˚usledku paraleln´ıho pˇr´ıstupu ke sd´ılen´e promˇenn´e ve stejn´y ˇcasov´y okamˇzik z v´ıce m´ıst, jehoˇz d˚usledkem je konfliktn´ı z´apis do sd´ılen´e promˇenn´e. Moˇzn´ym ˇreˇsen´ım odstranˇen´ı probl´emu data race je pˇrid´an´ı z´amk˚u (locks). Pˇresnˇejˇs´ı popis jednotliv´ych oprav i samotn´eho probl´emu data race je bl´ıˇze uveden v [1,12].

Ovˇeˇren´ı opravy. Posledn´ım krokem procesu je ovˇeˇren´ı opravn´e akce. Bylo by chybn´e pˇredpokl´adat, ˇze lze navrhnout univerz´aln´ı opravu urˇcit´eho probl´emu, kter´a by fungovala za vˇsech okolnost´ı. Z toho d˚uvodu jsou navrˇzeny speci´aln´ı l´eˇc´ıc´ı akce pro konkr´etn´ı pˇr´ıpady v´yskytu urˇcit´eho probl´emu. Proto je tak´e potˇreba ovˇeˇrit, zda zvolen´a oprava chyby byla ´

uspˇeˇsn´a a bezpeˇcn´a (napˇr. ovˇeˇren´ı zda pˇrid´an´ı z´amk˚u pro odstranˇen´ı probl´emu data race, nezp˚usobilo jin´y probl´em – deadlock, apod.). Ke kontrole opravy je vhodn´e pouˇz´ıt form´aln´ı verifikaci, jedn´a se efektivn´ı metody pro ovˇeˇrov´an´ı spr´avnosti syst´emu. Mezi form´aln´ı me-tody patˇr´ı model checking, statick´a anal´yza nebo theorem proving. V pˇr´ıpadˇe jejich omezen´ı resp. modifikace je lze aplikovat na re´aln´y syst´em a zverifikovat ho.

Jak jiˇz bylo uvedeno v ´uvodu, k tomu aby bylo moˇzn´e navrhnout spr´avnou metodu pro ovˇeˇren´ı opravy, je potˇreba zn´at jej´ı podstatu a zp˚usob aplikace na probl´em resp. chybu.

2.1.1 Princip opravy probl´emu

Pˇredpokl´adejme, ˇze v monitorovan´em syst´emu byl lokalizov´an probl´em. Ten se nach´az´ı ve speci´aln´ım seznamu probl´em˚u, pro kter´e jsou navrˇzeny l´eˇc´ıc´ı akce. Posl´eze se zvolen´a l´eˇc´ıc´ı akce aplikuje na detekovan´y probl´em, a ta probl´em v programu oprav´ı [1]. Existuj´ı dvˇe moˇznosti jak opravu na probl´em aplikovat. Prvn´ı moˇznost´ı je pouze navrˇzen´ı opravy v´yvoj´aˇri, kter´y se s´am rozhodne, zda ji na opravu pouˇzije ˇci nikoliv. Druhou vhodnˇejˇs´ı metodou je pouˇzit´ı arichitektury listener˚u. Listenery umoˇznuj´ı modifikovat chov´an´ı syst´emu za jeho bˇehu bez nutnosti explicitn´ıho z´asahu do zdrojov´eho k´odu. Architektura listener˚u je souˇc´ast´ı jiˇz zmiˇnovan´eho n´astroje ConTest [5,16].

Oprava pomoc´ı pl´anov´an´ı. D´ıky monitorov´an´ı (sledov´an´ı) syst´emu za jeho bˇehu vznik´a v bˇehu programu ˇsum, resp. v programu se vykon´av´a v´ıce instrukc´ı neˇz v bˇeˇzn´em bˇehu programu bez monitorov´an´ı. Pomoc´ı tohoto mechanizmu je snadnˇejˇs´ı odhalit chyby vznikl´e soubˇeˇznost´ı, kter´e se projevuj´ı pouze pˇri urˇcit´em prokl´ad´an´ı instrukc´ı. K nespr´avn´ e-mu prokl´ad´an´ı instrukc´ı vedouc´ı k chybˇe doch´az´ı napˇr´ıklad pˇri vyt´ıˇzen´ı procesoru jin´ymi programy, kter´e nejsou bˇeˇznˇe pˇri testov´an´ı programu spuˇstˇeny. Proto monitorov´an´ı, kter´e tak´e potˇrebuje porv´adˇet vlastn´ı instrukce umoˇznuje odhalen´ı tˇechto chyb. Pro opravu po-dobn´ych chyb v Java programech je nˇekdy postaˇcuj´ıc´ı zavol´an´ı metody yield(). Metoda se zavol´a pˇred kritickou seck´ı, kde doch´az´ı k chybˇe. Princip metody yield() spoˇc´ıv´a v pˇrepnut´ı kontextu na jin´e vl´akno (aktu´aln´ı vl´akno se vzd´av´a procesoru), pˇri dalˇs´ım pˇridˇelen´ı proce-soru je jiˇz dostatek ˇcasu na vykon´an´ı kritick´e sekce vcelku (bez pˇrepnut´ı kontextu). Uvede-nou techniku lze kombinovat s pˇridˇelov´an´ım r˚uzn´ych priorit vl´akn˚um. V takov´em pˇr´ıpadˇe do kritick´e sekce m˚uˇze vstoupit nebo ji pˇreruˇsit pouze vl´akno se stejnou nebo vyˇsˇs´ı prioritou. Oprava pomoc´ı synchronizace. Zmiˇnovan´a ˇc´ast projektu SHADOWS je zamˇeˇrena na chyby, kter´e jsou zp˚usobeny nevhodn´ym pouˇzit´ım synchronizace, nebo kdyˇz synchroni-zace zcela chyb´ı. V pˇr´ıpadˇe chybn´eho pouˇzit´ı synchronizace obsahuje oprava vhodnou zmˇenu v synchronizaci. Pokud se jedn´a o probl´em chybˇej´ıc´ı synchronizaci nad sd´ılenou promˇennou, je tˇreba vˇenovat dostateˇcnou pozornost pˇrid´an´ı z´amku. Z´amek je potˇreba vloˇzit takov´ym

(11)

zp˚usobem, aby jeho pˇrid´an´ı nezp˚usobilo jin´y probl´em v syst´emu, typick´ym probl´emem je vznik deadlocku. Je tedy nutno ovˇeˇrit, zda pˇrid´an´ı z´amk˚u skuteˇcnˇe vyˇreˇsilo probl´em (data race) a d´ale zverifikovat, ˇze zm´ınˇen´a oprava nezp˚usobila v syst´emu jin´y probl´em.

2.1.2 Princip ovˇeˇren´ı opravy

Pro ovˇeˇren´ı opravy je moˇzn´e pouˇz´ıt techniky form´aln´ı verifikace jako model checking, sta-tickou anal´yzu atd. K tomu, aby bylo moˇzn´e form´aln´ı metody aplikovat na re´aln´y syst´em, je tˇreba udˇelat jejich omezen´ı nebo urˇcitou modifikaci. V tomto pˇr´ıpadˇe – ovˇeˇrov´an´ı opravy, nen´ı c´ılem zverifikovat cel´y syst´em, ale pouze okol´ı l´eˇcen´e chyby. Jde tedy o aplikaci form´aln´ı metody na konkr´etn´ı ˇc´ast programu a na kompletn´ı re´aln´y syst´em. Aplikace form´aln´ı me-tody m˚uˇze vypadat n´asledovnˇe.

Pouˇzit´ı statick´e anal´yzy nad byte-codem: v pˇr´ıpadˇe pouˇzit´ı opravn´e akce – pˇrid´an´ı z´amk˚u (lock/unlock) je tˇreba ovˇeˇrit, zda nov´e z´amky nejsou v kolizi s jiˇz naimplementovanou synchronizac´ı. Pˇr´ıpadn´a kolize synchronizace by mohla zp˚usobit deadlock. Probl´em data races se ˇcasto vyskytuje nad jednoduch´ymi pˇr´ıkazy (mal´a ˇc´ast k´odu). Prov´est statickou anal´yzu nad malou ˇc´ast´ı k´odu nen´ı probl´em a tud´ıˇz odhalen´ı dan´eho probl´emu je moˇzn´e.

Pro pouˇzit´ı model checkingu se je nejprve potˇreba dostat do poˇzadovan´eho stavu resp. do jeho okol´ı a zde posl´eze prov´est bounded model checking. Bounded model checking se provede do pˇredem urˇcen´e hloubky stavov´eho prostoru. K prohled´av´an´ı stavov´eho prostoru existuj´ı r˚uzn´e heurisitiky, d´ale je potˇreba pro prohled´av´an´ı stavov´eho prostoru zadat r˚uzn´e specifikace, kter´e maj´ı b´yt v syst´emu splnˇeny (verifikov´any).

Pokud opravn´a akce zp˚usob´ı jin´y probl´em a pomoc´ı ovˇeˇrov´an´ı opravy se dan´y probl´em zjist´ı, je potˇreba upravit l´eˇc´ıc´ı akci tak, aby k nov´e chybˇe nedoch´azelo nebo zvolit jinou l´eˇc´ıc´ı akci. Po zmˇenˇe opravy je tˇreba prov´est nov´e ovˇeˇren´ı bˇehu programu, zda se jiˇz syst´em chov´a korektnˇe. St´ale zde ale pˇretrv´av´a probl´em moˇzn´eho v´yskytu chyb. Verifikace syst´emu nebo ˇ

c´asti syst´emu se prov´ad´ı vˇzdy vzhledem k nˇejak´ym konkr´etn´ım vlastnostem a specifikac´ım. St´ale tedy neˇreˇs´ı probl´em, kdy o ˇz´adn´em syst´emu nelze ˇr´ıci, ˇze je bezchybn´y. O programu lze pouze ˇr´ıci, kter´e chyby neobsahuje. Pokud je zn´am princip opravy, je moˇzn´e navrhnout a posl´eze implementovat takovou metodu pro ovˇeˇren´ı korektnosti opravy, kter´a ovˇeˇr´ı ty specifikace, u kter´ych bˇehem l´eˇcen´ı doˇslo ke zmˇenˇe.

2.2

Form´

aln´ı metody

Form´aln´ı metody jsou zaloˇzeny na matematick´ych metod´ach, um´ı dok´azat/vyvr´atit urˇcit´e specifikace syst´emu. Form´aln´ımi metodami rozum´ıme verifikaˇcn´ı nebo analytick´e metody.

Verifikace ovˇeˇruje zadan´e vlastnosti v syst´emu. Napˇr´ıklad v paraleln´ıch programech m˚uˇze verifikace odpovˇedˇet na ot´azku, zda se v programu vyskytuje deadlock. Verifikace tedy vrac´ı odpovˇed’ ano/ne podle toho, jestli je verifikovan´a vlastnost v syst´emu splnˇena nebo ne. Existuj´ı ale tak´e specifikace, kter´e ovˇeˇrit nelze.

Anal´yza poskytuje odpovˇedi na obecnˇejˇs´ı ot´azky o syst´emu, neodpov´ıd´a tedy ano/ne, zda je vlastnost v syst´emu splnˇena, ale pod´av´a komplexnˇejˇs´ı informace o chov´an´ı syst´emu jako optimalizace, synt´eza, apod.

Rozd´ıl mezi form´aln´ımi metodami a testov´an´ım spoˇc´ıv´a v odpovˇedi na ot´azku, zda syst´em obsahuje danou chybu. Pokud se bˇehem testov´an´ı objev´ı chyba, je zˇrejm´e, ˇze pro-gram danou chybu obsahuje, ale pokud se bˇehem testov´an´ı chyba neprojev´ı, neznamen´a to, ˇze v programu zadan´a chyba nen´ı. Narozd´ıl od form´aln´ı verifikace, jestliˇze se bˇehem

(12)

verifikace chyba neprojev´ı a byla provedena verifikace cel´eho syst´emu, uveden´a chyba se v syst´emu opravdu nevyskytuje.

Ide´aln´ı form´aln´ı verifikace splˇnuje n´asleduj´ıc´ı vlastnosti. Ide´aln´ı form´aln´ı verifikace je plnˇe automatick´a, spolehliv´a (pokud dojde k z´avˇeru, mus´ı b´yt spr´avn´y), ´upln´a (pokud najde chybu, jedn´a se o skuteˇcnou chybu – nejede o false alarm), koneˇcn´a (verifikace vˇzdy skonˇc´ı s urˇcit´ym z´avˇerem). Bohuˇzel v praxi ide´aln´ı verifikace neexistuje, kritick´ym probl´emem ve-rifikace je stavov´a exploze. V pˇripadˇe syst´emu s koneˇcn´ym stavov´ym prostorem a moˇznost´ı vyuˇz´ıt´ı dostateˇcnˇe v´ykonn´eho poˇc´ıtaˇce – verifikace vˇzdy dojde k z´avˇeru. V praxi se ale ˇcasto setk´av´ame s neomezen´ym stavov´ym prostorem nebo nadmˇern´ymi poˇzadavky na v´ykon poˇc´ıtaˇce (d˚uvodem je pr´ace s daty – jeden tˇricetidvou-bitov´y integer m˚uˇze nab´yvat 232 hod-not, paralelismus, nedeterminismus, ...).

Re´aln´e verifikace maj´ı tedy n´asleduj´ıc´ı vlastnosti: produkuj´ı false alarmy, nekonˇc´ı vˇzdy korektnˇe, nejsou plnˇe automatick´e a nejsou stoprocetnˇe spolehliv´e.

K tomu, aby bylo moˇzn´e prov´adˇet verifikace, je nejprve zapotˇreb´ı nadefinovat syst´em, kter´y bude verifikov´an a jeho vlastnosti, kter´e se maj´ı zkontrolovat. Vstupn´ı syst´em m˚uˇze b´yt pops´an pomoc´ı modelu (petri net, promela, SMV, atd.) nebo jako re´aln´y syst´em (pro-gramy v r˚uzn´ych programovac´ıch jazyc´ıch, Verilog, hardware pospan´y ve VHDL, atd.). Vlastnosti, kter´e se maj´ı verifikovat, mohou b´yt napˇr. ˇzivost promˇenn´ych, invarianty, ukon-ˇ

cen´ı syst´emu pouze v poˇzadovan´em m´ıstˇe. Vlastnosti, kter´e se verifikuj´ı, lze rozdˇelit do dvou skupin: bezpeˇcnost a ˇzivost. Bezpeˇcnost n´am ˇr´ık´a, ˇze v syst´emu nikdy nenastane nic ˇspatn´ e-ho, protipˇr´ıklad takov´e vlastnosti je koneˇcn´y – nˇekdy nastane nˇeco ˇspatn´eho. Oproti tomu ˇzivost syst´emu ˇr´ık´a, ˇze v syst´emu nˇekdy nastane nˇeco dobr´eho a protipˇr´ıklad je nekoneˇcn´y – nikdy nenastane nic ˇspatn´eho. Lze tedy uv´est, ˇze bezpeˇcnost se verifikuje snadnˇeni neˇz ˇ

zivost. Pro popis vlastnost´ı je moˇzn´e pouˇz´ıt napˇr´ıklad formule tempor´aln´ıch logik,µ-calcul, labels, atd.

Dalˇs´ı d˚uleˇzitou charakteristikou vlastnost´ı pro verifikaci je ˇcas, kter´y m´a dvˇe z´akladn´ı rozdˇelen´ı na ˇcas logick´y/fyzick´y a line´arn´ı/vˇetv´ıc´ı se. Logick´y ˇcas ukazuje ˇcasov´y sled jed-notliv´ych ud´alost´ı podle bˇehu, kdeˇzto fyzick´y ˇcas slouˇz´ı k urˇcen´ı kolik ˇcasu na jakou ud´alost bylo potˇreba vzhledem ke zvolen´emu mˇeˇr´ıtku. V line´arn´ım ˇcase je pouze jedna moˇznost ˇ

casu, je moˇzn´y pouze line´arn´ı bˇeh programu. Oproti tomu vˇetv´ıc´ı se ˇcas umoˇzˇnuje spoleˇcn´y n´ahled na dva bˇehy, kter´e se rozch´azej´ı aˇz posl´eze.

Nejpouˇz´ıvanˇejˇs´ımi metodami pro form´aln´ı anal´yzu a verifikaci jsou model checking, sta-tick´a anal´yza a theorem proving.

Model checking. Model checking je algoritmick´a technika, kter´a ovˇeˇruje, zda syst´em splˇnuje poˇzadovan´e vlastnosti [4]. Verifikovan´y syst´em m˚uˇze b´yt pops´an jak modelem, tak re´aln´ym syst´emem. Model checking umoˇzˇnuje verifikovat syst´emy s koneˇcn´ym stavov´ym prostorem. Kritick´ym probl´emem model checkingu je exploze stavov´eho prostoru, kde veli-kost stavov´eho prostoru roste exponenci´alnˇe s velikost´ı verifikovan´eho syst´emu [21]. Vlast-nosti jsou typicky specifikov´any pomoc´ı tempor´aln´ıch logik.

V´yhodami model checkingu jsou: vysok´y stupeˇn automatizace, snadn´e pouˇzit´ı (pokud to umoˇzˇnuje syst´em), pomˇernˇe vˇseobecn´e pouˇzit´ı pro verifikaci r˚uzn´ych vlastnost´ı syst´emu. Oproti tomu hlavn´ı nev´yhodou je jiˇz zmiˇnovan´a exploze stavov´eho prostoru, kter´y se d´a ˇreˇsit r˚uzn´ymi metodami jako redukce, abstrakce, kompozice syst´emu z ˇc´ast´ı, atd. Dalˇs´ı nev´yhodou je nutnost modelovat okol´ı verifikovan´eho syst´emu jako jsou vstupy.

Statick´a anal´yza. Statick´a anal´yza se neprov´ad´ı nad skuteˇcn´ym bˇehem syst´emu, ale pouze nad zdrojov´ym k´odem. T´ım umoˇzˇnuje zjistit informace o programu ze zdrojov´eho k´odu, aniˇz by bylo nutn´e program spouˇstˇet. Statick´e anal´yzy jsou r˚uzn´e druhy (typov´a

(13)

anal´yza, vyhled´av´an´ı chybov´ych vzor˚u – bug pattern, dataflow anal´yza, apod.). V´yhodami statick´e anal´yzy je moˇznost verifikovat obrovsk´e syst´emy, z´aroveˇn nen´ı nutn´e modelovat okol´ı syst´emu a nab´ız´ı velk´y stupeˇn automatizace. Nev´yhodou je velk´a specializace jednot-liv´ych statick´ych anal´yz na konkr´etn´ı probl´emy. Pokud je c´ılem zverifikovat novˇe zadan´y probl´em, mus´ı se nejprve navrhnout nov´a statick´a anal´yza pro jeho ovˇeˇren´ı. Dalˇs´ı nev´yhodou je vznik false alarm˚u. D´ıky tomu, ˇze se statick´a anal´yza prov´ad´ı nad zdrojov´ym k´odem, m˚uˇze nadetekovat chybu, kter´a pˇri skuteˇcn´em bˇehu nikdy nenastane (false positive).

Theorem proving. Jedn´a se o deduktivn´ı verifikaci, kter´a vych´az´ı z axiom˚u a po-moc´ı pouˇzit´ı r˚uzn´ych pravidel produkuje vlastnosti syst´emu. Uˇzit´ı jednotliv´ych pravidel nen´ı automatick´e, je potˇreba z´asahu uˇzivatele

”experta“, kter´y vede d˚ukaz. Jedn´a se tedy o ˇc´asteˇcnˇe automatickou metodu, kter´a je velmi obecn´a, coˇz je jej´ı v´yhodou. Nev´yhodou je probl´em s diagnostickou informac´ı, kter´a m˚uˇze, ale tak´e nemus´ı b´yt k dispozici.

Pro ovˇeˇren´ı opravy byla zvolena from´aln´ı metoda – model checking. Ta umoˇzˇnuje verifi-kovat syst´em dynamicky, a tedy hledat pouze chyby, kter´e mohou v syst´emu re´alnˇe nastat oproti statick´e anal´yze, kter´a produkuje hodnˇe false alarm˚u. Dalˇs´ı v´yhodou je ˇsirok´y v´ybˇer z exituj´ıc´ıch n´astroj˚u (model checker˚u) pro verifikaci pomoc´ı model checkingu.

(14)

Kapitola 3

Model Checking

Model checking je algoritmick´a cesta k ovˇeˇren´ı, zda zadan´y syst´em splˇnuje poˇzadovanou vlastnost [4]. Z´akladn´ı sch´ema verifikaˇcn´ıho procesu je zn´azornˇen´e na obr. 3.1. Vstupem pro verifikace je verifikovan´y syst´em, kter´y je typicky pops´an pomoc´ı form´aln´ıho modelu syst´emu. Druh´ym vstupem je form´aln´ı specifikace vlastnost´ı, kter´e se maj´ı ovˇeˇrit. Model syst´emu a specifikovan´e vlastnosti vstupuj´ı do model checkeru, kter´y ovˇeˇruje resp. verifikuje zadan´e vlastnosti. V ide´aln´ım pˇr´ıpadˇe n´am model checker vr´at´ı odpovˇed’ ano/ne, podle toho jestli je vlastnost splnˇena. V praxi ovˇsem m˚uˇze nastat i situace, kdy n´am model checker nen´ı schopen poskytnout odpovˇed’, napˇr. z d˚uvodu nedostatku pamˇeti.

Obr´azek 3.1: Z´akladn´ı sch´ema procesu verifikace pomoc´ı model checkeru

Principem model checkingu je systematick´e prohled´av´an´ı stavov´eho prostoru. Stav (state) je sn´ımek syst´emu v ˇcase, zachycuje hodnoty promˇenn´ych v dan´em ˇcasov´em okamˇziku. Z´aroveˇn chceme zn´at, jak se stavy mˇen´ı– popis zmˇeny mezi jednotliv´ymi stavy (stav pˇred ud´alost´ı a stav po ud´alosti) se naz´yv´a pˇrechod (transition). V´ypoˇcet (computation) je sek-vence stav˚u, kde se n´asleduj´ıc´ı stav z´ısk´a z pˇredchoz´ıho stavu pomoc´ı pˇrechodu.

(15)

3.1

Model syst´

emu

Re´aln´e syst´emy jsou vˇetˇsinou zad´any pomoc´ı textu programu (zdrojov´y k´od) nebo diagra-mem cest. Je tedy potˇreba mechanizmus, kter´y je schopen popsat vˇsechny typy syst´em˚u tak, aby mohli b´yt verifikov´any. Jednou moˇznost´ı popisu chov´an´ı syst´emu je Kripkeho struk-tura (Kripke structure) obr. 3.2(a) . Jedn´a se o graf, kter´y popisuje stavy syst´emu a jeho pˇrechody:

Necht’ AP je mnoˇzina atomick´ych v´yrok˚u, pak Kripkeho struktura M nad AP je ˇctveˇrice M = (S, S0, R, L), kde

• S je mnoˇzina stav˚u,

• S0 ⊆ S je mnoˇzina poˇc´ateˇcn´ıch stav˚u,

• R ⊆ S × S je pˇrechodov´a relace mezi stavy takov´a, ˇze ∀s ∈ S : ∃s0 ∈ S : R(s, s0) • L : S → 2AP je funkce pˇriˇrazuj´ıc´ı kaˇzd´emu stavu mnoˇzinu vˇsech atomick´ych tvrzen´ı,

kter´a v dan´em stavu plat´ı, AP = {v = d | v ∈ V ∧ d ∈ D}, kde V je mnoˇzina promˇenn´ych nad dom´enou D.

Pro popis sekvenˇcn´ıho chov´an´ı Kripkeho struktury M jsou definov´any cesty (paths). Cesta (path) v Kripkeho struktuˇre M ze stavu s je nekoneˇcn´a sekvence stav˚u π = s0s1s2...,

kter´a je ˇrazen´a s ohledem na pˇrechodovou relaci v M . Pˇrechodov´a relace R(si, si+1) plat´ı

pro vˇsechny 0 ≤ i < |π| − 1. Jestliˇze I(s0) t.j. s0 je poˇc´ateˇcn´ı stav, potom se cesta naz´yv´a

poˇc´ateˇcn´ı (initialized). D´elka cesty (length) |π| m˚uˇze b´yt jak koneˇcn´a, tak nekoneˇcn´a. Pro i < |π| je definovan´y i-t´y stav si v sekvenci jako π(i). Suffixem π je πi = (si, si+1, . . . ),

kter´y zaˇc´ın´a stavem si. Vˇsechny moˇzn´e poˇc´ateˇcn´ı cesty syst´emu, lze z Kripkeho struktury

zapsat pomoc´ı v´ypoˇcetn´ıho stromu (computation tree) obr. 3.2(b). V´ypoˇcetn´ı strom tedy vznikne rozeps´an´ım Kripkeho struktury z poˇc´ateˇcn´ıho stavu.

Obr´azek 3.2: Uk´azka Kripkeho struktury (a) a v´ypoˇcetn´ıho stromu (b)

Granularita pˇrechod˚u. Jedn´ım ze z´asadn´ıch nastaven´ı verifikace je urˇcen´ı granu-larity pˇrechod˚u syst´emu. Tento fakt je podstatn´y pro urˇcen´ı atomick´ych pˇrechod˚u, tyto

(16)

pˇrechody jsou d´ale nedˇeliteln´y. Pokud pˇrechod obsahuje v´ıce operac´ı, prov´adˇej´ı se jako jedna jedin´a atomick´a operace. Bˇeˇznou chybou je nastaven´ı hrub´e granularity, kdy se za ato-mick´e pˇrechody povaˇzuj´ı i takov´e pˇrechody, kter´e v re´aln´em syst´emu atomick´e nejsou. T´ım m˚uˇze doj´ıt k chybˇe pˇri verifikaci, model checking neodhal´ı chyby (errors), kter´e v syst´emu jsou. Oproti tomu nastaven´ı velmi jemn´e granularity m˚uˇze zp˚usobit detekov´an´ı chyb, kter´e v re´aln´em bˇehu syst´emu nemohou nikdy nastat.

Pˇr´ıklad z [4]: Syst´em m´a 2 promˇenn´e x, y a dva soubˇeˇznˇe provediteln´e pˇrechody α, β. α : x := x + y

β : y := y + x

s poˇc´ateˇcn´ım stavem x = 1, y = 2. Oba pˇrechody maj´ı jemnou granularitu, implementace pˇrechod˚u je pomoc´ı instrukc´ı assembleru: load, add, store, kter´e slouˇz´ı pro pr´aci s pamˇet´ı a registry:

α0: load R1, x β0: load R2, y

α0: add R1, y β0: add R2, x

α0: store R1, x β0 : store R2, y

V´ypoˇcet pˇrechodu α a pak β d´av´a v´ysledek x = 3 ∧ y = 5. Pokud je pˇrechod β vykon´an pˇred α obdrˇz´ıme v´ysledek x = 4 ∧ y = 3. Na druhou stranu podle granularity implementace m˚uˇze nastat i situace α0β0α1β1α2β2 a v´ysledek x = 3 ∧ y = 3.

Pˇredpokl´adejme, ˇze x = 3 ∧ y = 3 poruˇsuje vlastnosti syst´emu, d´ale pˇredpokl´adejme, ˇ

ze syst´em je implementov´an pro pˇrechod α a β. V tom pˇr´ıpadˇe je nemoˇzn´e z´ıskat v´ysledek x = 3 ∧ y = 3. Potom s granularitou α0α1α2β0β1β2 m˚uˇzeme dostat stavy, kter´e v syst´emu

nikdy nenastanou. Na druhou stranu m´ame implementaci α0α1α2β0β1β2, ale syst´em

mo-delujeme s α a β, potom nikdy nenalezneme chybu v syst´emu.

Syst´emy se soubˇeˇznost´ı. Takov´e syst´emy se skl´adaj´ı z mnoˇziny komponent, kter´e bˇeˇz´ı souˇcasnˇe. Jednotliv´e komponenty si mezi sebou pˇred´avaj´ı r˚uzn´a data – komunikuj´ı. Zp˚usob komunikace je v jednotliv´ych syst´emech r˚uzn´y. Komunikace m˚uˇze prob´ıhat asyn-chronnˇe – v ˇcasov´em okamˇziku pracuje pouze jedna komponenta, nebo synchronnˇe – vˇsechny komponenty dˇelaj´ı krok ve stejn´em ˇcase. Komunikace prob´ıh´a za pomoci sd´ılen´ych promˇ en-n´ych (shared variables) nebo zas´ıl´an´ı zpr´av (exchanging messages). Pokud program obsa-huje sd´ılen´e promˇenn´e resp. promˇenn´e, ke kter´ym m´a pˇr´ıstup v´ıce neˇz jeden proces, je tˇreba zajistit, aby ke sd´ılen´e promˇenn´e mˇel v dan´y ˇcasov´y okamˇzik pˇr´ıstup pouze jeden proces. V opaˇcn´em pˇr´ıpadˇe m˚uˇze doj´ıt k nekonzistenci dat. Pro tyto ´uˇcely slouˇz´ı synchronizaˇcn´ı pˇr´ıkazy, kter´e jsou atomick´e a mohou m´ıt podobu pˇr´ıznaku ˇcek´an´ı (wait) nebo z´amk˚u (lock/unlock).

3.2

Specifikace syst´

emu

Po form´aln´ım nadefinov´an´ı syst´emu je tˇreba tak´e form´alnˇe nadefinovat vlastnosti, kter´e se maj´ı verifikovat. Typickou formou specifikace vlastnost´ı pro model checking jsou n´asleduj´ıc´ı tempor´aln´ı logiky:Linear-time Temporal Logic (LTL), Computation Tree Logic (CTL) a CTL∗, kter´a spojuje vyjadˇrovac´ı moˇznosti LTL a CTL.

Tempor´aln´ı logiky jsou speci´aln´ım typem mod´aln´ıch logik, pomoc´ı nichˇz se daj´ı nade-finovat formule, kter´e vyajdˇruj´ı urˇcitou vlastnost syst´emu. V tempor´aln´ı logice nen´ı ˇcas uveden explicitnˇe, naopak, formule umoˇzˇnuj´ı urˇcit, zda je nˇejak´y stav provediteln´y nebo tento stav nikdy nenastane (napˇr. chybov´y stav), jedn´a se o logick´y ˇcas. Vlastnosti typu nˇekdy (sometimes) nebo nikdy (never) jsou pops´any speci´aln´ımi tempor´aln´ımi oper´atory. Tempor´aln´ı oper´atory mohou b´yt kombinov´any libovolnˇe s booleovsk´ymi spojkami nebo

(17)

vz´ajemnˇe vnoˇreny. Jednotliv´e tempor´aln´ı logiky se liˇs´ı v oper´atorech, kter´e poskytuj´ı a tak´e v jejich s´emantice.

Logika CTL∗. Tato logika zahrnuje v sobˇe logiky CTL a LTL. CT L∗ formule popisuj´ı vlastnosti v´ypoˇcetn´ıch strom˚u. CT L∗ formule obsahuje: atomick´e v´yroky (AP), booleovsk´e spojky (∧, ∨, ¬), kvantifik´atory cesty, tempor´aln´ı oper´atory.

Kvantifik´atory cesty jsou pouˇzity pro popis vˇetven´ı ve v´ypoˇcetn´ım stromu: • A pro vˇsechny cesty

• E existuje cesta

Tempor´aln´ı oper´atory popisuj´ı vlastnosti cesty (cesty pˇres strom). Existuje pˇet z´akladn´ıch tempor´aln´ıch oper´ator˚u:

• Xp (next time) vlastnost p bude splnˇena v n´asleduj´ıc´ım stavu dan´e cesty, • Fp (eventually) vlastnost p bude splnˇena nˇekdy na dan´e cestˇe,

• Gp (globally) vlastnost p je splnˇena ve vˇsech stavech dan´e cesty, • pUq (until) vlastnost p plat´ı na cestˇe dokud neplat´ı q,

• pRq (release) vlastnost q byla splnˇena ve vˇsech stavech cesty aˇz po prvn´ı stav vˇcetnˇe, ve kter´em plat´ı formule p.

V CT L∗ logice existuj´ı dva typy formul´ı stavov´e formule (state formulas) a formule cesty (path formulas).

Logika CTL a LTL. Jsou podlogiky CT L∗, rozd´ıl mezi nimi je v upoˇr´ad´an´ı vˇetven´ı ve v´ypoˇcetn´ım stromu. CTL (Computation Tree Logic) je logika s vˇetv´ıc´ım se ˇcasem a tempor´aln´ı oper´atory urˇcuj´ı cesty, kter´e jsou moˇzn´e z dan´eho stavu obr. 3.3(b). Oproti tomu LTL (Linear Temporal Logic) je logika s line´arn´ım ˇcasem a oper´atory urˇcuj´ı ud´alosti, kter´e mohou nastat po cestˇe ve v´ypoˇcetn´ım stromu obr. 3.3(a).

(18)

3.3

ystup verifikace

V´ysledkem verifikace je tedy odpovˇed’ na ot´azku model checkingu: Necht’, je d´ana Kripkeho struktura M = (S, S0, R, L), pomoc´ı kter´e je pops´an verifikovan´y syst´em a tempor´aln´ı

formule f , reprezentuj´ıc´ı poˇzadovanou vlastnost, kterou m´a syst´em splˇnovat. Odpovˇed´ı model checkingu je, zda zadan´a formule f je splnˇena v Kripkeho struktuˇre M :

M |= ϕ ?,

respektive urˇcit mnoˇzinu stav˚u syst´emu S, ve kter´ych je formule f splnˇena: {s ∈ S | M, s |= ϕ}.

Postup urˇcen´ı, zda je formule f plnˇena spoˇc´ıv´a v ovˇeˇren´ı, ˇze: • pro kaˇzdou podformuli ψ formule ϕ je vypoˇctena mnoˇzina stav˚u:

Sψ = {s ∈ S | M, s |= ψ},

• v´ypoˇcet mnoˇziny stav˚u Sψ zaˇc´ın´a u nejvnitˇrenjˇs´ıch (d´ale nedˇeliteln´ych) podformul´ı a

postupuje se smˇerem ven k z´ısk´an´ı mnoˇziny stav˚u p˚uvodn´ı formule ϕ.

Typicky se prov´ad´ı model checking z poˇc´ateˇcn´ıho stavu (stav˚u) syst´emu, d´ıky tomu se ovˇeˇr´ı, zda je specifikace splnˇena v cel´em syst´emu (S0 ⊆ Sϕ) nebo jeho ˇc´asti – formule je

splnˇena v poˇzadovan´ych stavech.

Existuj´ı r˚uzn´e algoritmy, pomoc´ı nichˇz se urˇcuj´ı mnoˇziny stav˚u, ve kter´ych je poˇzadovan´a formule splnˇena. Nicm´enˇe pro v´ypoˇcet mnoˇziny u r˚uzn´ych formul´ı, kter´e obsahuj´ı jin´e tem-por´aln´ı oper´atory je tˇreba aplikovat r˚uzn´e algoritmy, jednotliv´e algoritmy lze naj´ıt napˇr´ıklad v [4].

Algoritmy pro ovˇeˇren´ı formule jsou zaloˇzeny na proch´azen´ı stavov´ym prostorem a jejich hlavn´ım probl´em se tedy st´av´a exploze stavov´eho prostoru.

3.4

Probl´

em stavov´

e exploze

Exploze stavov´eho prostoru je kritick´ym probl´emem model checkingu (state space explo-sion problem), kde verifikace spoˇc´ıv´a v generov´an´ı stavov´eho prostoru. Velikost stavov´eho prostoru roste exponenci´alnˇe s velikost´ı verifikovan´eho modelu resp. syst´emu [21]. Z toho d˚uvodu je prakticky model checking bez redukce stavov´eho prostoru v praxi nepouˇziteln´y. Exploze stavov´eho prostoru spoˇc´ıv´a v nedeterminismu – ve velk´em mnoˇzstv´ı moˇznost´ı stav˚u, kter´ymi m˚uˇze syst´em pokraˇcovat z aktu´aln´ıho stavu. Pro ˇreˇsen´ı probl´emu stavov´e exploze existuj´ı r˚uzn´e pˇr´ıstupy [7,15,21,23]. Jedn´ım z moˇzn´ych dˇelen´ı tˇechto pˇr´ıstup˚u je n´asleduj´ıc´ı: • Pˇredzpracov´an´ı (preprocessing). Jeˇstˇe pˇred zaˇc´atkem prov´adˇen´ı model checkingu se vykon´a pˇredzpracov´an´ı verifikovan´eho syst´emu. Do t´eto skupiny patˇr´ı: slicing a jemu podobn´e techniky zaloˇzen´e na statick´e anal´yze, jejich podstatou je

”oˇr´ıznut´ı“ ve-rifikovan´eho syst´emu pouze na tu ˇc´ast, kter´a m˚uˇze ovlivnit verifikovanou vlastnost. Vlastn´ı model checking se prov´ad´ı pouze nad

”oˇr´ıznutou“ ˇc´ast´ı syst´emu. Dalˇs´ı meto-dou je nad aproximace, pomoc´ı n´ı je moˇzn´e zjistit, co ovlivˇnuje zkoumanou oblast a d´ale pracovat se zvolenou ˇc´ast´ı syst´emu. D´ale je moˇzn´e pouˇz´ıt explicitn´ı urˇcen´ı ato-mick´e sekce. Uˇzivatel s´am zad´a oblasti, kter´e maj´ı b´yt vykon´any atomicky a nem´a se rozgenerov´avat jejich stavov´y prostor. V tom pˇr´ıpadˇe s´am uˇzivatel zaruˇcuje, ˇze j´ım zadan´a atomick´a sekce nezp˚usob´ı nenalezen´ı chyby. Existuj´ı i metody, kter´e dok´aˇz´ı urˇcit atomick´e sekce automaticky. Tyto sekce jsou ovˇsem vˇetˇsinou velice jednoduch´e a

(19)

neefektivn´ı vzhledem k redukci stavov´eho prostoru. Dalˇs´ı moˇznost´ı je abstrakce (abs-traction). Abstrakce se m˚uˇze vytvoˇrit bud’ ruˇcnˇe (theorem proving, uˇzivatel) nebo automaticky (predik´atov´a abstrakce, petriho s´ıtˇe).

• Efektivn´ı uloˇzen´ı Kripkeho struktury v pamˇeti. Dalˇs´ı moˇznost´ı jak se vypoˇr´adat se stavovou exploz´ı je komprimace stavov´eho prostoru. BDD (binary decision diagram) je jednou z moˇznost´ı jak komprimovat stavov´y prostor, jednotliv´e stavy jsou reprezen-tov´any pomoc´ı formul´ı. Dalˇs´ı moˇznost´ı je efektivn´ı uloˇzen´ı stavu v pamˇeti, neukl´adaj´ı se cel´e novˇe generovan´e stavy, ale pouze zmˇeny mezi jiˇz uloˇzen´ym stavem a novˇe generovan´ym. Abstrakce stav˚u je metoda, kter´a redukuje informace o procesech. Ne-uchov´av´a se informace o pˇresn´em poˇctu proces˚u, ale pouze informace zda na dan´em ˇr´adku k´odu je 0, 1 nebo ∞ proces˚u, jedn´a se o nadaproximaci.

• Redukce stavov´eho prostoru. Redukce stavov´eho prostoru neznamen´a pouze efek-tivn´ı proch´azen´ı stavov´eho prostoru, ale tak´e redukce poˇctu stav˚u. Redukce stav˚u m˚uˇze prob´ıhat bud’ pˇredem nebo za bˇehu programu – nˇekter´e generovan´e stavy nejsou z hlediska verifikovan´e vlastnosti zaj´ımav´e. Metody pro redukci stavov´eho prostoru jsou: symmetry reduction, Petri-net unifolding (rozvinut´ı petriho s´ıtˇe do line´arn´ıho stromu).

Zaj´ımav´e redukce pro programy se soubˇeˇznost´ı jsou

”Partial order reduction“ (POR) a

”on-the-fly model checking“. POR je zaloˇzen´a na redukov´an´ı generov´an´ı stavov´eho prostoru. V programech existuj´ı nez´avisl´e pˇrechody u kter´ych nez´aleˇz´ı na poˇrad´ı je-jich vykon´an´ı, po jejich proveden´ı se verifikace dost´av´a do shodn´eho stavu. Takov´e pˇrechody (operace) se typicky vyskytuj´ı u v´ıce vl´aknov´ych aplikac´ı, kdy r˚uzn´a v´alkna prov´ad´ı na sobˇe nez´avisl´e operace a nez´aleˇz´ı tedy na poˇrad´ı jejich prov´adˇen´ı. Uk´azka ˇc´asti vygenerovan´eho stavov´eho prostoru, kde je moˇzn´e tuto generovanou ˇc´ast redu-kovat pouze na proveden´ı jednoho pr˚uchodu je na obr.3.4.

Obr´azek 3.4: Uk´azka redukce stavov´eho prostoru pomoc´ı POR

Metoda on-the-fly je zaloˇzena na souˇcasn´em generov´an´ı stavov´eho prostoru a ovˇeˇrov´an´ı vlastnosti syst´emu najednou. Pˇri generov´an´ı stavov´eho prostoru se souˇcasnˇe verifi-kuje, zda je vlastnost v dan´em generovan´em stavu splnˇena. Pokud dojde k nalezen´ı protipˇr´ıkladu verifikovan´e vlastnosti, generov´an´ı stavov´eho prostoru konˇc´ı. Verifikace dospˇela k z´avˇeru bez nutnosti rozgenerov´av´avat cel´y stavov´y prostor a t´ım k jeho redukci.

(20)

• Kompoziˇcn´ı model checking (Compositional of MC). Jedn´a se o rozdˇelen´ı syst´emu na komponenty, kde u kaˇzd´e komponenty sledujeme urˇcit´e vlastnosti. Nako-nec z tˇechto d´ılˇc´ıch vlastnost´ı komponent odvod´ı vlastnosti cel´eho syst´emu.

Existuj´ı i dalˇs´ı metody pro redukci stavov´eho prostoru, kter´e zde nejsou uvedeny. Tak´e je moˇzn´e jednotliv´e metody vhodn´ym zp˚usobem kombinovat, a t´ım doc´ılit vyˇsˇs´ı efektivnosti pˇri redukci stavov´eho prostoru.

3.5

Bounded Model Checking

Bounded model checking resp. ohraniˇcen´y model checking se pouˇz´ıv´a pro verifikaci koneˇcnˇe stavov´ych syst´em˚u. Bounded model checking m˚uˇze ´uˇcinnˇe redukovat probl´em splnitelnosti booleovsk´e formule – SAT . Tento probl´em byl jedn´ım z d˚uvod˚u pro vytvoˇren´ı t´eto me-tody [3].

Z´akladn´ı myˇslenkou bounded model checkingu je ovˇeˇren´ı urˇcit´e vlastnosti syst´emu pouze za pomoci koneˇcn´eho prefixu cesty v syst´emu. Nalezen´ı d˚ukazu o splnˇen´ı nebo vyvr´acen´ı urˇcit´e vlastnosti syst´emu se prov´ad´ı v koneˇcn´em poˇctu krok˚u. Prohled´av´an´ı stavov´eho syst´emu je omezeno na pˇredem danou d´elku k. Pomoc´ı omezen´ı prohled´av´an´ı stavov´eho syst´emu se omez´ı i verifikace poˇzadovan´e vlastnosti. Verifikace je omezena na verifikaci pre-fixu cesty, kter´a m´a d´elku k. V praxi se vˇetˇsinou omezen´a d´elka cesty prodluˇzuje na takovou dobu, dokud se nez´ısk´a d˚ukaz o splnˇen´ı/vyvr´acen´ı verifikovan´e vlastnosti.

Pˇrestoˇze prefix cesty je koneˇcn´y – obsahuje koneˇcn´y poˇcet stav˚u, m˚uˇze reprezentovat nekoneˇcnou cestu. Pokud cesta obsahuje zpˇetnou smyˇcku (back loop) z posledn´ıho stavu prefixu do nˇekter´eho z pˇredchoz´ıch stav˚u (obr. 3.5(b)) jedn´a se o reprezentaci nekoneˇcn´e cesty pomoc´ı koneˇcn´eho poˇctu stav˚u. V pˇr´ıpadˇe, ˇze prefix cesty neobsahuje zpˇetnou smyˇcku (obr. 3.5(a)), nelze ˇr´ıci nic o nekoneˇcn´em chov´an´ı syst´emu. Nelze zverifikovat vlastnosti, kter´e poˇzaduj´ı, aby urˇcit´a vlastnost byla platn´a nekonˇcnˇe dlouho. Pokud prefix neobsahuje zpˇetnou smyˇcku nen´ı zn´am´e chov´an´ı syst´emu za stavem sk.

Obr´azek 3.5: Dvˇe moˇznosti omezen´e cesty Definice pro cestu, kter´a obsahuje zpˇetnou smyˇcku je n´asleduj´ıc´ı:

Pro l ≤ k naz´yv´ame cestu π: (k, l)-loop, pokud T (π(k), π(l)) a π = u.vω, kde u = (π(0), . . . , π(l − 1)) a v = (π(l), . . . , π(k)). Pokud existuje k≥l≥0, pro kter´e je cesta π: (k, l)-loop, pak naz´yv´ame cestu π: k-loop.

Pokud na cestˇe d´elky k existuje pˇrechod z posledn´ıho stavu cesty sk do nˇekter´eho

z pˇredeˇsl´ych stav˚u cesty sl, pak je moˇzn´e danou ˇc´ast cesty neomezenˇe kr´at opakovat k-loop.

S´emantika model checkingu na limitovan´ych cest´ach se naz´yv´a bounded semantics. Vyu-ˇ

z´ıv´a se prvn´ıch k + 1 stav˚u cesty (s0, . . . , sk), jedn´a se o koneˇcn´y prefix cesty. Pomoc´ı tohoto

prefixu se urˇcuje splnitelnost formule na cestˇe. Pokud cesta obsahuje smyˇcku k-loop, m˚uˇze se pro splnitelnost formule pouˇz´ıt origin´aln´ı s´emantika model checkingu. Tato s´emantika lze vyuˇz´ıt vzhledem k faktu, ˇze pokud cesta obsahuje zpˇetnou smyˇcku jsou nekoneˇcn´e vlastnosti

(21)

cesty obsaˇzeny v jej´ım koneˇcn´em prefixu. Form´alnˇe lze toto tvrzen´ı

”Bounded Semantics for a Loop“ zapsat n´asledovnˇe:

Necht’ k ≥ 0 a π je k-loop. Potom LT L formule f je splnˇena na cestˇe π d´elky k (sym-bolick´y z´apis π |=k f iff π |= f ).

Druh´a moˇznost nast´av´a v pˇr´ıpadˇe, kdy cesta π neobsahuje k-loop. Potom formule f = Fp je splnˇena na cestˇe π v origin´aln´ı (neomezen´e) s´emantice, jestliˇze existuje index i ≥ 0, takov´y, kde p je splnˇena na sufixu (πi) cesty π. Pokud je pouˇzita omezen´a s´emantika,

potom k+1-n´ı stav π(k) nem´a n´asledovn´ıka a nen´ı tedy moˇzn´e tuto s´emantiku definovat rekurzivnˇe pomoc´ı sufix˚u cesty (πi). Z toho d˚uvodu se zav´ad´ı znaˇcen´ı π |=ik f , kde i je

aktu´aln´ı pozice v prefixu na cestˇe π a suffix πi cesty π splˇnuje formuli f : π |=ikf implikuje

πi |= f . Form´aln´ı definice tohoto tvrzen´ıBounded Semantics without a Loop“ lze zapsat

n´asledovnˇe:

Necht’ k ≥ 0, cesta π nen´ı k-loop. Potom LT L formule f je splnˇena na cestˇe π d´elky k resp. π |=kf iff π |=0kf , kde

π |=i kp iff p ∈ L(π(i)) π |=ik¬p iff p /∈ L(π(i)) π |=ikf ∧ g iff π |=ik f and π |=ikg π |=i kf ∨ g iff π |=ik f or π |=ikg

π |=ikGf nen´ı splnˇena nikdy

π |=ikFf iff ∃j, i ≤ j ≤ k. π |=jkf π |=ikXf iff i < k and π |=i+1k f

π |=ikf Ug iff ∃j, i ≤ j ≤ k. π |=jkg and ∀n, i ≤ n < j. π |=nk f π |=ikf Rg iff ∃j, i ≤ j ≤ k. π |=jkf and ∀n, i ≤ n < j. π |=nk g

Na z´avˇer t´eto kapitoly o bounded model checkingu zle uv´est n´asleduj´ıc´ı dvˇe vˇety: Necht’ f je LT L formule a π je cesta, potom π |=k f ⇒ π |= f .

Necht’ f je LT L formule a M je Kripkeho struktura. Jestliˇze M |= Ef , potom existuje k ≥ 0, kde M |=kEf .

Z tˇechto dvou vˇet lze odvodit n´asleduj´ıc´ı theor´em o bounded model checkingu:

Necht’ f je LT L formule a M je Kripkeho struktura, potom M |= Ef iff existuje k ≥ 0, resp. M |=kEf .

Theor´em ˇr´ık´a, pokud zle z´ıskat takovou d´elku k, na kter´e je formule splnˇena, potom omezen´a a neomezen´a s´emantika jsou ekvivalentn´ı.

3.6

Navigace stavov´

ym prostorem

V projektu SHADOWS se bounded model checking vyuˇz´ıv´a pro zverifikov´an´ı okol´ı l´eˇcen´e chyby, nen´ı tedy c´ılem prov´est bounded model checking z poˇc´ateˇcn´ıho stavu (s0), ale

z nˇejak´eho konkr´etn´ıho stavu ve stavov´em prostoru syst´emu. Aby bylo moˇzn´e z toho stavu prov´est bounded model checking, je potˇreba nejprve dan´eho stavu dos´ahnout, proj´ıt sta-vov´y prostor do konkr´etn´ıho stavu. K tomuto ´uˇcelu existuj´ı r˚uzn´e metody [14, 20], kter´e slouˇz´ı k navigaci stavov´ym prostorem do poˇzadovan´eho stavu. Tyto metody mohou b´yt n´asleduj´ıc´ı.

• Record&Replay trace. Tato strategie pro navigaci stavov´ym prostorem je zaloˇzena na zaznamen´an´ı bˇehu programu (trace) a posl´eze pˇrehr´an´ı t´eto cesty ve zvolen´em

(22)

model checkeru. Pomoc´ı z´aznamu bˇehu programu se je moˇzn´e nav´adˇet stavov´ym prostorem aˇz do m´ısta opravy chyby, ze kter´eho je moˇzn´e spustit bounded model checking. V´yhodou t´eto metody je zaznamen´an´ı cel´e cesty prov´adˇen´ı programu. D´ıky tomu je moˇzn´e prov´est bounded model checking ne pouze z chybov´eho stavu pro-gramu, ale z kter´ehokoliv stavu, kter´y mu na cestˇe pˇredch´az´ı. Z´asadn´ı nev´yhodou t´eto metody je nutnost ukl´ad´an´ı cel´eho bˇehu programu, a t´ım zpomalen´ı chodu apli-kace. Dalˇs´ı nev´yhodou je pamˇet’ov´a n´aroˇcnost, pro z´aznam cesty programu je za-potˇreb´ı velk´e mnoˇzstv´ı dat. ˇC´ım delˇs´ı dobu program bˇeˇz´ı, t´ım je potˇreba v´ıce pamˇeti pro z´aznam cesty. Minim´alnˇe stejnˇe dlouh´a doba jako pro z´aznam cesty je tak´e potˇreba pro pˇrehr´an´ı zaznamenan´e cesty. Proto se tato metoda nehod´ı pro navigaci stavov´ym prostorem u syst´em˚u, kter´e jsou dlouhodobˇe v chodu.

Aby bylo moˇzn´e pˇrehr´at zaznamenanou cestu bˇehu programu, je tˇreba ukl´adat re-levantn´ı informace jako informace o aktu´aln´ım vl´aknˇe, vykonan´e byte-code instrukci atd.

• Store&Restore state. Dalˇs´ı strategie pro z´ısk´an´ı poˇzadovan´eho stavu ze stavov´eho prostoru syst´emu je zaloˇzena na uloˇzen´ı a opˇetovn´em obnoven´ı stavu. Neprve se uloˇz´ı aktu´aln´ı stav bˇeˇz´ıc´ıho programu a n´aslednˇe se uloˇzen´y stav obnov´ı ve zvolen´em model checkeru. Po obnoven´ı uloˇzen´eho stavu je z nˇej moˇzn´e prov´est bounded model chec-king. Nev´yhodou t´eto metody je nemoˇznost zaˇc´ıt bounded model checking z jin´eho neˇz z pouze uloˇzen´eho stavu. Nen´ı moˇzn´e jako u pˇredeˇsl´e metody zah´ajit bounded model checking z nˇejak´eho z pˇredch´azej´ıc´ıch stav˚u bˇehu programu. Dalˇs´ı nev´yhodou je slabost v ukl´ad´an´ı stavu. Pokud dojde ke zmˇenˇe v uloˇzen´em stavu je tˇreba prov´est pˇr´ısluˇsnou zmˇenu i v ukl´adan´em resp. obnoven´em stavu. Napˇr. u Java program˚u m˚uˇze doj´ıt ke zmˇenˇe verze Java virt´aln´ıho stroje (JVM) nebo zmˇena verze model checkeru m˚uˇze zp˚usobit tak´e nutnost zmˇeny v ukl´ad´an´ı a obnoven´ı stavu. Nev´yhoda moˇznosti verifikace pouze z uloˇzen´eho stavu se d´a ˇc´asteˇcnˇe odstranit opˇetovn´ym ukl´ad´an´ım stav˚u syst´emu napˇr. po urˇcit´em ˇcasov´em intervalu. Nicm´enˇe st´ale tu z˚ust´av´a nutnost uloˇzen´ı veˇsker´ych potˇrebn´ych informac´ı pro obnoven´ı stavu syst´emu v model chec-keru. Tˇechto informac´ı je znaˇcn´a spousta a jak jiˇz bylo zm´ınˇeno, s kaˇzdou zmˇenou verze m˚uˇze doj´ıt k nutnosti zmˇenˇe ukl´adan´ych informac´ı. Naopak v´yhodou je fakt, ˇze nezp˚usobuje trval´e zpomalen´ı bˇehu programu, ke zpomalen´ı doch´az´ı pouze v dobˇe ukl´ad´an´ı stavu.

• Dalˇs´ı Strategie. V´yˇse uveden´e strategie se daj´ı r˚uznˇe kombinovat, napˇr. po urˇcit´em ˇcasov´em intervalu m˚uˇze doch´azek k ukl´ad´an´ı stavu syst´emu a zaznamen´av´an´ı cesty z tohoto stavu. Po urˇcit´e dobˇe dojde k pˇremaz´an´ı uloˇzen´e cesty a stavu nov´ymi in-formacemi.

Dalˇs´ı moˇznost´ı je modifikace uveden´ych strategi´ı, jako napˇr´ıklad Record&Replay trace lze kombinovat s

”oˇrez´av´an´ım (slicing)“. Jedn´a se o metodu, pomoc´ı kter´e se ne-ukl´adaj´ı vˇsechny informace o bˇehu programu, ale pouze ty informace, kter´e jsou rele-vantn´ı k pˇrehr´an´ı bˇehu programu do poˇzadovan´eho stavu.

(23)

Kapitola 4

Java PathFinder

Projekt SHADOWS se vˇenuje l´eˇcen´ı program˚u napsan´ych v jazyce Java, a proto bylo vyb´ır´ano z model checker˚u vhodn´ych pro verifikaci Java program˚u. Byly zkoum´any vlast-nosti tˇechto tˇr´ı zn´am´ych a zaj´ımav´ych model checker˚u.

• Bogor [10] je softwarov´y model checking framework, kter´y poskytuje vizualizaci, grafick´e uˇzivatelsk´e rozhran´ı, a tak´e r˚uzn´e algoritmy po model checking (pro redukci stavov´eho prostoru, vyhled´avac´ı heuristiky, abstraktn´ı definice atd.). Bogor lze pouˇz´ıt i jako plugin do Eclipse. (Eclipse je integrovan´e v´yvojov´e prostˇred´ı pro programov´an´ı Java program˚u, jeho n´avrh umoˇznuje rozˇs´ıˇren´ı prostˇred´ı pomoc´ı plugin˚u [2].) Jedn´ım z moˇzn´ych vyuˇzit´ı Bogoru, je pro studijn´ı ´uˇcely. Je moˇzn´e ho vyuˇz´ıt pro v´yuku z´akladn´ıch algoritm˚u model checkingu a jeho podstaty. Z´aroveˇn lze Bogor vyuˇz´ıt pro klasick´y model checking.

• Bandera [8] je model checker pro programy napsan´e v Javˇe, kter´e obsahuj´ı parale-lismus. Bandera pˇrekl´ad´a zdrojov´y k´od v Jave do vstupn´ıho jazyka nˇejak´eho jin´eho existuj´ıc´ıho model checkeru jako napˇr´ıklad SPIN, SMV, SAL, atd. Tyto jin´e model checkery zabezpeˇcuj´ı vlastn´ı verifikaci syst´emu. Po zverifikov´an´ı syst´emu Bandera umoˇzˇnuje namapovat v´ystup verifikace ze zvolen´eho model checkeru na p˚uvodn´ı Java k´od.

• Java PathFinder(JPF) [9] je model checker, kter´y prov´ad´ı verifikaci nad Java byte-codem. JPF je implementov´an jako speci´aln´ı Java virtu´aln´ı stroj (JVM), kter´y v sobˇe pˇrehr´av´a programy urˇcen´e k verifikaci. Bˇehem pˇrehr´av´an´ı programu kontroluje poˇzadovan´e vlastnosti nebo specifikace syst´emu. JPF je implicitnˇe nastaven na detekci deadlocks, unhandled exception, violations of assertions. Z´aroveˇn JPF m˚uˇze detekovat i dalˇs´ı vlastnosti syst´emu, kter´e se daj´ı zadat pomoc´ı parametr˚u. Nebo je moˇzn´e naim-plementovat dalˇs´ı vlastn´ı speci´aln´ı souˇc´asti JPF pro verifikaci poˇzadovan´ych vlastnost´ı syst´emu.

Pro vlastn´ı implementaci bounded model checkingu byl zvolen model checker Java PathFinder pro jeho snadnou rozˇsiˇritelnost o dalˇs´ı moduly a funkce. Java PathFinder ob-sahuje ˇradu vyhled´avac´ıch strategi´ı (search strategies), redukce stavov´eho prostoru, r˚uzn´e heuristiky pro prohled´av´an´ı stavov´eho prostoru atd. Model checker Bogor je tak´e moˇzn´e rozˇs´ıˇrit o vlastn´ı moduly, nicm´enˇe v´yhodou JPF je jeho nasazen´ı jiˇz na re´aln´e syst´emy. Hlavn´ı nev´yhodu model checkeru Bandera je nutnost transformovat vstupn´ı zdrojov´y k´odu programu do jin´eho jazyka. T´ım je zp˚usobena nemoˇznost selod´av´an´ı pr˚ubˇehu verifikace nad p˚uvodn´ım Java k´odem.

(24)

4.1

akladn´ı charakterisitika

Java PathFinder je explicitn´ı stavov´y model checker pro programy napsan´e v jazyce Java [9,

13, 17, 19, 22]. Verifikace se prov´ad´ı na ´urovni Java byte-codu. JPF pˇredstavuje speci´aln´ı virtu´aln´ı stroj, ve kter´e se spouˇst´ı verifikovan´y syst´em. Z d˚uvodu bˇehu aplikace pˇr´ımo v JPF, nen´ı nutn´e spouˇstˇet program v´ıcekr´at nebo ho nˇejak´ym zp˚usobem upravovat. JPF neprov´ad´ı jednoduch´y bˇeh programu, ale vykon´av´a rovnou verifikaci za bˇehu (runtime). Prohled´av´an´ı stavov´eho prostoru prob´ıh´a pomoc´ı r˚uzn´ych prohled´avac´ıch strategi´ı, kter´e budou pops´any d´ale. Samotn´y Java PathFinder je tak´e naps´an v jazyce Java, jeho archi-tektura je rozdˇelena do modul˚u, kter´e umoˇzˇnuj´ı dalˇs´ı rozˇsiˇritelnost. Je moˇzn´e rozˇsiˇrovat jiˇz existuj´ıc´ı moduly o dalˇs´ı funkce nebo implementovat nov´e moduly. Pokud JPF bˇehem ve-rifikace nalezne chybu (error), standardnˇe vyp´ıˇse cestu (trace), kter´a k chybˇe vedla, a tak´e vyp´ıˇse relevantn´ı informace o bˇehu (aktu´aln´ı vl´akno, jednotliv´e ˇr´adky zdrojov´eho k´odu, apod), tyto informace mohou pomoci opravit nalezenou chybu. Z´akladn´ı architektura Java PathFinderu je vyobrazena na obr.4.1.

Obr´azek 4.1: Architektura Java PathFinderu [9]

Vstupem JPF je Java byte-code program, kter´y je urˇcen k verifikaci. Na bˇeh JPF jsou pˇrilinkov´any r˚uzn´e moduly, kter´e definuj´ı jak´ym zp˚usobem bude verifikace prob´ıhat. Po-moc´ı nastaven´ı JPF se urˇc´ı, jak´a vyhled´avac´ı strategie (search strategy) bude pouˇzita pro prohled´av´an´ı stavov´eho prostoru, kter´e listenery (search listener) budou s touto stra-tegi´ı pouˇzity (pro z´ısk´an´ı poˇzadovan´ych informac´ı). D´ale lze nastavit generov´an´ı moˇznost´ı (choice generator) nedeterminismu, jedn´a se o hodnoty vstupn´ıch dat, prokl´ad´an´ı vl´aken atd. Dalˇs´ı nastaven´ı umoˇznuje pˇrilinkovat listener zaloˇzen´y na sledov´an´ı jednotliv´ych krok˚u virtu´aln´ıho stroje. JPF tedy systematicky, podle zvolen´e strategie, prohled´av´a stavov´y pro-stor vstupn´ıho programu, pokud dojde k detekci chyby. JPF uˇzivateli poskytne zpr´avu o verifikaci, kter´a obsahuje cestu, kter´a vedla k chybˇe, typ detekovan´eho probl´emu a dalˇs´ı informace, kter´e byly nastaveny uˇzivatelem.

(25)

JPF umoˇzˇnuje verifikovat programy, kter´e maj´ı v´ıce vl´aken, nicm´enˇe neumoˇzˇnuje verifi-kaci soubˇeˇzn´eho bˇehu vl´aken (na dvou procesorech). JPF pouze simuluje soubˇeˇznost vl´aken. Z´aroveˇn neumoˇzˇnuje zverifikovat programy, kter´e obsahuj´ı nativn´ı metody (metody psan´e v jin´em jazyce neˇz Java). JPF neobsahuje podporu vˇsech knihoven Java, pokud program obsahuje urˇcit´e knihovny, nen´ı ho moˇzn´e verifikovat [9].

Nicm´enˇe umoˇzˇnuje vytvoˇren´ı nativn´ıch metod, kter´e jsou v r´amci verifikace br´any jako atomick´e ˇc´asti k´odu a neprov´ad´ı se nad nimi verifikace. Metoda je vykon´ana bez prokl´ad´an´ı jin´ymi instrukcemi k´odu. D´ıky tomuto mechanizmu je moˇzn´e verifikovat programy obsa-huj´ıc´ı knihovny nebo metody, kter´e nechceme br´at v ´uvahu do verifikace. Pro verifikaci vstupn´ıch dat obsahuje JPF specializovan´e API, pomoc´ı kter´eho lze urˇcit, jak´ych hodnot mohou tyto data nab´yvat. Jinou moˇznost´ı je volba pro n´ahodn´y v´ybˇer hodnot vstupn´ıch dat. Nast´ınˇen´e vlastnosti JPF budou d´ale rozeps´any. JPF m˚uˇze simulovat nedeterminismus, pro generov´an´ı nedeterminismu obsahuje JPF dva mechanismy:

• Backtracking znamen´a, ˇze se JPF m˚uˇze vr´atit k vykonan´emu stavu a nahradit zvo-lenou moˇznost (hodnotu promˇenn´e), z kter´e vznikl nedeterminismus, jinou moˇznost´ı a t´ım vygenerovat nov´y stav a n´aslednˇe generovat cestu. Tento zp˚usob se aplikuje na postupn´e rozgenerov´an´ı vˇsech moˇzn´ych pl´anovac´ıch sekvenc´ı (moˇzn´ych hodnot). • State matching je zaloˇzen na mechanismu vyhnut´ı se generov´an´ı jednoho stavu

syst´emu dvakr´at, kaˇzd´y nov´y stav je uloˇzen na heap. Pokud je dan´y stav uloˇzen, neukl´ad´a se jiˇz vygenerovan´y stav, ale JPF se vrac´ı k prvn´ımu nerozgenerovan´emu stavu a zde se pokraˇcuje s verifikac´ı.

4.2

Specifikace

JPF umoˇzˇnuje verifikovat r˚uzn´e vlastnosti podle zadan´ych poˇzadavk˚u. V JPF existuj´ı tˇri z´akladn´ı mechanizmy pro nastaven´ı vlastnost´ı: ordinary assertions, gov.nasa.jpf.Property a listenery (gov.nasa.jpf.SearchListner nebo gov.nasa.jpf.VMListener).

Java assertions se zad´avaj´ı pˇr´ımo do zdrojov´eho k´odu programu a slouˇz´ı k z´ısk´an´ı informac´ı z´avisl´ych pˇr´ımo na datech aplikace. Jedn´a se o ´uˇcinn´e z´ısk´an´ı informac´ı a chov´an´ı syst´emu. Nev´yhodou t´eto metody je nutnost z´asahu do zdrojov´eho k´odu programu. Z´aroveˇn m˚uˇze doj´ıt k n´ar˚ustu stavov´eho prostoru, pokud se maj´ı zverifikovat i pˇridan´e assertions.

Gov.nasa.jpf.Property je mechanismem zapouzdˇruj´ıc´ım kontrolu vlastnost´ı (proper-ties). Verifikace tˇechto vlastnost´ı m˚uˇze b´yt nastavena staticky pomoc´ı search.properties nebo dynamicky pomoc´ı jpf.getSerach().addProperty(). Potom je moˇzn´e tyto vlast-nosti kontrolovat za bˇehu programu pˇri kaˇzd´e zmˇenˇe pomoc´ı search objektu. Z´akladn´ı specifikace, kter´e jsou implicitnˇe v JPF pomoc´ı tohoto mechanizmu kontrolov´any jsou n´asleduj´ıc´ı: deadlocks, assertion violation, uncaught exceptions. Kontrola tˇechto specifikac´ı je jiˇz v JPF naiplementov´ana.

Listenery – gov.nasa.jpf.SearchListener a gov.nasa.jpf.VMListener jsou dalˇs´ım mechanismem, kter´y lze vyuˇz´ıt pro ovˇeˇren´ı komplexnˇejˇs´ıch informac´ı. Jedn´a se o dvˇe tˇr´ıdy, pomoc´ı kter´ych jsou naimplementov´any r˚uzn´e listnery. Ty slouˇz´ı k z´ısk´av´an´ı r˚uzn´ych in-formac´ı o bˇehu programu. V JPF je jiˇz ˇrada tˇechto listener˚u naimplementov´ana. Jed-notliv´e listenery d´avaj´ı napˇr´ıklad n´asleduj´ıc´ı inforamce: SearchMonitor – v´ypis statistick´y informac´ı o bˇehu programu (poˇcet vygenerovan´ych stav˚u, velikost vyuˇzit´e pamˇeti, atd.),

(26)

HeapTracker – v´ypis vyuˇzit´ı haldy (heap) na vˇsech cest´ach verifikace, StateSpaceDot – vytvoˇr´ı graf vygenerovan´eho stavov´eho prostoru bˇehem verifikace, MethodTracker – v´ypis vˇsech metod, kter´e byly bˇehem verifikace vol´any, atd.

Mechanizmus listener˚u umoˇznuje z´ısk´av´at informace o programu na tˇrech ´urovn´ıch. Obecn´e listenery poskytuj´ı informace o programu z´ıskan´e pomoc´ı rozhran´ı, nach´azej´ı se mimo program. Jedn´a se o SearchListnery a VMListenery. Druh´ym typem listener˚u jsou specializovan´e vyhled´avac´ı listenery, ty se opˇet nach´az´ı mimo program a jsou k nˇemu pouze linkov´any. Nicm´enˇe jsou navrˇzeny pro z´ısk´an´ı specifick´ych informac´ı o programu, nebo jsou navrˇzeny ke konkr´etn´ımu ´uˇcelu, napˇr. gov.nasa.jpf.search.heuristic.BFSHeuristic slouˇz´ı pro nastaven´ı prohled´av´an´ı stavov´eho prostoru pomoc´ı BFS strategie. Tˇret´ım ty-pem listener˚u jsou vnitˇrn´ı listenery, kter´e se nach´az´ı v konkr´etn´ım bal´ıku uvnitˇr imple-mentace JPF a umoˇznuj´ı z´ısk´avat inforamce z dan´eho konkr´etn´ıho bal´ıˇcku. Napˇr. bal´ık gov.nasa.jpf.jvm.bytecode obsahuje jednotliv´e instrukce byte-codu a tedy listener v tom-to bal´ıku umoˇznuje z´ıskat nebo mˇenit prim´arn´ı informace o jednotliv´ych instrukc´ıch byte-codu, kter´e jsou ostatn´ım listener˚um skryty. Nejˇsirˇs´ı vyuˇzit´ı nab´ızej´ı obecn´e listenery, kter´e umoˇznuj´ı z´ıskat nebo mˇenit informace v programu

”bezpeˇcn´ym“ zp˚usobem.

SearchListenery lze pouˇz´ıt pro monitorov´an´ı prohled´avac´ıho procesu stavov´ym pro-storem. Umoˇznuj´ı zaznamen´avat napˇr´ıklad informace o jednotliv´ych stavech syst´emu nebo vytv´aˇret graf stavov´eho prostoru, kter´y obsahuje inforamce o postupu stavov´ym prostorem i z´akladn´ı informace o jednotliv´ych stavech.

VMListenery mohou zaznamen´avat nebo mˇenit jednotliv´e kroky prov´adˇen´ı programu na ´urovni virtu´aln´ıho stroje. VMListener zle napˇr´ıklad pouˇz´ıt pro monitorov´an´ı vykon´an´ı byte-code instrukc´ı MONITORENTER a MONITOREXIT, kter´e slouˇz´ı k synchronizaci v programu. Monitorov´an´ı tˇechto instrukc´ı umoˇznuje odhalit chybˇej´ıc´ı synchronizaci nebo naopak detekovat m´ısto vzniku deadlocku.

Pˇrilinkov´an´ı listener˚u k bˇehu JPF lze prov´est dvˇema zp˚usoby. Prvn´ım zp˚usobem je sta-tick´e nastaven´ı vlastnost´ı JPF pˇred jeho spuˇstˇen´ım. Tento mechanizmus umoˇznuje zvolit jednotliv´e listnery, kter´e maj´ı b´yt pˇrilinkov´any a tak´e nastavit parametry pˇrid´avan´ych lis-tener˚u. Druhou moˇznost´ı je dynamick´e pˇrid´an´ı listener˚u do bˇehu JPF, lisntener je pˇrid´an pˇr´ımo do zdrojov´eho k´odu aplikace a vyvol´an aˇz za bˇehu.

4.3

Prohled´

av´

an´ı stavov´

eho prostoru

JPF obsahuje r˚uzn´e nastaviteln´e vyhled´avac´ı strategie (Search strategies) pro prohled´av´an´ı stavov´eho prostoru verifikovan´eho syst´emu. Naimplementov´any jsou z´akladn´ı vyhled´avac´ı strategie jako DF S (Depth First Search – prohled´av´an´ı do hloubky), BF S (Breadth First Search – prohled´av´an´ı do ˇs´ırky), A∗, Best-F irst or BeamSearch. Z´aroveˇn je moˇzn´e na-stavit r˚uzn´e parametry u jednotliv´ych strategi´ı jako hloubku prohled´av´an´ı, prioritu stav˚u, apod. JPF obsahuje i strategie pro n´ahodn´y bˇeh programem napˇr.RandomSearch nebo P athSearch. Vhodn´ym v´ybˇerem prohled´avac´ı strategie a jej´ıho nastaven´ı lze ˇr´ıdit gene-rov´an´ı stavov´eho prostoru a t´ım doc´ılit zverifikov´an´ı zadan´e specifikace syst´emu dˇr´ıve, ne-mus´ı doj´ıt k explozi stavov´eho prostoru.

Redukce stavov´eho prostoru.Java PathFinder obsahuje r˚uzn´e mechanizmy, kter´e maj´ı za c´ıl omezit explozi stavov´eho prostoru. V kapitole 3, kter´a pojedn´av´a o Model checkingu jsou vyps´any r˚uzn´e pˇr´ıstupy jak doc´ılit redukce stavov´eho prostoru. Mechanizmy redukce v JPF jsou zaloˇzeny na uveden´ych principech.

(27)

• Partial Order Reduction (POR) je metoda, kter´a ´uˇcinnˇe redukuje poˇcet gene-rovan´ych stav˚u. Poˇcet pl´anovan´ych rozhodov´an´ı (vˇetven´ı) m˚uˇze b´yt znaˇcnˇe omezen, pokud seskup´ıme vˇsechny instrukce v konkr´etn´ım vl´aknˇe, kter´e nemohou zp˚usobit zmˇenu mimo toto vl´akno. Takov´e instrukce jsou seskupeny do jednoho pˇrechodu, pokud program obsahuje hodnˇe vl´aken, kter´e mezi sebou nesd´ılej´ı data, m˚uˇze b´yt redukce stavov´eho prostoru znaˇcn´a. Oproti tomu pokud program obsahuje mnoˇzstv´ı sd´ılen´ych dat nebo prov´azan´ych operac´ı, redukce pomoc´ı POR je minim´aln´ı. JPF prov´ad´ı POR

”on-the-fly“, pˇri prov´adˇen´ı se nespol´eh´a na statickou anal´yzu, ale vy-hodnocuje atomick´e sekce za bˇehu, resp. urˇcuje, kter´e instrukce mus´ı b´yt vyhodnoceny jako hraniˇcn´ı dan´eho pˇrechodu do nov´eho stavu. Pokud je POR pˇri spuˇstˇen´ı JPF po-volena, vykon´avaj´ı se vˇsechny instrukce v aktu´aln´ım vl´aknˇe do okamˇziku neˇz dalˇs´ı instrukce zp˚usob´ı zmˇenu v pl´anov´an´ı (scheduling relavant) nebo se m˚uˇze jednat o in-strukci, kter´a zp˚usobuje nedeterminismus. Z Java byte-code instrukc´ı je pouze asi 10% instrukc´ı, kter´e zp˚usobuj´ı zmˇenu v pl´anov´an´ı, na obr. 4.2 jsou tyto instrukce vyobrazeny s jejich z´avislostmi.

Obr´azek 4.2: Instrukce maj´ıc´ı vliv na pl´anov´an´ı [9]

• Choice Generatory (CG) jsou dalˇs´ım d˚uleˇzit´ym mechanizmem pro pr´aci s nede-terminismem. CG slouˇz´ı k vytvoˇren´ı vˇsech hodnot, kter´ych mohou data v programu nab´yvat nebo k vytvoˇren´ı vˇsech moˇznost´ı pl´anov´an´ı. CG jsou jedn´ım z moˇzn´ych ˇreˇsen´ı jak se vyrovnat s probl´emem vstupn´ıch dat. Pomoc´ı rozhran´ı gov.nasa.jpf.jvm.Verify lze zadat, jak´ych hodnot maj´ı urˇcit´e promˇenn´e nab´yvat a takto specifikovan´ymi moˇznostmi hodnot promˇenn´ych se prov´ad´ı verifikace. Pokud jsou vstupn´ı data typu boolean nen´ı probl´em prov´est verifikaci nad vˇsemi moˇznostmi hodnot, u typu integer jiˇz nast´av´a probl´em s vygenerov´an´ım vˇsechn moˇznost´ı hodnot a u promˇenn´e typu float je to jiˇz velmi nevhodn´e.

(28)

K ˇreˇsen´ı tohoto probl´emu slouˇz´ı CG, pomoc´ı kter´ych m˚uˇzeme zadat jak´ych hodnot m´a promˇenn´a nab´yvat pˇri verifikaci (explicitn´ı urˇcen´ı

”zaj´ımav´ych“ hodnoty pro ve-rifikaci). Pomoc´ı CG lze vymezit interval moˇzn´ych hodnot Na obr. 4.3(a) typ bo-olean nab´yv´a vˇsech moˇznost´ı, typ integer nab´yv´a hodnot ze zvolen´eho intervalu a u typu float i po vymezen´ı intervalu z˚ust´av´a velk´e mnoˇzstv´ı moˇzn´ych hodnot. Proto je zde dalˇs´ı mechanizmus jak urˇcit interval i krok mezi jednotliv´ymi hodnotami. Pˇresn´e hodnoty promˇenn´e se pak definuj´ı aˇz pomoc´ı nastaven´ı parametr˚u pˇri spuˇstˇen´ı JPF (obr. 4.3(b)). Tento mechanizmus lze pouˇz´ıt napˇr´ıklad pokud z hlediska verifi-kace je potˇreba pouze zjistit, zda je promˇenn´a vˇetˇs´ı nebo menˇs´ı neˇz urˇcit´y pr´ah. Podle v´ysledku se zvol´ı jedna ze dvou moˇznost´ı. Je tedy nadbyteˇcn´e generovat vˇsechny moˇzn´e hodnoty promˇenn´e, pokud je relevantn´ı pouze vztah hodnoty k prahu).

Obr´azek 4.3: Instrukce maj´ıc´ı vliv na pl´anov´an´ı [9]

• Explicitn´ı urˇcen´ı Atomicity spoˇc´ıv´a v proveden´ı urˇcit´eho k´odu programu ato-micky. Ta ˇc´ast k´odu, kter´a m´a b´yt provedena atomicky je explicitnˇe urˇcena uˇzivatelem pomoc´ıVerify.beginAtomic() a Verify.endAtomic(). Z´aroveˇn mus´ı uˇzivatel zaruˇcit, ˇze d´ıky t´eto atomicitˇe nedojde k nenalezen´ı chyby v syst´emu.

4.4

Rozˇ

siˇ

ritelnost

Pro vyuˇzit´ı JPF v projektu SHADOWS je podstatn´a jeho vlastnost rozˇsiˇritelnosti. JPF je open source a je tedy moˇzn´e doimplementovat jin´e vlastn´ı moduly nebo funkce. Pro z´ısk´an´ı dalˇs´ıch vlastnost´ı z verifikovan´eho syst´emu je moˇzn´e vytv´aˇret nov´e listenery, nov´e pro-hled´avac´ı strategie. Ty mohou b´yt modifikac´ı jiˇz naimplementovan´ych a upraveny pro kon-kr´etn´ı ´uˇcel nebo je moˇzn´e vytv´aˇret nov´e strategie spojen´ım v´ıce pˇr´ıstup˚u dohromady.

References

Related documents

Congress, all use of marijuana is recreational drug use, the combating of which is admittedly the core purpose of the federal CSA. 29 This case presents the question of whether

To capture CNVs within CDH candidate regions, we developed and tested a targeted array comparative genomic hybridization platform to identify CNVs within 140 regions in 196 patients

This paper presents research into an initiative that promotes extracurricular sport and physical activity opportunities for young people in Welsh secondary schools.. The

Working in conjunction with the Stroke Association this service provides a community approach in rehabilitation supporting those with an acquired brain injury and/or

The tropospheric origin of GOM measured at the Råö site is further supported by the fact that the highest GOM values were observed in conjunction to the import of air masses from

product/software plus a few fictional personal/demographic details to make it a realistic character. However, in computing fields, such as HCI, there is a lack of

To facilitate course and program submissions universities, colleges, and career-technical institutions we will be using program accreditations or state board approvals as proof

or information about their expertise, which is repeated mainly with Negation feedback. Social: we mean context information related to a user’s role at work, and