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 SYSTEMSBOUNDED MODEL CHECKING
V N ´
ASTROJI JAVA PATHFINDER
DIPLOMOV ´
A PR ´
ACE
MASTER’S THESIS
AUTOR PR ´
ACE
Bc. VENDULA HRUB ´
A
AUTHOR
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 SYSTEMSBOUNDED 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
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
Bounded model checking
v n´
astroji Java PathFinder
Prohl´
aˇ
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.
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
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.
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.
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
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
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
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
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.
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.
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
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
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).
3.3
V´
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
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.
• 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
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
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.
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.
4.1
Z´
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.
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.),
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.
• 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.
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.