Tools di analisi di programmi sviluppati in ANSI C <ul><li>Studio dei tre tools di analisi CFlow , Fjalar e Metre. Verrann...
Tools di analisi di programmi sviluppati in ANSI C : CFlow <ul><li>il progetto GNU Cflow è un analizzatore di sorgenti C c...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( funzionalità )‏ <ul><li>è possibile avere il ...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( funzionalità )‏ <ul><li>informazioni aggiunti...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche  ( Output )‏ <ul><li>l'output di cflow può esse...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Output )‏ <ul><li>GNU Output: si ha l'elenco ...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Usabilità )‏ <ul><li>può essere installato co...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Installazione )‏ <ul><li>per l'installazione ...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Esempio <ul><ul><li>#include <stdlib.h> #include <stdio.h> #inc...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Direct Flow <ul><ul><li>Formato di default </li></ul></ul><ul><...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Reverse Flow <ul><ul><li>assert():   division() <int division (...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Numero di richiami e simboli <ul><ul><li>assert  division.c:9 a...
Tools di analisi di programmi sviluppati in ANSI C : CFlow Visualizzazione umana <ul><ul><li>E' anche possibile una visual...
Tools di analisi di programmi sviluppati in ANSI C : Metre <ul><li>il progetto Metre è un analizzatore di sorgenti ANSI C ...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>vengono calcolate le segu...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>Halstead's program length...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>Line Classifications : ve...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>Maximum control depth : d...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>Esistono due tipi di output...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>per ogni modulo :   -Functi...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>per ogni modulo :   -Functi...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>CSV ( comma separated value...
Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Installazione )‏ <ul><li>per l'installazione ...
Tools di analisi di programmi sviluppati in ANSI C : Metre  Considerazioni‏ <ul><li>se un sorgente non è ANSI C, per esemp...
Tools di analisi di programmi sviluppati in ANSI C : Metre Confronto tra “Mtree” di Metre e la funzione “tree” di CFLow <u...
Tools di analisi di programmi sviluppati in ANSI C : Metre Esempio <ul><li>Module Summary </li></ul><ul><li>-Function- </l...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar <ul><li>il progetto Fjalar è un framework per lo sviluppo di t...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( struttura )‏ Valgrind Fjalar Framework Kvasi...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( funzionalità )‏ <ul><li>fornisce informazion...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( funzionalità )‏ <ul><li>offre molte informaz...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( output )‏ <ul><li>offre diversi formati di o...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( Installazione )‏ <ul><li>per l'installazione...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Esempio <ul><li><executable-name>./select</executable-name> </...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Esempio <ul><li><function> </li></ul><ul><li><name><![CDATA[se...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar Esempio <ul><li><function> </li></ul><ul><li><name><![CDATA[ma...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar  Considerazioni‏ <ul><li>è necessario compilare il programma p...
Tools di analisi di programmi sviluppati in ANSI C Analisi di sorgenti Benchmark  Tools di analisi di programmi sviluppati...
Tools di analisi di programmi sviluppati in ANSI C : Fjalar  Considerazioni‏ <ul><li>è necessario compilare il programma p...
Upcoming SlideShare
Loading in …5
×

Analizzatori di programmi in C

908 views

Published on

Studio dei tre tools di analisi CFlow , Fjalar e Metre. Verranno messi a confronto per i loro requisiti di installazione, semplicità di utilizzo e funzionalità offerte.

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
908
On SlideShare
0
From Embeds
0
Number of Embeds
135
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Analizzatori di programmi in C

  1. 1. Tools di analisi di programmi sviluppati in ANSI C <ul><li>Studio dei tre tools di analisi CFlow , Fjalar e Metre. Verranno messi a confronto per i loro requisiti di installazione, semplicità di utilizzo e funzionalità offerte. </li></ul><ul><li>Autore: Maurizio Pianfetti </li></ul><ul><li>Esame per “Linguaggi e Traduttori” seguito da Armando Tacchella, Jacopo Mantovani e Luca Pulina </li></ul>
  2. 2. Tools di analisi di programmi sviluppati in ANSI C : CFlow <ul><li>il progetto GNU Cflow è un analizzatore di sorgenti C che restituisce come output il flusso computazionale del programma in base alle funzioni richiamate dalla funzione di partenza ( normalmente il main )‏ </li></ul><ul><li>attualmente la versione stabile è la 1.2 ultimata il 29/06/2007 </li></ul><ul><li>software rilasciato sotto licenze GPLv3, usufruibile gratuitamente </li></ul><ul><li>riferimenti all'applicazione: http://www.gnu.org/software/cflow/ </li></ul>
  3. 3. Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( funzionalità )‏ <ul><li>è possibile avere il flow del programma da due punti di vista diversi </li></ul><ul><ul><li>Direct graph : partendo dalla funzione principale si elencano le chiamate e sotto chiamate in modo ricorsivo alle funzioni nel programma ( caller — callee dependencies )‏ </li></ul></ul><ul><ul><li>Reverse graph: partendo da tutte le funzioni nel programma si risale a chi chiama la singola funzione in ordine inverso ( callee — caller dependencies )‏ </li></ul></ul>
  4. 4. Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( funzionalità )‏ <ul><li>informazioni aggiuntive: oltre alle firme delle funzioni e l'ordine con cui vengono chiamate è possibile avere: </li></ul><ul><ul><li>variabili o funzioni di tipo statico e globali ( i simboli )‏, non è possibile una analisi locale </li></ul></ul><ul><ul><li>tipi, parametri e valori di ritorno delle variabili e funzioni rilevate </li></ul></ul><ul><ul><li>è possibile fare una analisi di tipo PreProcessor </li></ul></ul><ul><ul><li>è possibile avere l'elenco delle dichiarazioni di ogni singolo simbolo ( cross-reference listings )‏ </li></ul></ul><ul><li>segnala le funzioni richiamate ricorsivamente </li></ul>
  5. 5. Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Output )‏ <ul><li>l'output di cflow può essere di due tipi: </li></ul><ul><ul><li>POSIX: si ha l'elenco delle firme di ogni singola funzione con dei caratteri aggiuntivi per definire l'ingresso in esse, col numero progressivo di ordine di chiamata e richiamo alla riga di dichiarazione nel caso di funzione ricorsiva. Questo standard è utilizzato da ulteriori tools di analisi che utilizzati in “pipe” dopo CFLow creano grafici costruendo flow del programma [ cflow2vcg http://cflow2vcg.sourceforge.net/ xvcg http://rw4.cs.uni-sb.de/users/sander/html/gsvcg1.html Comando: cflow --format=posix --omit-arguments --level-indent='0= ' --level-indent='1= ' --level-indent=start=' ' $* | cflow2vcg | xvcg - </li></ul></ul>
  6. 6. Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Output )‏ <ul><li>GNU Output: si ha l'elenco delle firme di ogni singola funzione con dei caratteri di tabulazione per definire ciò che avviene all'interno di esse. L'output generato è configurabile ed è possibile: </li></ul><ul><ul><ul><li>aggiungere il numero progressivo di chiamata </li></ul></ul></ul><ul><ul><ul><li>cambiare i caratteri di ingresso nelle funzioni </li></ul></ul></ul><ul><ul><ul><li>omettere la firma delle funzioni </li></ul></ul></ul><ul><li>Attualmente non esiste l'estensione per un output XML o HTML , probabilmente funzione presente nelle versioni future </li></ul>
  7. 7. Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Usabilità )‏ <ul><li>può essere installato come plugin di Emacs </li></ul><ul><li>può essere facilmente integrato come parte di progetto facendo una configurazione opportuna nel file Makefile.am </li></ul><ul><li>è possibile definire delle configurazioni di default settando delle variabili di ambiente o utilizzando un file di configurazione </li></ul><ul><li>è possibile utilizzarlo agganciando l'analisi ad un debugger ( Es. gdd ) ‏ </li></ul>
  8. 8. Tools di analisi di programmi sviluppati in ANSI C : CFlow Caratteristiche ( Installazione )‏ <ul><li>per l'installazione necessita soltanto delle librerie “header” del kernel Linux per poter essere compilato </li></ul><ul><li>l'installazione comporta l'esecuzione dei classici tre comandi: ./configure; make; make install </li></ul><ul><li>è un programma senza interfaccia grafica command-line adatto per sistemi di automazione e punto di partenza per analisi più complesse </li></ul>
  9. 9. Tools di analisi di programmi sviluppati in ANSI C : CFlow Esempio <ul><ul><li>#include <stdlib.h> #include <stdio.h> #include <assert.h> </li></ul></ul><ul><ul><li>int division(int dividend, int divisor) { </li></ul></ul><ul><ul><li>int remainder = dividend; </li></ul></ul><ul><ul><li>int quotient = 0; </li></ul></ul><ul><ul><li>assert(divisor > 0); </li></ul></ul><ul><ul><li>//assert(dividend > 0); </li></ul></ul><ul><ul><li>while (divisor <= remainder) { </li></ul></ul><ul><ul><li>remainder = remainder - divisor; </li></ul></ul><ul><ul><li>++quotient; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>return quotient; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>int main(int argc, char *argv []) { </li></ul></ul><ul><ul><li>int dividend, divisor; </li></ul></ul><ul><ul><li>if (argc != 3) { </li></ul></ul><ul><ul><li>printf(&quot;Usage: div <dividend> <divisor>&quot;); </li></ul></ul><ul><ul><li>exit(EXIT_FAILURE); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>dividend = atoi(argv[1]); </li></ul></ul><ul><ul><li>divisor = atoi(argv[2]); </li></ul></ul><ul><ul><li>//if (divisor <= 0) return 2; </li></ul></ul><ul><ul><li>printf(&quot;%d&quot;, division( dividend, divisor )); </li></ul></ul><ul><ul><li>return 0; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>Si consideri il seguente programma C che esegue una divisione tra due numeri </li></ul></ul>
  10. 10. Tools di analisi di programmi sviluppati in ANSI C : CFlow Direct Flow <ul><ul><li>Formato di default </li></ul></ul><ul><ul><li>main() <int main (int argc,char *argv[]) at division.c:18>: printf() exit() atoi() division() <int division (int dividend,int divisor) at division.c:6>: assert()‏ </li></ul></ul><ul><ul><li>Formato posix </li></ul></ul><ul><ul><li>1 main: int (int argc,char *argv[]), <division.c 18> 2 printf: <> 3 exit: <> 4 atoi: <> 5 division: int (int dividend,int divisor), <division.c 6 > 6 assert: <> </li></ul></ul><ul><ul><li>Ecco i due output possibili come flow diretto del codice d'esempio </li></ul></ul>
  11. 11. Tools di analisi di programmi sviluppati in ANSI C : CFlow Reverse Flow <ul><ul><li>assert(): division() <int division (int dividend,int divisor) atdivision.c:6>: main() <int main (int argc,char *argv[]) atdivision.c:18> </li></ul></ul><ul><ul><li>atoi(): main() <int main (int argc,char *argv[]) at division.c:18> </li></ul></ul><ul><ul><li>division() <int division (int dividend,int divisor) atdivision.c:6>: main() <int main (int argc,char *argv[]) at division.c:18> </li></ul></ul><ul><ul><li>exit(): main() <int main (int argc,char *argv[]) at division.c:18> </li></ul></ul><ul><ul><li>main() <int main (int argc,char *argv[]) at division.c:18> </li></ul></ul><ul><ul><li>printf(): main() <int main (int argc,char *argv[]) at division.c:18> </li></ul></ul><ul><ul><li>Viene evidenziata ogni singola funzione da chi viene richiamata </li></ul></ul>
  12. 12. Tools di analisi di programmi sviluppati in ANSI C : CFlow Numero di richiami e simboli <ul><ul><li>assert division.c:9 atoi division.c:24 atoi division.c:25 division *division.c:6 int (int dividend,int divisor) division division.c:27 exit division.c:22 main *division.c:18 int (int argc,char *argv[]) printf division.c:21 printf division.c:27 </li></ul></ul><ul><ul><li>1 main: int (int argc,char *argv[]), <division.c 18> </li></ul></ul><ul><ul><li>2 printf: <> </li></ul></ul><ul><ul><li>3 exit: <> </li></ul></ul><ul><ul><li>4 EXIT_FAILURE: <> </li></ul></ul><ul><ul><li>5 atoi: <> </li></ul></ul><ul><ul><li>6 division: int (int dividend,int divisor), <division.c 6> </li></ul></ul><ul><ul><li>7 assert: <> </li></ul></ul><ul><ul><li>Cflow evidenzia tutti i singoli richiami alle varie funzioni, visualizza le dichiarazioni e i simboli di compilazione </li></ul></ul>
  13. 13. Tools di analisi di programmi sviluppati in ANSI C : CFlow Visualizzazione umana <ul><ul><li>E' anche possibile una visualizzazione ad albero </li></ul></ul><ul><ul><li>1 +-main() <int main () at division.c:18> </li></ul></ul><ul><ul><li>2 +-printf()‏ </li></ul></ul><ul><ul><li>3 +-exit()‏ </li></ul></ul><ul><ul><li>4 +-atoi()‏ </li></ul></ul><ul><ul><li>5 -division()‏ </li></ul></ul>
  14. 14. Tools di analisi di programmi sviluppati in ANSI C : Metre <ul><li>il progetto Metre è un analizzatore di sorgenti ANSI C che restituisce come output una analisi statistica secondo alcune metriche che descrivono il livello di complessità / ottimalità di funzionamento del sorgente scritto e analizzato </li></ul><ul><li>attualmente la versione stabile è la 2.3 ultimata il 03/04/1995 </li></ul><ul><li>software rilasciato con Copyright “Metre Copyright (c) 1993-1995 by Paul Long All rights reserved” . La licenza specificata è l'utilizzo gratuito per applicazioni No profit, diversamente bisogna richiedere la licenza d'uso direttamente allo sviluppatore (Paul Long) http://www.lysator.liu.se/c/metre-v2-3.html </li></ul>
  15. 15. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>vengono calcolate le seguenti metriche: </li></ul><ul><li>McCabe's cyclomatic complexity : calcola la complessità del programma analizzando il numero di costruttori con punti di decisione. L'antologia su questo argomento mette a confronto complessità con numero di possibili bug </li></ul><ul><li>Myers' extended complexity : evoluzione della metrica precedente, rileva l'effettivo numero di decisioni considerando il numero di condizioni per ogni costrutt o </li></ul>
  16. 16. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>Halstead's program length : vengono calcolati il numero di “parole” e “operatori” del linguaggio usate , con questi numeri vengono a loro volta calcolati i seguenti parametri : Considerando un programma di due funzioni: </li></ul><ul><li>operatori univoci f1 n1 </li></ul><ul><li>operatori univoci f2 n2 </li></ul><ul><li>totali operatori f1 N1 </li></ul><ul><li>totali operatori f2 N2 </li></ul><ul><li>velocità di scrittura S = 18 momenti / secondo </li></ul><ul><li>fattore di secondo all'ora f = 60 * 60 </li></ul><ul><ul><li>Si calcolano i segunti parametri: </li></ul></ul><ul><li>Lunghezza Prog. N = N1 + N2 </li></ul><ul><li>Vocabolario n = n1 + n2 </li></ul><ul><li>Volume V = N * log2(n)‏ </li></ul><ul><li>Livello L^ = (2 / n1) * (n2 / N2)‏ </li></ul><ul><li>Effort E = V / L^ </li></ul><ul><li>Durata del programma in ore T^ = E / (S * f)‏ </li></ul><ul><li>Intelligenza I = L^ * V </li></ul><ul><li>Livello del linguaggio L' = L^ * L^ * V </li></ul>
  17. 17. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>Line Classifications : vengono calcolate le righe di codice, commenti e linee senza testo. Nel caso in cui si analizza il programma in modalità preprocessor per avere l'analisi dei commenti bisognerà compilarlo considerando eliminazione / mantenimento dei commenti </li></ul><ul><li>Statement-Counting Standard : si classificano le “parole” del linguaggio utilizzate secondo l'antologia e regole descritte nel libro “Applied Software Measurement” di Capers Jone, in particolare si contano: </li></ul><ul><ul><li>Executable-Statement: direttive del linguaggio utilizzato ( C )‏ </li></ul></ul><ul><ul><li>Declaration-Statement: dichiarazioni di variabili e funzioni </li></ul></ul><ul><ul><li>Preprocessor Statements: vengono contate le parole di codice per il preprocessore ( nel caso del C le linee che iniziano con “#” )‏ </li></ul></ul><ul><li>Backfired function points : parametro empirico che descrive il rapporto tra numero di “function points” e numero di righe di codice, utilizzato nei grandi progetti per valutarne la complessità </li></ul>
  18. 18. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Metriche )‏ <ul><li>Maximum control depth : definisce la profondità di annidiamento dei costrutti utilizzati </li></ul><ul><li>Identifier count and length : definisce il numero di identificatori ( nomi ) variabili e funzioni con la loro lunghezza massima </li></ul><ul><li>Number of functions and modules: definisce il numero di funzioni e moduli, intesi come file separati, librerie e sorgenti nell'intero progetto analizzato </li></ul>
  19. 19. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>Esistono due tipi di output: </li></ul><ul><li>standard : per ogni modulo e funzione vengono calcolate le singole metriche e viene visualizzata una lista con il totale, il minimo, il massimo e la media del valori trovati secondo il seguente formato: </li></ul><ul><ul><li>per ogni funzione : Cyclomatic: total </li></ul></ul><ul><ul><li>Extended: total </li></ul></ul><ul><ul><li>Halstead Length: total </li></ul></ul><ul><ul><li>Vocabulary: total </li></ul></ul><ul><ul><li>Volume: total </li></ul></ul><ul><ul><li>Level: total </li></ul></ul><ul><ul><li>Effort: total </li></ul></ul><ul><ul><li>Intelligence: total </li></ul></ul><ul><ul><li>Time (hours) total </li></ul></ul><ul><ul><li>Lang Level: total </li></ul></ul><ul><ul><li>Lines: total </li></ul></ul><ul><ul><li>Code: total </li></ul></ul><ul><ul><li>Comment: total </li></ul></ul><ul><ul><li>Blank: total </li></ul></ul><ul><ul><li>Exec Statements: total </li></ul></ul><ul><ul><li>Decl Statements: total </li></ul></ul><ul><ul><li>Max Depth: total </li></ul></ul><ul><ul><li>Identifiers: total </li></ul></ul><ul><ul><li>Length: <min >max ~avg </li></ul></ul>
  20. 20. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>per ogni modulo : -Function- </li></ul><ul><li>Cyclomatic: <min >max ~avg </li></ul><ul><li>Extended: <min >max ~avg </li></ul><ul><li>Halstead Length: <min >max ~avg </li></ul><ul><li>Vocabulary: <min >max ~avg </li></ul><ul><li>Volume: <min >max ~avg </li></ul><ul><li>Level: <min >max ~avg </li></ul><ul><li>Effort: <min >max ~avg </li></ul><ul><li>Intelligence: <min >max ~avg </li></ul><ul><li>Time (hours) <min >max ~avg total </li></ul><ul><li>Lang Level: <min >max ~avg </li></ul><ul><li>Lines: <min >max ~avg total </li></ul><ul><li>Code: <min >max ~avg total </li></ul><ul><li>Comment: <min >max ~avg total </li></ul><ul><li>Blank: <min >max ~avg total </li></ul><ul><li>Exec Statements: <min >max ~avg </li></ul><ul><li>Decl Statements: <min >max ~avg total </li></ul><ul><li>Max Depth: <min >max ~avg </li></ul><ul><li>-Module- </li></ul><ul><li>Lines: total </li></ul><ul><li>Code: total </li></ul><ul><li>Comment: total </li></ul><ul><li>Blank: total </li></ul><ul><li>Exec Statements: total </li></ul><ul><li>Decl Statements: total </li></ul><ul><li>PP Statements: total </li></ul><ul><li>Function Points: total </li></ul><ul><li>Identifiers: total </li></ul><ul><li>Length: <min >max ~avg </li></ul><ul><li>Functions: total </li></ul>
  21. 21. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>per ogni modulo : -Function- </li></ul><ul><li>Cyclomatic: <min >max ~avg </li></ul><ul><li>Extended: <min >max ~avg </li></ul><ul><li>Halstead Length: <min >max ~avg </li></ul><ul><li>Vocabulary: <min >max ~avg </li></ul><ul><li>Volume: <min >max ~avg </li></ul><ul><li>Level: <min >max ~avg </li></ul><ul><li>Effort: <min >max ~avg </li></ul><ul><li>Intelligence: <min >max ~avg </li></ul><ul><li>Time (hours) <min >max ~avg total </li></ul><ul><li>Lang Level: <min >max ~avg </li></ul><ul><li>Lines: <min >max ~avg total </li></ul><ul><li>Code: <min >max ~avg total </li></ul><ul><li>Comment: <min >max ~avg total </li></ul><ul><li>Blank: <min >max ~avg total </li></ul><ul><li>Exec Statements: <min >max ~avg </li></ul><ul><li>Decl Statements: <min >max ~avg total </li></ul><ul><li>Max Depth: <min >max ~avg </li></ul><ul><li>-Module- </li></ul><ul><li>Lines: total </li></ul><ul><li>Code: total </li></ul><ul><li>Comment: total </li></ul><ul><li>Blank: total </li></ul><ul><li>Exec Statements: total </li></ul><ul><li>Decl Statements: total </li></ul><ul><li>PP Statements: total </li></ul><ul><li>Function Points: total </li></ul><ul><li>Identifiers: total </li></ul><ul><li>Length: <min >max ~avg </li></ul><ul><li>Functions: total </li></ul>
  22. 22. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Output )‏ <ul><li>CSV ( comma separated value ): viene generata una riga di output per ogni funzione, modulo o progetto analizzato. Ogni riga è composta da diversi campi divisi per “,”. E' possibile personalizzare quali metriche stampare e disabilitare i messaggi di warning che non vengono stampati nel formato standard ma come righe separate mod , insertsort.c , 3,3,3,3,3,3,146,146,146,33,33,33,736,736,736,0.051,0.051,0.051,14510,14510,14510,37,37,37,0.2,0.2,0.2,0.2,1.89,1.89,1.89,33,33,33,33,32,32,32,32,0,0,0,0,1,1,1,1,26,26,26,1,1,1,1,2,2,2,86,37,42,7,26,2,12,0,46,1,6,2,1 </li></ul><ul><li>non è supportato XML </li></ul>
  23. 23. Tools di analisi di programmi sviluppati in ANSI C : Metre Caratteristiche ( Installazione )‏ <ul><li>per l'installazione necessita soltanto delle librerie “header” del kernel Linux per poter essere compilato </li></ul><ul><li>l'installazione comporta l'esecuzione del comando di compilazione dei sorgenti. Sono disponibili due tools, metre e mtree gcc -ansi -w -o metre metrules.c ytab.c lex_yy.c -lm gcc -ansi -w -o mtree trerules.c ytab.c lex_yy.c -lm </li></ul><ul><li>è un programma senza interfaccia grafica command-line adatto per sistemi di automazione </li></ul>
  24. 24. Tools di analisi di programmi sviluppati in ANSI C : Metre Considerazioni‏ <ul><li>se un sorgente non è ANSI C, per esempio contiene righe con commenti “//” viene generato un “Fatal Error” e non viene completata l'analisi </li></ul><ul><li>l'autore consiglia l'analisi di sorgenti di tipo PREPROCESSED </li></ul>
  25. 25. Tools di analisi di programmi sviluppati in ANSI C : Metre Confronto tra “Mtree” di Metre e la funzione “tree” di CFLow <ul><li>Cflow - tree </li></ul><ul><li>1 +-main() <int main () at division_ANSI.c:18> </li></ul><ul><li>2 +-printf()‏ </li></ul><ul><li>3 +-exit()‏ </li></ul><ul><li>4 +-atoi()‏ </li></ul><ul><li>5 -division()‏ </li></ul>Metre – Mtree ision_ANSI.c main +---printf +---exit +---atoi ision_ANSI.c `---division `---assert Table of Contents division_ANSI.c division . . . . . . . . . . . 6 main . . . . . . . . . . . . . 18 #include <stdlib.h> #include <stdio.h> #include <assert.h> int division(int dividend, int divisor) { int remainder = dividend; int quotient = 0; assert(divisor > 0); /* assert(dividend > 0); */ while (divisor <= remainder) { remainder = remainder - divisor; ++quotient; } return quotient; } int main(int argc, char *argv []) { int dividend, divisor; if (argc != 3) { printf(&quot;Usage: div <dividend> <divisor>&quot;); exit(EXIT_FAILURE); } dividend = atoi(argv[1]); divisor = atoi(argv[2]); /* if (divisor <= 0) return 2; */ printf(&quot;%d&quot;, division( dividend, divisor )); return 0; }
  26. 26. Tools di analisi di programmi sviluppati in ANSI C : Metre Esempio <ul><li>Module Summary </li></ul><ul><li>-Function- </li></ul><ul><li>Cyclomatic: <2 >2 ~2 </li></ul><ul><li>Extended: <2 >2 ~2 </li></ul><ul><li>Halstead Length: <30 >43 ~37 </li></ul><ul><li>Vocabulary: <16 >24 ~20 </li></ul><ul><li>Volume: <120 >197 ~159 </li></ul><ul><li>Level: <0.086 >0.167 ~0.127 </li></ul><ul><li>Effort: <1182 >1400 ~1291 </li></ul><ul><li>Intelligence: <10 >33 ~22 </li></ul><ul><li>Time (hours): <0.0 >0.0 ~0.0 0.0 </li></ul><ul><li>Lang Level: <0.88 >5.47 ~3.18 </li></ul><ul><li>Lines: <10 >11 ~11 21 </li></ul><ul><li>Code: <9 >10 ~10 19 </li></ul><ul><li>Comment: <1 >1 ~1 2 </li></ul><ul><li>Blank: <0 >0 ~0 0 </li></ul><ul><li>Exec Statements: <6 >8 ~7 </li></ul><ul><li>Decl Statements: <1 >2 ~2 3 </li></ul><ul><li>Max Depth: <1 >1 ~1 </li></ul><ul><li>-Module- </li></ul><ul><li>Lines: 29 </li></ul><ul><li>Code: 26 </li></ul><ul><li>Comment: 2 </li></ul><ul><li>Blank: 1 </li></ul><ul><li>Exec Statements: 14 </li></ul><ul><li>Decl Statements: 3 </li></ul><ul><li>PP Statements: 3 </li></ul><ul><li>Function Points: 0 </li></ul><ul><li>Identifiers: 34 </li></ul><ul><li>Length: <4 >12 ~7 </li></ul><ul><li>Functions: 2 </li></ul>#include <stdlib.h> #include <stdio.h> #include <assert.h> int division(int dividend, int divisor) { int remainder = dividend; int quotient = 0; assert(divisor > 0); /* assert(dividend > 0); */ while (divisor <= remainder) { remainder = remainder - divisor; ++quotient; } return quotient; } int main(int argc, char *argv []) { int dividend, divisor; if (argc != 3) { printf(&quot;Usage: div <dividend> <divisor>&quot;); exit(EXIT_FAILURE); } dividend = atoi(argv[1]); divisor = atoi(argv[2]); /* if (divisor <= 0) return 2; */ printf(&quot;%d&quot;, division( dividend, divisor )); return 0; } mod,division_ANSI.c,2,2,2,2,2,2,30,43,37,16,24,20,120,197,159,0.086,0.167,0.127,1182,1400,1291,10,33,22,0.0,0.0,0.0,0.0,0.88,5.47,3.18,10,11,11,21,9,10,10,19,1,1,1,2,0,0,0,0,6,8,7,1,2,2,3,1,1,1,29,26,2,1,14,3,3,0,34,4,12,7,2
  27. 27. Tools di analisi di programmi sviluppati in ANSI C : Fjalar <ul><li>il progetto Fjalar è un framework per lo sviluppo di tools analizzatori del comportamento a compile-time e run-time di programmi C e C++, sfruttando il noto simulatore di CPU Valgrind, verificando problemi di allocazione di memoria legati alle dichiarazioni di variabili </li></ul><ul><li>attualmente la versione stabile è la 1.3 rilasciata il 30/08/2007 </li></ul><ul><li>il software è rilasciato con licenza GNU General Public License e Copyright (C) 2004-2006 Philip Guo ( [email_address] ), MIT CSAIL Program Analysis Group http://groups.csail.mit.edu/pag/fjalar/ </li></ul>
  28. 28. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( struttura )‏ Valgrind Fjalar Framework Kvasir ( rileva strutture dati ) DynComp ( analisi dinamica di strutture astratte )
  29. 29. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( funzionalità )‏ <ul><li>fornisce informazioni relative all'accesso alle variabili, tipi, indirizzi fisici, spazio allocato e visibilità (file, static, private, public) </li></ul><ul><li>rileva associazioni tra strutture e tipi di classe, con variabili per capire eventuali annidamenti e definizioni di strutture in modo ricorsivo </li></ul><ul><li>fornisce informazioni relative all'accesso alle funzioni, indirizzi, prototype, visibilità, parametri associati con valore e tipo di ritorno </li></ul><ul><li>crea nomi univoci per le variabili e funzioni globali per eliminare ambiguità in modo da facilitare l'analisi globale per altri ipotetici tools collegati </li></ul>
  30. 30. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( funzionalità )‏ <ul><li>offre molte informazioni Run-time basate sull'esecuzione del programma per fare analisi di crash e memory lack </li></ul><ul><li>è possibile analizzare solo parte del programma definendo quali funzioni analizzare </li></ul>
  31. 31. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( output )‏ <ul><li>offre diversi formati di output, derivati dai formati garantiti da Valgrind: </li></ul><ul><ul><li>default output su standard error </li></ul></ul><ul><ul><li>stampa su file, se ci sono più processi è possibile fare un unico file o più files per ogni processo </li></ul></ul><ul><ul><li>stampa su socket per la stampa via rete, Valgrind offre un listener ed un client rispettivamente per ricevere e inviare messaggi </li></ul></ul><ul><li>offre il formato XML per strutturare le varie informazioni in modo maggiormente interpretabile da altri tools </li></ul>
  32. 32. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Caratteristiche ( Installazione )‏ <ul><li>per l'installazione necessita soltanto delle librerie “header” del kernel Linux per poter essere compilato </li></ul><ul><li>l'installazione comporta l'esecuzione di alcuni comandi per la compilazione dei sorgenti. ./autogen.sh ./configure make make install </li></ul><ul><li>è un programma senza interfaccia grafica command-line adatto per sistemi di automazione </li></ul>
  33. 33. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Esempio <ul><li><executable-name>./select</executable-name> </li></ul><ul><li><global-variable-declarations> </li></ul><ul><li><variable> </li></ul><ul><li><name><![CDATA[/arr]]></name> </li></ul><ul><li><global-var> </li></ul><ul><li><location>0x8049860</location> </li></ul><ul><li><filename>./select.c</filename> </li></ul><ul><li></global-var> </li></ul><ul><li><static-array> </li></ul><ul><li><num-dimensions>1</num-dimensions> </li></ul><ul><li><upper-bound>19</upper-bound> </li></ul><ul><li></static-array> </li></ul><ul><li><var-type pointer-levels=&quot;1&quot;> </li></ul><ul><li><declared-type>D_UNSIGNED_FLOAT</declared-type> </li></ul><ul><li><byte-size>4</byte-size> </li></ul><ul><li></var-type> </li></ul><ul><li></variable> </li></ul><ul><li></global-variable-declarations> </li></ul>float arr[20] = { 5, 4, 10.3, 1.1, 5.7, 100, 231, 111, 49.5, 99, 10, 150, 222.22, 101, 77, 44, 35, 20.54, 99.99, 888.88 };
  34. 34. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Esempio <ul><li><function> </li></ul><ul><li><name><![CDATA[select]]></name> </li></ul><ul><li><fjalar-name><![CDATA[..select()]]></fjalar-name> </li></ul><ul><li><start-PC>0x8048364</start-PC> </li></ul><ul><li><end-PC>0x8048640</end-PC> </li></ul><ul><li><filename>./select.c</filename> </li></ul><ul><li><formal-parameters> </li></ul><ul><li><variable> </li></ul><ul><li><name><![CDATA[k]]></name> </li></ul><ul><li><var-type> </li></ul><ul><li><declared-type>D_UNSIGNED_INT</declared-type> </li></ul><ul><li><byte-size>4</byte-size> </li></ul><ul><li></var-type> </li></ul><ul><li></variable> </li></ul><ul><li><variable> </li></ul><ul><li><name><![CDATA[n]]></name> </li></ul><ul><li><stack-byte-offset>4</stack-byte-offset> </li></ul><ul><li><var-type> </li></ul><ul><li><declared-type>D_UNSIGNED_INT</declared-type> </li></ul><ul><li><byte-size>4</byte-size> </li></ul><ul><li></var-type> </li></ul><ul><li></variable> </li></ul><ul><li></formal-parameters> </li></ul><ul><li><return-value> </li></ul><ul><li><variable> </li></ul><ul><li><name><![CDATA[return]]></name> </li></ul><ul><li><var-type> </li></ul><ul><li><declared-type>D_UNSIGNED_FLOAT</declared-type> </li></ul><ul><li><byte-size>4</byte-size> </li></ul><ul><li></var-type> </li></ul><ul><li></variable> </li></ul><ul><li></return-value> </li></ul><ul><li></function> </li></ul>float select(unsigned long k, unsigned long n)‏ { unsigned long i,ir,j,l,mid; float a,temp; int flag, flag2; ... ... ... } return arr[k] ; }
  35. 35. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Esempio <ul><li><function> </li></ul><ul><li><name><![CDATA[main]]></name> </li></ul><ul><li><fjalar-name><![CDATA[..main()]]></fjalar-name> </li></ul><ul><li><start-PC>0x8048640</start-PC> </li></ul><ul><li><end-PC>0x8048670</end-PC> </li></ul><ul><li><filename>./select.c</filename> </li></ul><ul><li><formal-parameters> </li></ul><ul><li></formal-parameters> </li></ul><ul><li><return-value> </li></ul><ul><li><variable> </li></ul><ul><li><name><![CDATA[return]]></name> </li></ul><ul><li><var-type> </li></ul><ul><li><declared-type>D_INT</declared-type> </li></ul><ul><li><byte-size>4</byte-size> </li></ul><ul><li></var-type> </li></ul><ul><li></variable> </li></ul><ul><li></return-value> </li></ul><ul><li></function>> </li></ul>main()‏ { select(10, 20); }
  36. 36. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Considerazioni‏ <ul><li>è necessario compilare il programma per poterlo analizzare e se la compilazione non termina con successo non si ha l'analisi del programma </li></ul><ul><li>non vengono considerate le variabili all'interno delle funzioni ma solo quelle globali, parametri e funzioni, poichè non è ingrado di avere informazioni nella fase di registry dal compilatore </li></ul><ul><li>se il programma non contiene un main e non si può compilare, non è possibile analizzarlo </li></ul>
  37. 37. Tools di analisi di programmi sviluppati in ANSI C Analisi di sorgenti Benchmark Tools di analisi di programmi sviluppati in ANSI C : Fjalar Considerazioni‏ <ul><li>è necessario compilare il programma per poterlo analizzare e se la compilazione non termina con successo non si ha l'analisi del programma </li></ul><ul><li>non vengono considerate le variabili all'interno delle funzioni ma solo quelle globali, parametri e funzioni, poichè non è ingrado di avere informazioni nella fase di registry dal compilatore </li></ul><ul><li>se il programma non contiene un main e non si può compilare, non è possibile analizzarlo </li></ul>
  38. 38. Tools di analisi di programmi sviluppati in ANSI C : Fjalar Considerazioni‏ <ul><li>è necessario compilare il programma per poterlo analizzare e se la compilazione non termina con successo non si ha l'analisi del programma </li></ul><ul><li>non vengono considerate le variabili all'interno delle funzioni ma solo quelle globali, parametri e funzioni, poichè non è ingrado di avere informazioni nella fase di registry dal compilatore </li></ul><ul><li>se il programma non contiene un main e non si può compilare, non è possibile analizzarlo </li></ul>

×