Sunteți pe pagina 1din 13

Vericarea programelor

31 octombrie 2011

Scopul veric arii

demonstrarea c a programul e corect (dac a metoda si programul permite) g asirea de erori metode dedicate doar g asirii de erori sau ca efect lateral, la e secul demonstr arii corectitudinii

Metode de vericare

static a = f ar a execut ia codului detect ie de tipare analiz a de ux de date vericare formal a dinamic a = cu execut ia codului instrumentare / rulare pe ma sin a virtual a execut ie simbolic a

Ce ncredere am n rezultat ?

Metoda e: consistent a ? (engl. sound) = orice r aspuns e bun ? complet a ? = g ase ste toate r aspunsurile ? Vericare: consistent: un sistem raportat corect e corect complet: poate determina corectitudinea oric arui sistem Detect ie de erori: consistent: o eroare raportat a e real a complet: g ase ste toate erorile

Vericarea formal a
Sistemul e modelat matematic sunt posibile rezultate garantate (certicate) n limitele posibilit a tilor//presupunerilor de modelare Demonstrare de teoreme condit ii de vericare (din reguli Hoare) demonstrat ii (sau algoritmi de realizabilitate a formulelor) (SAT-solvers) probleme: necesar de anotat ii pentru formule complexe interact iune intens a cu expertul uman Model checking sistem = automat cu st ari nite algoritm = explorarea spat iului st arilor (traversare de grafuri) automat; d a contraexemplu n caz de eroare problema: explozia spat iului st arilor

Model checking software in practic a


Un prim exemplu de succes: Proiectul SLAM [Microsoft Research] (Software (Specications), Languages, Analysis and Model checking) ulterior, model checker similar: BLAST (UC Berkeley) Scopul: vericarea unor propriet a ti de sigurant a (invariant i) concret: un program respect a regulile de utilizare API (ex: apelurile la lock() si unlock() alterneaz a concentrat mai ales pe descoperirea erorilor de interfat a utilizat practic pentru device drivers n Windows NT/XP Caracteristici: nu necesit a anotarea programului de c atre utilizator (doar specicarea unor reguli sub form a de automat - monitor) vericarea e f acut a automat, pentru toate execut iile posibile; se genereaz a un contraexemplu (execut ie concret a) n caz de eroare

Exemplu de program

do { // Fragment de device driver [Ball & Rajamani 01] KeAcquireSpinLock(&devExt->writeListLock); nPacketsOld = nPackets; request = devExt->WriteListHeadVa; if(request && request->status) { devExt->WriteListHeadVa = request->Next; KeReleaseSpinLock(&devExt->writeListLock); irp = request->irp; if (request->status > 0) { irp->IoStatus.Status = STATUS SUCCESS; irp->IoStatus.Information = request->Status; } else { irp->IoStatus.Status = STATUS UNSUCCESSFUL; irp->IoStatus.Information = request->Status; } SmartDevFreeBlock(request); IoCompleteRequest(irp, IO NO INCREMENT); nPackets++; } } while (nPackets != nPacketsOld); KeReleaseSpinLock(&devExt->writeListLock);

Specicarea propriet a tilor


state { enum { Unlocked=0, Locked=1 } state = Unlocked; }

KeAcquireSpinLock.return { if (state == Locked) abort; else state = Locked; } KeReleaseSpinLock.return { if (state == Unlocked) abort; else state = Unlocked; } Specicarea este tradus a n C si programul original este instrumentat (programul original corect programul instrumentat nu atinge eroare)

Abstract ia n vericare

programul n general poate foarte complex potent ial, multe instruct iuni din program nu sunt relevante pentru proprietatea dorit a am dori s a ne concentr am asupra port iunii relevante din program Tehnic a: program slicing determinarea fragmentului (slice) de program care afecteaz a o anumit a proprietate (slicing criterion) a programului (ex. valoarea unei variabile ntr-un punct) Not iune mai general a: abstract ia = generarea unui model (program) simplicat, prin a c arui analiz a deducem propriet a ti ale programului original predicat = condit ie boolean a (expresie din variabilele programului)

Generarea programului boolean


Porne ste de la predicatele din specicat ie nondeterminism n control; skip pentru instruct iuni irelevante;
do { A: KeAcquireSpinLock return(); skip; if(*) { B: KeReleaseSpinLock return(); if (*) { skip; } else { skip; } } } while (*); C: KeReleaseSpinLock return();

Analiza programului boolean (model checking)

Se calculeaz a mult imea st arilor atinse: stare = atribuire pentru variabilele din domeniul de vizibilitate mult ime de st ari = funct ie boolean a, reprezentat a ecient (diagrame de decizie binare, BDD) calculul cu mult imi de st ari: captureaz a corel arile ntre variabile relat ie de tranzit ie: tot o formul a boolean a state = 0 state = 1 Pentru exemplul dat: se semnaleaz a eroare, se poate parcurge A: KeAcquireSpinLock() de dou a ori succesiv

Contraexemplul si generarea noilor predicate


Se stabile ste dac a contraexemplul n programul abstract reprezint a un contraexemplu n programul concret. (execut ie simbolic a nainte pe calea contraexemplului). Dac a contraexemplul e fezabil, reprezint a o eroare real a. Dac a contraexemplul nu e fezabil: se pleac a napoi din starea de eroare n programul abstract cu reguli Hoare / wp Dijkstra se parcurge calea de eroare napoi ( n programul abstract), acumul and constr angerile deduse p an a se g ase ste o inconsistent a ] se caut a una minimal a si se genereaz a predicatele corespunz atoare. In exemplu: nPacketsOld = nPackets si nPacketsOld != nPackets procedurile de decizie sunt incomplete poate returna nu stiu Se regenereaz a programul boolean cu noile predicate si se reia vericarea. Tehnica: counterexample-guided abstraction renement

Al doilea program boolean


do { A: KeAcquireSpinLock return(); b = T; /* b == (nPackets == nPacketsOld) */ if(*) { B: KeReleaseSpinLock return(); if (*) { skip; } else { skip; } b := choose(F, b); /* choose(p1, p2) == p1 ? T : p2 ? F : nondet */ } } while (!b); C: KeReleaseSpinLock return(); Abstract ia obt inut a este sucient a pentru a demonstra corectitudinea.