Statikus Programellenrzs Absztrakt Interpretci Nagyhatkonysg Logikai Programozsi technikk
Statikus Programellenőrzés Absztrakt Interpretáció Nagyhatékonyságú Logikai Programozási technikák segítségével Várady Gergely 2003. június. 19.
Tartalom • Szoftver verifikáció, formális módszerek • Absztrakt Interpretáció (AI) • AI és a logikai programozás (XSB) • Absztrakt interpreterek XSB-ben • AI kényszer-kielégítéssel (CLP) – Program verifikációs példa 2
Bevezetés • Hatalmas növekedés – HW SW – Nagy programrendszerek – Több 1000 fős fejlesztői és karbantartó csapatok • Programok jelentős szerepe az élet rengeteg területén • Szoftver megbízhatósági probléma fontossága nő 3
Szoftver Verifikáció • Verifikáció: a specifikációnak való megfelelés (helyesség) ellenőrzése • „Kézzel” ellenőrizhetetlen programok • Számítógéppel segített ellenőrzés kell 4
Tesztelés • Program szimulálása sok különböző környezetben (debug-olás) • Egyes végrehajtási utak ellenőrzése, de nem összes! + Valóságos rendszert ellenőrzi (nem modellt) – Csak kimutat hibákat, nem bizonyítja hiányukat 5
Formális módszerek • Program helyességének formális bizonyítása • Matematikai alapok: logika, automata- vagy gráfelmélet • Formális specifikáció: precíz, ellentmondásmentes • Program helyesség (általánosan) algoritmikusan eldönthetetlen probléma • Egyszerűsített program (modell) kimerítő vizsgálata absztrakció 6
Absztrakt Interpretáció • Absztrakt értékek és függvények • Vezérlési szerkezet (végrehajtási utak) absztrakciója • (Absztrakt) program végrehajtható • Absztrakció információ veszteség „igen–nem–eldönthetetlen” jellegű válaszok 7
Absztrakciók • Tartomány absztrakció, pl. : – Intervallum – Kongruencia • Függvény absztrakció • Vezérlés absztrakciója: – Fixpont szemantika f fixpontja S, ha f (S) = S 8
Statikus programellenőrzés • Statikus programellenőrzés absztrakt interpretációval 9
XSB Prolog • Logikai programozási nyelv (Prolog) • Absztrakt tartomány eldönthetetlen feltételek (pl. : if) nemdeterminizmus • Terminálási problémák (while) • Fejlett rezolúciós stratégia (táblázás) a(1, 1). a(2, 1). tca(X, Y) : a(X, Y). tca(X, Y) : a(X, Z), tca(Z, Y). 10
Absztrakt Interpretáció XSB-vel • Egyszerű procedurális nyelv interpretálása - Egész és valós változók Egyszerű aritmetikai műveletek (+, -, *) Logikai operátorok (<, =, >) Vezérlési struktúrák (if, while) Egymásba ágyazott eljárások • Interpreter keret (eval. Stmt, eval. Exp) • Absztrakt interpreter: adott absztrakt megfelelő (változók, műveletek, vezérlés) • Fixpontok számítása automatikusan 11
Intervallum absztrakció Valós interpreter Intervallum absztrakció eval. Exp(int(V), _, V). eval. Exp(int(V), _, V-V). eval. Exp(op(+, E 1, E 2), Stack, V): eval. Exp(E 1, Stack, V 1), eval. Exp(E 2, Stack, V 2), V is V 1 + V 2. eval. Exp(op(+, E 1, E 2), Stack, Min-Max): eval. Exp(E 1, Stack, Min 1 -Max 1), eval. Exp(E 2, Stack, Min 2 -Max 2), interval_add(Min 1, Min 2, Min), interval_add(Max 1, Max 2, Max). eval. Stmt(if(Bool, Then, Else), Stack 0, Stack): eval. Exp(Bool, Stack 0, BVal), (Bval == 0 -> eval. Stmts(Then, Stack 0, Stack) ; eval. Stmts(Else, Stack 0, Stack) ). eval. Stmt(if(Bool, Then, Else), Stack 0, Stack): eval. Exp(Bool, Stack 0, BMin-BMax), ( BMax =: = 1, eval. Stmt(constraint(Bool, true), Stack 01), eval. Stmts(Then, Stack 01, Stack) ; BMin =: = 0, eval. Stmt(constraint(Bool, false), Stack 01), eval. Stmts(Else, Stack 01, Stack) ). 12
Futási példa (intervallum) • Példaprogram: • Inicializálás: while j < 0 j : = j + 1 j [-20, ) j [0, ) Prolog XSB (táblázással) | ? - test(interval, [[(j, -20 -sup)]], Stack). initial : [[], [(j, -20 -sup)]] Stack = [[(j, 0 -sup)]]; j: =j+1 -> [[], [(j, -19 -0)]] Stack = [[(j, 0 -0)]]; | ? - test(interval, [[(j, -20 -sup)]], Stack). initial : [[], [(j , -20 -sup)]] Stack = [[(j , 0 -0)]]; Stack = [[(j , 0 -sup)]]; no j: =j+1 -> [[], [(j, -1 -0)]] Stack = [[(j, 0 -0)]]; j: =j+1 -> [[], [(j, 0 -0)]] Stack = [[(j, 0 -0)]]; no 13
Kényszer-kielégítés – CLP • Változók • Kényszerek (pl. : X < 3 Y + 4 Z) • Megoldás (kényszerek kielégítése) – Numerikus (CSP) – Szimbolikus (Constraint Solving) • Constraint Logic Programming (CLP) – Prolog + kényszer-kielégítés – Különböző tartományokon • Igazságértékek: clp(B) • Racionális / valós számok: clp(Q), clp(R) • Véges tartományok: clp(FD) – clpr könyvtár XSB 14
Továbbfejlesztett Interpreter Aritmetikai kifejezések eval. Exp(op(+, E 1, E 2), Stack, V) : eval. Exp(E 1, Stack, V 1), eval. Exp(E 2, Stack, V 2), { V = V 1 + V 2 }. Logikai kifejezések eval. Exp(op(=<, E 1, E 2), Stack, V) : eval. Exp(E 1, Stack, V 1), eval. Exp(E 2, Stack, V 2), (entailed(V 1 =< V 2) -> V=1 ; true), (entailed(V 1 > V 2) -> V=0 ; true). Vezérlési szerkezet eval. Stmt(if(Bool, Then, Else), Stack 0, Stack) : eval. Exp(Bool, Stack 0, BVal), ( { Bval=1 }, eval. Stmt(constraint(Bool, true), Stack 01), eval. Stmts(Then, Stack 01, Stack) ; { BVal=0 }, eval. Stmt(constraint(Bool, false), Stack 01), eval. Stmts(Else, Stack 01, Stack) ). 15
Program verifikációs példa • Példaprogram pszeudokódja • Futási eredmények proc bubble_sort(a[1. . n] of real) for f : = n to 2 do for i : = 12 to n-1 do if a[i] > a[i+1] then dummy = a[i]; a[i] = a[i+1]; a[i+1] = dummy; fi od od end Helyes program Hibás program | ? - bubble_sort([A, B, C], [D, E, F]), {D=<E, E=<F}. yes | ? - bubble_sort([A, B, C], [D, E, F]), {D>E}. no | ? - bubble_sort([A, B, C], [D, E, F]), {E>F}. no | ? - bubble_sort([A, B, C], [D, E, F]), {D>E}. yes ! 16
Összefoglalás • Absztrakt interpretáció: program dinamikus jellemzőinek statikus vizsgálata • Absztrakció állapottér bejárható, de információvesztés részleges döntés • Megvalósítás: Prolog nemdeterminizmus táblázás fixpontszámítás clp(R) szimbolikus számítások XSB • Alkalmazás program verifikációra 17
Jövőkép UML modell Parser Statikus verifikáció Automatikus kódgenerálás Programkód Parser Alacsonyszintű kód 18
- Slides: 18