Kotrakt baserad desig Desig by cotract
Motiverig Objekt ka valige ite avädas på ett godtyckligt sätt Metoder ska aropas med vissa parametervärde I rätt ordig Svårt att veta hur ett objekt ka avädas uta att veta i detalj hur det fugerar Källkode ite alltid tillgäglig Också om de är tillgäglig så ka det krävas mycket tid för att förstå de tillräckligt bra
Kotrakt baserad desig Det fis alltså ett kotrakt mella varje objekt och dess avädare Kotraktet säger vad objektet gör och hur det ka avädas Avädare garaterar att objektet aropas på korrekt sätt Om objektet aväds på korrekt sätt så producerar det ett korrekt resultat Java modellig laguage (JML) är e implemetatio av kotrakt för Java Kotrakte är exekverbara Verktyg för testig och statisk verifierig
JML Formellt specifikatiosspråk för Java Aväds för att specificera beteedet för Java klasser Skriva er desig- och implemetatiosbeslut Består av assertios i Java källkode förvillkor (pre-coditios) eftervillkor (post-coditios) ivariater (ivariats)
JML (forts.) JML assertios sätts till som kommetar mella /*@...@*/ eller efter //@... Kompatibelt med valig Java Specifikatioer består av booleska uttryck i Java som utvidgats med ågra operatorer (\old, \forall, \result,...) Och ågra yckelord (requires, esures, pure, ivariat,...)
För och eftervillkor Exempel: specifikatio av metod för att beräka kvadratrot /*@requires x>=0; @esures Math.abs(\result*\result x)<tol; @*/ public static double sqrt( double x){...} requires specifierar vad metode kräver för att fugera korrekt esures specifierar vad metode lovar göra. Beräka kvadratrote med precisioe tol
För- och eftervillkor (forts.) För- och eftervillkore bildar ett kotrakt Kliete måste garatera förvillkoret, me ka ata att eftervillkoret håller Metode ka ata att förvillkoret håller, me måste då se till att garatera eftervillkoret Alltså... Om ett assertio villkor ite håller betyder det att det fis ett fel i programmet (eller i villkoret) Om förvillkoret ite håller är det fel i aropare Om eftervillkoret ite håller är det fel i metode som villkoret hör till Delig av asvar
Udatag (Exceptios) Alterativ kvadratrotsspecifikatio /*@ esures (\result*\result x)<tol; sigals (SqrtExceptio e) x<0; @*/ public static double sqrt(double x) throws SqrtExceptio Metode ka aropas med vilka värde på x som helst Ett udatag geereras om x är midre ä oll
Ivariater Ivariater (Klass ivariater) beskriver egeskaper som måste bevaras av alla metoder i klasse public class Accout{ private it balace; private Perso ower; /*@ivariat balace>=0 && ower!=ull; @*/... Ivariater är implicit ikluderade i alla för- och eftervillkor Ivariater måste bevaras också då udatag har geererats
Ivariater (forts.) Ivariater är bra för att dokumetera desigbeslut public class Directory{ private File[] files; /*@ivariat files!=ull && (\forall it i; 0<=i && i<files.legth; files[i]!=ull && files[i].getparet()==this); @*/ Gör beslute syliga och hjälper för att förstå kode
När ska ivariate hålla? Då förvillkoret för e metod håller, så ska metode efter att de blivit exekverad se till att ivariate håller Kostruktor för objektet ska se till att ivariate håller då de har exekverats färdigt
När är e metod korrekt? E metod är korrekt om: Me... { iv pre} body{ post iv} class A{ //@ivariat J; public void m1(){...} public void m2(){... m1(); //hur fukar det här?... }...
o_ull Måga ivariater, för- och eftervillkor hadlar om att refereser ite får vara lika med ull. Nyckelordet o_ull är avädbart för detta public class Directory{ private /*@ o_ull @*/ File[] files; void createsubdir(/*@ o_ull @*/ Strig ame){...} } Directory /*@ o_ull @*/ getparet(){...}
assigable Också möjligt att uttrycka vilka variabler som ka modifieras /*@ requires amout >=0; assigable balace; esure balace==\old(balace)-amout; @*/ public it debit(it amout){...} debit ka edast modifiera balace Stadard är assigable \everythig
pure E metod som ite modifierar variabler (är uta bieffekter) kallas pure public /*@ pure @*/ it getbalace(){...} /*@ pure; o_ull @*/ Directory getparet(){...} Dessa metoder har implicit assigable \othig De ka också avädas i specifikatioer //@ ivariat 0<=getBalace() && getbalace()<=max_balance;
assert Ett assert uttryck ger ett villkor som ska hålla åstas i kode if (i<=0 j<0){... }else if (j<5){ //@assert i>0 && 0<j && j<5;... }else { //@ assert i>0 && j>5;... }
assert (forts.) JML yckelordet assert är u också ett yckelord i Java (se 1.4) JML versioe är fortfarade bättre, till exempel for (=0;<a.legth;++){ if (a[]==ull) break; /*@assert (\forall it i=0; 0<=i &&i<; a[i]!=ull); @*/
JML verktyg Parsig och typcheckig Rutime assertio checkig Testa om assertio villkor håller uder exekverig jmlrac Exteded static checkig Automatisk program verifierig Bevisa att kotrakt aldrig bryts då programmet kompileras ESC/Java2 Stöder tyvärr bara Java upp till 1.4
Rutime assertio checkig jmlrac kompilator frå Iowa State Uiversity Översätter alla JML assertios till villkor som testas uder exekverig Lätt att aväda Bättre testig och bättre feedback, eftersom mera egeskaper testas E.g Ivariat violated i lie 8000 efter 1 miut istället för NullPoiterExceptio i lie 2000 efter 5 miuter Ett assertio villkor som ite håller ka också bero på att specifikatioe är felaktig jmrac ka testa alla JML uttryck, också sigal, \forall, etc
Exteded static checkig ESC/Java2 Helt automatiserad programverifierig Några kompromisser för att åstadkomma full automatio Försöker bevisa att ett program är korrekt Ite sud (soud): ESC/Java2 kaske ite hittar all fel som fis Ite komplett: ESC/Java2 ka vara om fel som ite existerar Me de hittar måga potetiella fel Bra på att bevisa att udatag ite geereras då programmet körs (Null-, ArrayIdexOutOfBouds-, ClassCastExceptios) och för att verifiera relativt ekla egeskaper
Rutime vs Static ESC/Java2 aalyserar specifikatioer uder kompilerig meda jmlrac gör det uder exekverig ESC/Java2 bevisar korrekthete, jmlrac bara testar de ESC/Java2 oberoede av hur bra testfall ma har jmlrac bara så bra på att hitta fel som testfalle ma har skapat ESC/Java2 ger större garatier för korrekthet ESC/Java2 kräver mera oggraa specifikatioer => mera jobb
Mera Ifo De här presetatioe baserar sej på Itroductio to JML av David Cok, Joe Kiiry och Eric Poll E itroduktio till JML fis som kursmaterial Verktyg och dokumetatio fis att ladda er: http://www.eecs.ucf.edu/~leaves/jml/ http://secure.ucd.ie/products/opesource/escjava2/