320 likes | 422 Views
Statička analiza programa u XML okruženju. Damir Kirasić Sveučilište u Zagrebu Fakultet elektrotehnike i računarstva. Rad objedinjuje. statičku analizu izvornog koda XML okruženje XML format zapisa oruđa za XML (API, parseri, XQuery,...). Cilj rada je.
E N D
Statička analiza programa u XML okruženju Damir Kirasić Sveučilište u Zagrebu Fakultet elektrotehnike i računarstva
Rad objedinjuje • statičku analizu izvornog koda • XML okruženje • XML format zapisa • oruđa za XML (API, parseri, XQuery,...)
Cilj rada je • istražiti nove, bolje mehanizme za analizu koda • napraviti učinkovito oruđe za statičku analizu izvornog koda • koristiti gotove, provjerene komponente koje su utemeljene na otvorenim standardima (XML)
Zašto analizirati kod? • Programi su postali VRLO kompleksni • Editori, deuggeri, source code sustavi - osnovna programerska pomagala - izmišljni su prije 30 godina. • Oruđa za razvoj programa ne slijede porast kompleksnosti programa.
Analiza koda - općenito • verifikacija programa • statička analiza • dinamička analiza (podvrsta je testiranje) • provjera modela • rezanje programa
Statička analiza izvornog koda Ciljevi: • odsustvo grešaka (ispravnost) • logička ispravnost programa • programska metrika (mjere kompleksnosti) • razumijevanje (refactoring) • optimizacija • uspoređivanje
Ispravnost programa • ispravnost koja je dublja od one koju kontrolira kompilator • npr. u SVAKOM putu izvođenja nakon open(“abc”) postiji i close(“abc”) • npr. niz naredbi obj = null; obj.method(); ne može biti ispravan • ovakve stvari se zovu: “control flow analysis”
Logička ispravnost • prepoznavanje značajki programa (eng. features locating) • povezivanje velikih komponenti sustava • uključivanje specifičnog znanja o području za koje je napisan program (npr. dead lock analiza za konkurentne programe; matematička logika za sustave upravljanja, ...)
Programska metrika • Broj: klasa, konstruktora, metoda, varijabli • Dubina u stablu nasljeđivanja za klase • Dubina ugnježđenih petlji (npr. ako imamo više od 2 for petlje jedna u drugoj => možda treba razbiti metodu na dvije) • Broj staza izvođenja unutar metode • . . .
Razumijevanje programa • rekonstrukcija logike programa iz gotovog programa (npr. nema nikakve dokumentacije => automatsko generiranje dokumentacije) • prepoznavanje programskih obrazaca (npr. program koristi Visitor obrazac) • rekonfiguriranje postojećeg programa prema novom dizajnu
Optimizacija programa “data flow analysis” a = 1; ... // tu se ne koristi varijabla a a = 2; => a = 1; možemo obrisati
Optimizacija programa • Kompilatori rade sve bolju optimizaciju i analizu (npr. –Wunreachable-code u gcc-u, javac –Xlint u javac) • Ne treba se s analizom mješati u njihov posao – treba u analizi raditi ono što oni ne mogu, kompleksnije analize. • Pojavljuju se kompilatori kojima korisnik može dodati svoj kod.
Uspoređivanje programa • Automatsko utvrđivanje plagijata • Pronalaženje razlika • Sudska vještačenja i sl.
Oruđe za analizu Izvorni kod Analizator Upute, pravila Izvještaj
Postojeća oruđa za analizu • lint, splint, LClint • ESC/Java • Purify • PREfix, PREfast • Slam • ESP • Vault . . .
XML tehnologije • vrlo raširene • stalno se poboljšavaju • ima puno oruđa za rad s XML dokumentima: • standardni Xml API u C# i Javi, • XML editori, verifikatori, parseri, translatori, • XML Query Language (XQuery)
XML i programsko inžinjerstvo • Odlično se slažu • XML se već naveliko koristi: • kod pisanja build sustava (ant, nant) • inicijalnih vrijednosti aplikacija (C# prog.exe.config) • opisa velikih komponenti (EJB) • opisa modela (UML) • . . .
Izvorni kod i XML • Izvorni kod (Java, C#, C++) se može prevesi u XML. • Struktura XML dokumenta (stablo) je potpuno prikladna za prikaz strukture programa (stablo). • Postojeća XML oruđa bi se mogla koristiti za obradu prevedenog izvornog koda.
Izvorni kod u XML-u <class name=“A”> <field> <variable type=“in” name=“x”/> </field> <constructor name=“A”> <block> . . . </block> </constructor> <method name=“m1” access=“public> <block> . . . </block> </method> </class>
XQuery • Ono što je SQL za relacione baze podataka to je XQuery za XML dokumente • XQuery standard definira matična organizacija za XML w3c.org http://www.w3.org/TR/xquery/ • Standard još nije potpuno dovršen. • Postoji već puno implementacija za “XQuery engine” – interpreter za XQuery
XQuery – 3 primjera doc(“prog.xml”)//class/method[@access = “public”] (: public metode sa sadržajem :) count(doc(“prog.xml”)//class/method[@access = “public”]) (: broj public metoda :) <possibleSingletonClasses> { (: moguće klase tipa Singleton :) for $c in doc("singleton.cs")//class return if ( fn:empty($c/constructor[@access = "public"]) and not(fn:empty($c/constructor[@access = "private"])) and not(fn:empty($c/method[@type = string($c/@name) and @access = "public" and @modifiers = "static"]))) then <class> { $c/@name} </class> else () } </possibleSingletonClasses>
XQuery – 1 primjer (: mStyle.xquery DK Reports fields that does not start with "m“ :) <report> { for $v in doc("E:\code\ipsi\ddir\location.xml")//field//variable return if ( not(starts-with(string($v/@name), "m")) ) then <wrongMemberName> { $v/@name, $v/../../location } </wrongMemberName> else () } </report>
Oruđe za analizu Izvorni kod Parser stvara AST Prevodilac AST u XML XQuery engine Upute, pravila Formatiranje izvještaja Izvještaj
Problemi • XQueri jezik nije završren • MS implementacija XQuery-a nije kompletna – radim s MS Visual C# Express beta - (npr. naredba “let” uopće nije implementirana) • za C++ nisam našao XQuery stroj
Interna struktura oruđa (trenutno) • Analizator za C# koristi komponente (parser i XQuery) pisane u C# • Analizator za Javu koristi komponente (parser i XQuery) pisane u Javi • Moguće je mješati komponente pisane u različitim jezicima
Glavne komponente oruđa (trenutno) • Glavni program (povezuje sve komponente) • Korisničko sučelje (GUI, line, nemam plug-in) • Izvorni kod -> XML prevodilac • XQuery stroj • Formater izvještaja (izlaz je goli XML)
Glavne komponente GUI sučelje line sučelje plug-in sučelje Cs2Xml previdilac Glavni program XQuera Upute Pravila XQuery stroj Izvještaj Formatiranje izvještaja
Interna struktura oruđa • Parseri nisu pisani iz nule, koriste se generatori (sharpdevelop, CoCo/R za C#, ANTLR za Javu) • Nakon previđenja XML se NE sprema u datoteku već se drži kao XML DOM u memoriji, a XQuery stroj radi s DOM-om
Što dalje? • Jasno definirati API između pojedinih komponenti. Time dobivamo modularnost i proširivost – oruđe postaje “framework”. • C++ u XML prevodilac (pronaći gotovo?) • C++ XQuery stroj (pronaći gotovo?) • Biblioteka XQuery funkcija za uobičajene poslove u analizi programa.
Što dalje? 5. Ulaz bi mogao biti “makefile, “ant file”, MS Visual Studio projekt file, ... • Plug-in za Eclipse, Sharpdevelop, ... • Transformacija XML izvještaja u • tekst • HTML • drugačiji XML (XSLT) • PDF
Što dalje? 8. Napraviti novi XQuery interpreter i dodati mu stvari koje su potrebne za analizu (ovo je teško). 9. Napraviti Web stranice i započeti “Open source” projekt (ovo ako hoćemo biti svjetski).
Sažetak • Rad objedinjuje područje statičke analize programa i XML tehnologije. • Donosi novu metodologiju, novi mehanizam za statičku analizu. • Omogućuje: • prenosivost, usporedivost mehanizma analize • prenosivost rezultata analize • I mehanizmi i rezultati su dosad bili “zatvoreni” i “proprietary”.