Raport de Cercetare

 

Grant: Modelarea, analiza si verificarea sistemelor software (tema 4, cod CNCSIS 23)

Autor: conf. dr.ing. Marius Minea

Universitatea “Politehnica” din Timisoara

 

Echipa de proiect:

– s.l.dr.ing. Radu Marinescu

– s.l.dr.ing. Dan Pescaru

– s.l.dr.ing. Ioana Sora

– as.drd.ing. Cristina Marinescu

Obiectivul general al proiectului a fost continuarea și extinderea cercetării membrilor echipei în modelarea, analiza și verificarea de software, pentru o integrare eficientă și o aplicabilitate practică sporită. În cadrul acestui obiectiv general, au fost tratate următoarele obiective științifice:

1. Modelarea sistemelor software, cu următoarele activități:

1.1. Extinderea limbajului de descriere pentru componente compozabile, incluzând o implementare a acestuiaž si un repozitoriu de componente.

1.2. Extinderea semanticii modelelor utilizând sistemul OFL, pentruîmbunătățirea modelării sistemelor software complexe.

2. Analiza cu metrici de calitate, cu următoarele activități:

2.1. Extinderea metamodelului MeMoJ, permițând analize structurale independente de limbajul sursă

2.2. Sistematizarea și extinderea SAIL, pentru exprimarea uniformă si facilă a strategiilor de detecție

3. Verificare formală, cu următoarele activități:

3.1. Formalizarea descrierii pe componente, extinderea ei și verificarea compunerii componentelor

3.2. Detecția erorilor prin analiză statică, în vederea aplicabilității practice, și a perspectivei de unificare cu modelul de analize structurale

Diseminarea rezultatelor cercetării s-a efecutat prin publicarea a 16 articole științifice, din care 1 intr-un jurnal, 7 la conferinte si simpozioane în strainatate, cotate INSPEC, 4 la conferinte internationale recenzate desfasurate în România, și 4 la simpozioane locale:

1. Ioana Șora, Vladimir Cretu, Pierre Verbaeten, Yolande Berbers.  Managing Variability of Self-Customizable Systems Through Composable Components. International Journal of Software Process Improvement and Practice, vol. 10(1), 2005, pp.77-95.

2. Daniel Rațiu, Stephane Ducasse, Tudor Gîrba, Radu Marinescu. Using History Information to Improve Design Flaws Detection. Proceedings of the 8th European Conference on Software Maintenance and Reengineering (CSMR 2004), IEEE Computer Society Press, pag. 223-232

3. Blaise Genest, Marius Minea, Anca Muscholl, Doron Peled. Specifying and verifying partial order properties using template MSCs. Proc. 7th International Conference on Foundations of Software Science and Computation Structures, Lecture Notes in Computer Science 2987, Springer, pp.195-210.

4. Ioana Șora, Vladimir Crețu, Pierre Verbaeten, Yolande Berbers. Automating Decisions in Component Composition Based on Propagation of Requirements, Proc. 7th International Conference on Fundamental Approaches to Software Engineering. LNCS 2984, Springer, p. 374-388.

5. Radu Marinescu. Detection Strategies: Metrics-Based Rules for Detecting Design Flaws. Proc. 20th IEEE International Conference on Software Maintenance, IEEE Computer Society Press, p.350-359

6. Tudor Gîrba, Stephane Ducasse, Radu Marinescu, Daniel Rațiu. Identifying Entities That Change Together. Proceedings of 9th IEEE Workshop on Empirical Studies of Software Maintenance, 2004.

7. Radu Marinescu, Daniel Rațiu. Quantifying the Quality of Object-Oriented Design. Proc. 11th IEEE Working Conference on Reverse Engineering, Delft, IEEE Computer Society Press, 2004, p.192-201

8. Petru Mihancea, Radu Marinescu. Towards the Optimization of Automatic Detection of Design Flaws in Object-Oriented Software Systems. Proc. 9th European Conference on Software Maintenance and Reengineering, IEEE Computer Society Press 2005, p.92-101 

9. D. Pescaru, P. Lahire, C. Chirila, E. Ț undrea. A better representation for class relationships in UML using OFL meta-information, Proceedings of IEEE-TTTC International Conference on Automation, Quality & Testing, Robotics (AQTR 2004), Cluj-Napoca, Romania, ISBN 973-713-047-2, pag. 269-274

10. E. Țundrea, P. Lahire, D. Parigot, C. Chirilă, D. Pescaru. SMARTFACTORY - an Implementation of the Domain Driven Development Approach, Proceedings of 1st Romanian - Hungarian Joint Symposium on Applied Computational Intelligence (SACI 2004), Timișoara, Romania, p. 231-240

11. C. Chirilă, P. Crescenzo, P. Lahire, D. Pescaru, E. Țundrea. Factoring Mechanism of Reverse Inheritance, Proc. 6th International Conf. on Technical Informatics (CONTI 2004), Timișoara, p.131-36

12. Ioana Șora. Defining Composable Components in Multi-Flow Architectures Through Structural Constraints, Proceedings of 6th International Conf. on Technical Informatics (CONTI 2004), Timișoara.

13. Daniel Ratiu, Radu Marinescu. Evolution enriched detection of God classes. Proc. of Workshop on Computer Aided Verification of Information Systems (CAVIS 2004), Institutul e-Austria Timișoara.

14. Cristina Marinescu, Radu Marinescu. A dedicated language to object-oriented design analyses. Proceedings of Workshop on Computer Aided Verification of Information Systems (CAVIS 2004), Institutul e-Austria Timișoara.

15. Petru Mihancea, Radu Marinescu. Improving the automatic detection of design flaws in object-oriented software systems. Proceedings of Workshop on Computer Aided Verification of Information Systems (CAVIS 2004), Institutul e-Austria Timișoara.

16. Ioana Șora, V. Crețu. Approaching component composition: architectural vs domain-specific. Proceedings of Workshop on Computer Aided Verification of Information Systems (CAVIS 2004), Institutul e-Austria Timișoara.

 

Au fost conduse 3 lucrări de dizertație și 6 de diplomă cu teme ce abordează aspecte din contract.

Pentru o diseminare suplimentară a aplicabilității practice a rezultatelor cercetării, mediul de analiză structurală dezvoltat în prezentul proiect a fost prezentat și demonstrat în cadrul unei conferințe:

C. Marinescu, R. Marinescu, P. Mihancea, D. Rațiu, R. Wettel - Analysis Infrastructure for Quality Assessment of Object-oriented Design. 6th International Symposium on Symbolic and Numeric Algorithms for Scientific Computing (SYNASC 2004), Timișoara.

Fondurile obținute din grant au fost folosite de asemenea pentru:

– dezvoltarea infrastructurii grupului de cercetare, prin achiziționarea unei imprimante-copiator multifuncționale, necesare în desfășurarea activităților de documentare și editare, a unei table de conferinte precum si actualizarea infrastructurii de calcul

– achiziționarea de cărți de specialitate în domeniul ingineriei software

– editarea a 3 cărți de specialitate cu uz de cercetare și didactic (1 realizată, 2 în pregătire)

– recompensarea activității echipei de cercetare prin salarii

 

1 Modelarea sistemelor software

1.1 Extinderea limbajului de descriere pentru componente compozabile

In cadrul proiectului s-au definit și implementat părți ale unui model compozițional original, compus dintr-o schemă și un formalism de descriere a componentelor și o strategie de compoziție. Existența unui asemenea model este utilă în orice situație de dezvoltare bazată pe componente, dar este esențială și indispensabilă pentru realizarea de unelte care să sprijine activitatea de compunere a unui sistem, deoarece orice automatizare a unor operații de decizie necesită un model sistematic.

Pentru utilizarea corectă a componentelor în compoziții și a automatizării acestui proces este esențială o specificare bună a părților care se compun. Un contract trebuie să specifice care sunt serviciile furnizate de către componente și condițiile cerute pentru a putea funcționa la parametrii contractați. Analizând metodele existente de descriere a componentelor și neajunsurile acestora am dezvoltat o metodă originală de descriere a componentelor adecvată în vederea manipulării lor automate.

S-a pornit de la modelul compozițional bazat pe componente compozabile pentru o clasă de arhitecturi software multi-flux definit in teza dr. ing. Ioana Șora (2003). Conceptele de bază sunt noțiunea de componente compozabile și mecanismul  constrângerilor structurale ca noua metodă de management a variabilității. O componentă compozabilă are o identitate proprie bine definită de porturile sale de interacțiune cu mediul, serviciile pe care le furnizează si cele de care depinde. Structura internă a unei componente compozabile însă nu este fixată, ci poate fi compusă in mod dinamic, în cadrul stabilit de un set de constrângeri structurale. Descrierea unei componente compozabile conține pe lângă interfața sa și constrângerile structurale referitoare la structura internă a componentei.

Constrângerile structurale pentru o componentă compozabilă exprimă linii directoare flexibile ce ajuta la stabilirea compoziției structurii interne a componentei. Rolul lor pentru o componentă compozabilă este de a stabili elementele esențiale ale structurii acesteia. Constrângerile structurale definesc un set de cerințe minime pe care trebuie să le indeplinească structura internă a unei componente pentru a-i asigura acesteia o identitate precizată. Ele nu descriu și nu fixează configurația structurii interne. Mecanismul constrângerilor structurale reprezintă o metodă nouă de management al variabilității, care realizează un echilibru optim între necesitatea de a permite variații neanticipate ale structurii unei componente sau ale unui sistem si necesitatea de a menține identitatea si corectitudinea sa.

În acest proiect, s-a extins conceptual schema de descriere a componentelor compozabile, s-a definit un formalism de descriere (limbajul CCDL) și un repozitoriu de componente. S-a stabilit necesitatea de a descrie componentele in termenii interfeței și a constrângerilor structurale. Interfața unei componente este specificată în termeni de porturi, împreună cu contractele semantice în termenii unor proprietăți cerute si furnizate. Constrângerile structurale pentru o componentă compozabilă sunt exprimate in termeni de fluxuri interne și proprietăți care trebuie să fie prezente pe aceste fluxuri.

Schema de descriere propusă are avantajul că specificațiile au o complexitate redusă și că mecanismul constrângerilor structurale permite un grad ridicat de variabilitate neanticipată, spre deosebire de alte soluții din literatură pentru managementul variabilității unei configurații cum sunt utilizarea de skeleton-uri și puncte de variabilitate. Constrângerile structurale fixează fluxurile interne ale unei componente și stabilesc proprietățile prezente pe fiecare din aceste fluxuri. Prin aceasta, tipul și numărul componentelor care ar putea face parte din configurația structurii interne a componentei compozabile nu sunt precizate și deci nu există limitări în acest sens. Compunerea structurii interne a unei componente compozabile se face în mod dinamic, conform cerințelor de adaptare impuse.

Aceste concepte au fost implementate în forma limbajului declarativ CCDL (Composable Component Description Language). Acest limbaj prezintă unele caracteristici asemănătoare limbajelor de descriere arhitecturală (familia ADL) și limbajelor de descriere a interfețelor (familia IDL), dar fără a se încadra în nici una din aceste categorii. Acest limbaj poate exprima atât contractele componentelor compozabile cât și constrângerile structurale pentru compoziția lor, lucruri care nu s-ar putea realiza în cadrul limbajelor existente din familiile limbajelor IDL si ADL. Limbajul CCDL este definit utilizând XML ca metalimbaj de descriere. Pentru a permite utilizarea descrierilor de componente de către unelte de prelucrare automată, s-a implementat un parser pentru CCDL.

Pentru gestionarea componentelor sunt necesare sisteme de informații software care să asigure reprezentarea și regăsirea componentelor. Descrierile de componente realizate în limbajul CCDL sunt grupate în depozite (repositories) de unde sunt utilizate de unelte de prelucrare automată cum sunt: unelte de compoziție automată care implementează strategii de compoziție bazate pe cerințe și unelte de verificare a corectitudinii semantice a unei compoziții. S-a realizat implementarea unui depozit (repository) de componente. În viitor, elementele dezvoltate in cadrul acestui proiect vor fi integrate cu o strategie de compozitie automată ca mijloc de realizare a sistemelor auto-configurante. Compoziția unui sistem presupune selectarea componentelor adecvate si conectarea lor într-o structură adecvată în vederea compunerii sistemului dorit. Generarea automată a unui sistem nu poate porni doar de la specificarea cerințelor, ci trebuie să dispună și de o specificare a constrângerilor structurale ale sistemului țintă. Limbajul CCDL dezvoltat poate fi folosit cu success in ambele situații de specificare.

 

1.2 Extinderea semanticii modelelor utilizând sistemul OFL

Pentru creșterea calității modelării aplicațiilor software complexe am dezvoltat o metodă bazată pe utilizarea de meta-informații despre un limbaj de programare descris într-un meta-limbaj. Aceste informații vor fi folosite pentru a genera în mod automat profile UML adaptate acestor limbaje de programare. Soluția propusă merge mai departe și sugerează un cadru mai larg care permite extinderea limbajelor de programare existente și nu doar generarea automată de profile pentru acestea. În acest fel, limbajul de programare și profilul generat pentru a fi folosit în faza de modelare pot fi adaptate unor domenii și aplicații reale.

Metalimbajul OFL (Open Flexible Language) a fost dezvoltat la Universitatea Nice-Sophia Antipolis. El se bazează pe trei concepte esențiale ale limbajelor orientate pe obiecte și anume: descrierile - care reprezintă o generalizare a noțiunii de clasă, relațiile - reprezentând o generalizare pentru tipurile de relații dintre clase precum moștenirea sau agregarea și limbajul în sine - reprezentând o cale de organizare a descrierilor și relațiilor pe care le conține. OFL asigură modelarea acestor trei concepte pentru a adapta semantica lor operațională la nevoile programatorului. Astfel este posibilă specificarea unor noi tipuri de relații sau clase (descrieri) care pot fi introduse într-un limbaj de programare existent pentru a îmbunătăți expresivitatea, înțelegerea și capacitățile acestuia de a evolua.

Modelul dezvoltat de noi se bazeaza pe definirea termenului de profil OFL-ML ca fiind un profil UML generat automat și adaptat fiecărui limbaj OFL considerat. Scopul practic este acela de a crea un meta-model pentru astfel de profile. Acest meta-model e numit OFL-ML și asigură regulile de generare automată de profile OFL-ML. Astfel vor exista ”Profil OFL-ML pentru OFL-Java”, ”profil OFL-ML pentru OFL-C++” etc. Simplificat, OFL-ML poate fi considerat o machetă de profile UML. Pentru a obține un profil specific unui anumit limbaj, OFL-ML trebuie ”instanțiat” folosind meta-informațiile OFL precum componente, parametri, caracteristici, aserții și modificatori. Un astfel de profil obținut poate fi utilizat în aplicații de modelare conforme specificațiilor OMG sau în aplicații create special în cadrul OFL. Partea de generare de cod va avea ca și scop crearea unei reprezentări XML a aplicației, reprezentare cunprinzând toate entitățile create de programator cât și informațiile OFL asociate.

Profilul OFL-ML are scopul de a ajuta programatorul în proiectarea, respective modelarea aplicației. Reprezentarea XML generată poate fi apoi procesată de un compilator sau translator OFL. Modelul aplicației in OFL-ML poate ajuta programatorul la validarea modelului, la aplicarea automată de tipare de proiectare, la colectarea de metrici de calitate sau pentru a genera cod executabil.

Elementele folosite la definirea meta-profilului OFL-ML sunt: atomi OFL, componente OFL, parametri OFL, caracteristici OFL accesibile la nivelul componentelor și modificatori OFL.

Un profil OFL-ML utilizează diagrame derivate din UML Static Structures Diagram (numite și Class Diagram). O astfel de diagramă este un graf format din elemente de tip clasificator conectate prin variate relații statice. Aceste elemente aparțin pachetelor UML standard. Limbajul OFL-ML extinde următoarele pachete UML standard: Core și Model Management. Un profil OFL-ML nu va folosi în schimb marcheri UML pentru vizibilitate. în locul acestora se vor etichete de valori (tagged values) corespunzătoare cu modificatorii de control al accesului definiți de respectivul limbaj.

Pentru reprezentarea tipurilor limbajului țintă se definesc noi stereotipuri la nivelul meta-modelul virtual al OFL-ML. Ele corespund OFL-BasicType, OFL-ML ExternalDescription și OFL-DescriptionType. De asemenea sunt adăugate etichetele de valori, constrângerile și restul de elemente necesare pentru completarea profilului. Elementul OFLBasicType este un model pentru tipurile primitive dın limbajele de programare. Elementul UML folosit la modelarea lui este ProgrammingLanguageDataType din pachetul UML Core. Se va genera câte un element de acest tip pentru fiecare membru al listei basicTypes menținută de componenta limbaj.

Stereotipul abstract OFLDescriptionType stă la baza tuturor stereotipurilor ce vor reprezenta componentele de tip descriere (tipurile de clase) permise de acel limbaj. Aceste stereotipuri vor fi generate automat în profilul considerat, numele lor fiind numele componentei fără prefixul Component (ex. pentru ComponentJavaClass numele va fi JavaClass). Constrângerile generate for ține cont de parametrii ConceptDescription:attribute și ConceptDescription:methods. De asemenea vor fi incluse constrângerile asociate modificatorilor legali pentru tipul respectiv de descriere.

Entitatea ExternalDescription, absentă în OFL e introdusă de OFL-ML pentru a permite utilizarea în faza de modelare a descrierilor care provin din afara proiectului (ex. din biblioteci de clase externe). OFL-ML nu poate trata aceste descrieri ca și pe cele obișnuite din cauza opacității lor, neexistând informații OFL asociate. Tratarea acestor elemente cade în sarcina compilatorului sau translatorului OFL. Pentru a specifica informațiile necesare in faza de editare de legaturi, acestui stereotip i se asociază o etichetă cu valoare de tipul taggedValue {externalPath = importPathSpecification}.

Proprietățile (features) reprezintă atributele și metodele definite de o descriere OFL. Ele au ca și correspondent în modelul OFL AtomAttribute și AtomMethod. Pentru reprezentarea relatiilor statice dintre clase, profilul propus defineste două stereotipuri. Stereotipul abstract OFLImportRelationship stă la baza tuturor stereotipurilor ce vor reprezenta componentele de tip relație de import în OFL. El va avea asociate etichete de valori corespunzând caracteristicilor descrise de OFL-AtomRelationship: abstractedFeatures, efectedFeatures, hiddenFeatures, redefinedFeatures, renamedFeatures, removedFeatures și shownFeatures. Stereotipul abstract OFLUseRelationship stă la baza tuturor stereotipurilor ce vor reprezenta componentele de tip relație de utilizare în OFL. Ele vor avea asociate etichete de valori corespunzând unor caracteristicilor descrise de OFL-AtomRelationship. La generarea constrângerilor corespunzătoare vor fi considerați următorii parametrii din  ConceptRelationship: cardinality, repetition, circularity, masking, renaming, removing, showing și dependence. Adițional vor fi generate și elemente pentru tratarea relațiilor de compoziție cu tipurile primitive precum și a relațiilor de tip import sau utilizare.

Pentru a asigura organizarea modelului se vor defini elemente derivate din OFL-package. La fel ca și în UML, un pachet poate cuprinde alte pachete, clasificatori sau asociații. Ca și consecință directă, pachetele pot fi organizate ierarhic. Generarea elementelor specifice unui limbaj se face pe baza unui set de reguli definite la nivelul meta-limbajului. Setul propus cuprinde 26 de reguli. în perspectivă, la dezvoltarea modelului se ia în considerare posibilitatea de a crește adaptabilitatea unui limbaj prin folosirea modelului UML Action Semantics la modelarea corpului metodelor.

Punctul de plecare pentru implementare îl reprezinta aplicatiile dezvoltate anterior in colaborare cu partea franceza, pentru care exista drepturi de utilizare, și anume aplicațiile: OFLDatabase, OFL-Meta și OFL Parser. Pentru completarea cadrului de lucru s-au dezvoltat unelte pentru generea automata de profile (OFL-ML Profile Generator) si utilizarea lor la proiectarea unei aplicatii (OFL-ML Tool).

 

2 Analiza cu metrici de calitate

2.1 Extinderea metamodelului MeMoJ

McC O operație necesară analizei structurii unui sistem software constă în capturarea modelului acestuia, adică extragerea acelor informații din sistem care sunt importante pentru analizele ce se doresc efectuate. În cazul nostru suntem interesați printre altele de: clasele definite în sistemul nostru, câmpuri conținute de fiecare clasă, tipul acestor câmpuri, metodele conținute de fiecare clasă, etc.

Pentru extragerea acestor informații din programe C++ a fost dezvoltat instrumentul software McC (Model Capture for C++). Programul primește la intrare codul sursă al sistemului și furnizează la ieșire un set de tabele text conținând o gamă foarte largă de informații legate de proiectarea sistemului. Printre atuurile programului nostru amintim extragerea unor aspecte legate de proiectarea unui sistem software C++ care sunt de cele mai multe ori neglijate de instrumente software similare deschizând astfel drumul spre identificarea unor noi analize ale structurii sistemelor software C++. Nu în ultimul rând McC s-a dovedit mult mai precis decât un instrument software similar utilizat de noi până acum, și s-a dovedit capabil să extragă modelul unor system software industriale de  dimensiuni considerabile ajungând până la 32 Mo de cod sursă C++.

MEMORIA Analizele structurale utilizate în estimarea calității unui sistem software orientat pe obiecte fac uz de informație structurală extrasă din sistemul analizat. Cu alte cuvinte se lucrează cu un model al sistemului. Există diverse instrumente software (ex. McC) care permit extragerea informației necesare din codul sursă al sistemului ce se dorește a fi analizat. Totuși acest lucru nu este suficient.

În literatura de specialitate sunt descrise multe analize care se pot efectua indiferent de limbajul de programare în care este scris sistemul analizat. Totuși, diferitele instrumente software de capturare a modelului furnizează informația capturată sub diferite modele de date ceea ce face imposibilă efectuarea aceleiași analize pentru sisteme software scrise în limbaje diferite fără a reimplementa analiza în conformitate cu modelul de date specific instrumentului de capturare a modelului utilizat.

Pentru rezolvarea acestei probleme este necesar ca analizele să aibă acces la informația structurală într-o manieră unificată indiferent de limbajul de programare în care este scris sistemul analizat. Ca urmare a fost dezvoltat MEMORIA, un meta-model capabil să stocheze atât modele ale sistemelor software scrise în C++ cât și în Java. Printre atuurile acestui meta-model amintim: capturarea conceptelor fundamentale din limbajele de programare vizate și nu a implementării lor, fapt ce oferă analizelor posibilitatea accesului unitar la informația de proiectare; posibilitatea extinderii meta-modelului pentru a captura și alte informații de proiectare; navigarea ușoară prin sistemul analizat. Subliniem că acest meta-model s-a dovedit util în analiza unor sisteme software de mari dimensiuni.

2.2 Sistematizarea și extinderea SAIL

Limbajul SAIL (Static Analysis Interpreted Language) este un limbaj dedicat analizelor statice legate de calitatea design-ului unui sistem orientat pe obiecte. Acest limbaj este interpretat iar prototipul sau de implementare a fost realizat in Java.

Toate analizele operează asupra unei perspective abstracte a codului sursă, numite modelul sistemului. SAIL păstrează modelul sistemului în memorie sub forma unor colecții predefinite iar tipurile acestor colecții reprezinta metamodelul sistemului. Structura metamodelului e specificată cu ajutorul unor structuri SAIL predefinite (în SAIL structura este mecanismul prin care se pot crea noi tipuri definite de utilizator). Colecțiile predefinite ce formeaza modelul erau umplute cu informația preluată din vechiul MeMoJ (în care puteau fi stocate informații doar despre un sistem implementat în Java) folosind un mecanism de conversie între cele doua modele. Având în vedere că  metamodelul MeMoJ a fost extins, se impunea ca noul metamodel extins să existe și în SAIL. În acest scop s-a modificat structura metamodelului vechi din SAIL astfel incât toată informația existentă în noul metamodel MeMoJ să se regăsească și în SAIL. De exemplu, structura SAIL predefinită Class a fost înlocuită cu structura SAIL predefinită Type capabilă să stocheze informații și despre alte tipuri existente într-un system scris in C++ (ex: uniuni, structuri). Odată cu modificarea structurii metamodelului, a trebuit să fie modificat și convertorul dintre cele două modele. Noul convertor a fost implementat și testat, scriindu-se diferite teste corespunzătoare în JUNIT.

SAIL a fost construit pentru implementarea facilă a analizelor de tipul specificat anterior. Dar ușurința cu care se implementează analizele nu poate fi validată decât prin folosirea limbajului. în acest scop au fost implementate toate metricile care intră până acumîn componența strategiilor de detecție. Metricile implementate se referă la toate entitățile aflate în componența unui sistem orientat pe obiecte: pachete, tipuri, variabile, atribute, metode, funcții. Au fost făcute comparații între implementările aceleiași metrici în SQL, Java și SAIL sub aspectul ușurinței implementării dar și sub aspectul corectitudinii rezultatelor. În vederea stabilirii corectitudinii rezultatelor, au fost analizate atât sisteme Java cât și sisteme C++.

Au fost introduse noi mecanisme în limbaj ce asigură o mai bună expresivitate a analizelor, spre exemplu, un mecanism ce permite crearea cu ușurința a unor grupuri de entități ce aparțin altor entități (ex: grupul metodelor dintr-un pachet, grupul variabilelor locale dintr-o clasa). Mecanismul de selectie a unor entități ce au o anumită proprietate a fost imbunătățit prin parametrizarea funcției de filtrare nu doar cu proprietăți ale entității analizate ci chiar cu însăși entitatea - s-a introdus elementul this. S-au introdus noi operatori asociați unui grup (ex: operatorul prin care se selectează doar elementele distincte dintr-un grup de entități) precum și un operator boolean destinat lucrului cu colecții care specifică dacă elementele a doua colecții sunt identice sau nu.

 

3 Verificare formală

3.1 Formalizarea descrierii pe componente

Acestă activitate și-a propus analiza și extinderea modelului de reprezentare prin componente compozabile CCDL, în vederea îmbogățirii acestuia și în plus formalizarea lui pentru a permite verificarea corectitudinii compoziției între componente. S-au studiat si comparat abordarile existente in literatura pentru limbaje de descriere a componentelor si compozitiei lor. Extinderea limbajului CCDL a fost abordată în spiritul unui compromis cat mai bun intre o descrierie simpla si generala in acelasi timp. Aceasta permite pe de o parte usurinta utilizarii formalismului si eficienta algoritmilor de analiza, si pe de alta parte, aplicabilitatea la o clasa cat mai larga de sisteme si proprietati.

O primă modificare este tipizarea porturilor componentelor, intr-un sistem de tipuri care permite notiunile de subtip si mostenire. Tratarea proprietăților e modificată în așa fel încât ele pot fi associate nu doar componentelor, cat si fluxurilor sau porturilor. Cerințele cu privire la proprietăți sunt extinse pentru a permite nu numai corespondenta exacta ca simbol sau negatie, ci si proprietati exprimate mai general in formule propozitionale. în particular, în abordarea inițială apar ca un caz special cerintele pereche. Aceast caz e generalizat folosind functii neinterpretate, care transforma tipul fluxului de date prin componenta. In acest caz, notiunea de pereche apare natural folosind o functie si inversa ei, iar in cazul general se pot folosi reguli de rescriere pentru analiza compozabilitatii.

În varianta nou propusă, constrângerile structurale si cerintele structurale dependente de context acestea sunt unificate intr-un limbaj comun de ordinul I, folosind un numar restrans de predicate standard (apartenenta unei proprietati la un flux, precedenta intre fluxuri, etc.).

Implementarea practică a extensiilor propuse la formalismul CCDL face obiectul unei lucrări de dizertație abordate începând cu octombrie 2004. Aceasta își propune, pe lângă implementare și analiza implicațiilor diferitelor alegeri de proiectare, și evaluarea practică pe un set de exemple.

3.2 Detecția erorilor prin analize statice

Această activitate și-a propus studiul analizelor statice folosite pentru detectarea principalelor erori funcționale în limbajele imperative uzuale (pornind de la C și având in vedere extinderea spre C++ și Java) din punctual de vedere al compromisului dintre precizie și complexitate.

Într-o lucrare de dizertație s-a realizat un program de analiză statică permițând detecția erorilor dintr-un program C în raport cu o specificație comportamentală dată. Accentul cade pe verificarea proprietăților de interfațare corectă cu un set de funcții sistem care pot fi apelate doar într-o anumită ordine, deci un comportament descris printr-un automat cu stări finite. O primă abordare este descrisă în literatură de Das, Lerner si Seigle (2003), dar realizată exclusiv într-un prototip comercial.

S-a utilizat infrastructura CIL de analiză C disponibilă public de la UC Berkeley și s-au evaluat diverse variante de algoritmi, atât mai complexe, prin interfațarea cu un demonstrator de teoreme, cât și cu proceduri de decizie mai simple. Rezultatele obținute cu acest prototip vor fi folosite pentru realizarea unui analizor pretabil la programe de dimensiuni mari, pentru a permite aplicarea industrială.

Într-o altă lucrare de dizertație s-a implementat o infrastructură pentru analiza statică a programelor C++. Scopul a fost obținerea unui corespondent pentru infrastucturile de analiză C existente, dar care nu sunt extinse la C++ din cauza complexității limbajului. A fost tratat un subset al limbajului C++, iar infrastructura a fost proiectată așa încât să ofere o interfață uniformă pentru exprimarea unei varietăți de analize. S-a implementat un algoritm generic de punct fix pentru analiza de flux de date, așa încât pentru realizarea unei analize specifice trebuie indicată doar funcția de transfer corespunzătoare. Se oferă astfel posibilitatea realizării unei biblioteci reutilizabile de analize, precum și relativa ușurința de a implementa analize mai complexe. Această infrastructură joacă și rolul important de prim pas în unificarea modelelor și mediilor folosite pentru analiza structurală și cea comportamentală. Realizarea ei a indicat modificările ce trebuiesc făcute pentru realizarea unui metamodel uniform pentru analize structurale și comportamentale, precum și a unei tratări cât mai uniforme între C, C++ și Java. O primă descriere a metamodelului uniform a fost realizată, iar implementarea și extinderea lui fac obiectul unei teme de doctorat abordată începând cu octombrie 2004.