Raport de
Grant:
Modelarea, analiza si verificarea sistemelor software (tema 4, cod CNCSIS 23)
Autor:
conf. dr.ing. Marius Minea
Universitatea
Politehnica din
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,
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),
12. Ioana Șora. Defining
Composable Components in Multi-Flow Architectures Through Structural
Constraints, Proceedings of 6th International Conf. on Technical Informatics
(CONTI 2004),
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
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
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
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
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),
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.