Statikus kódanalízis c# nyelvhez

Hasonló dokumentumok
Teljesítmény Mérés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Teljesítmény Mérés / 20

Szoftver metrika Eclipse-plugin KÉSZÍTETTE: BARTA JÁNOS (SS4TCD)

Szoftver-mérés. Szoftver metrikák. Szoftver mérés

A minőségbiztosítás informatikája Gégény Dávid - KHIWFS

Objektum Vezérelt Szoftverek Analízise

Adatbázis-kezelés ODBC driverrel

Innovatív együttműködés a NOKIA és az ELTE között

Webes alkalmazások fejlesztése

Nyílt forráskódú szoftverek minőségi vizsgálata szoftver metrikák alapján

Adatbázisok I. Az SQL nyelv

Szoftvermérés:hogyan lehet a szoftvertermék vagy a szoftverfolyamat valamely jellemzőjéből numerikus értéket előállítani.

Miért ASP.NET? Egyszerű webes alkalmazás fejlesztése. Történet ASP ASP.NET. Működés. Készítette: Simon Nándor

SZOFTVER- MINŐSÉGBIZTOSÍTÁS

Entity Framework alapú adatbáziselérés

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

2. Szoftver minőségbiztosítás

A könyv tartalomjegyzéke

Bonyolultsági. mértékek erlang programokhoz. Király Roland

C#, OOP. Osztályok tervezése C#-ban

Közösség, projektek, IDE

Entity Framework alapú adatbáziselérés

Adatbázisok I A relációs algebra

Visual Builder-ek. Általános áttekintése, Top 5 plugin Éééés Gutenberg

ADATBÁZISOK gyakorlat: SQL 2. rész SELECT

Google App Engine az Oktatásban 1.0. ügyvezető MattaKis Consulting

Adatbázis, adatbázis-kezelő

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelés ActiveX vezérlıkkel - 1

Adatbázis rendszerek 7. előadás State of the art

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

Programozási technológia

Java programozási nyelv 5. rész Osztályok III.

GeoServer, OpenLayers és WFS. Dolleschall János

Mozgásvizsgálati mérések internetes megjelenítése. Zemkó Szonja - Dr. Siki Zoltán

Adatbázisok* tulajdonságai

Swing GUI készítése NetBeans IDE segítségével

Iroda DEMO telepítési útmutató

Iman 3.0 szoftverdokumentáció

Podoski Péter és Zabb László

Szoftvertechnolo gia gyakorlat

Delphi programozás I.

A Microsoft Visual Studio 2005 fejlesztőkörnyezet

Inczédy György Középiskola, Szakiskola és Kollégium Nyíregyháza, Árok u. 53. TANMENET. Informatika szakmacsoport

SZTE Nyílt Forrású Szoftverfejlesztő és Minősítő Kompetencia Központ

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Pentaho 4: Mindennapi BI egyszerűen. Fekszi Csaba Ügyvezető október 6.

Új komponens a Talend Palettán: Starschema SAP Connector. Csillag Péter, Földi Tamás Starschema Kft.

C programozás. 1 óra Bevezetés

Programrendszerek tanúsítása szoftverminőség mérése

Eseményvezérelt alkalmazások

Megyei tervezést támogató alkalmazás

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

SAS szoftverek felhasználási lehetőségei a felsőoktatásban

C programozási nyelv

Ezek után már csak a Mentés és a Lekérdezés Futtatása (az ellenőrzés miatt) van hátra. Ügyeljünk, hogy a mentésnél a megadott (Kezd) nevet adjuk meg.

MySQL kontra MongoDB programozás. SQL és NoSQL megközelítés egy konkrét példán keresztül

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

munkafüzet open eseményéhez

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Kedvenc Ingyenes editorok avagy milyen a programozó jobbkeze? PSPAD editor DEVPHP IDE

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

GráfRajz fejlesztői dokumentáció

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

UML (Unified Modelling Language)

Az Oracle Fusion szakértői szemmel

.NET Microsoft.Net Framework

A NetBeans IDE Ubuntu Linux operációs rendszeren

JAVASLAT A TOP-K ELEMCSERÉK KERESÉSÉRE NAGY ONLINE KÖZÖSSÉGEKBEN

ALAPOK. 0 és 255 közé eső számértékek tárolására. Számértékek, például távolságok, pontszámok, darabszámok.

Antennatervező szoftverek. Ludvig Ottó - HA5OT

Webshop készítése ASP.NET 3.5 ben I.

Adatbázis kezelés Delphiben. SQL lekérdezések

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

1. fejezet Bevezetés a web programozásába (Balássy György munkája) Az internet működése... 11

Adattípusok. Max. 2GByte

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

13. Egy x és egy y hosszúságú sorozat konvolúciójának hossza a. x-y-1 b. x-y c. x+y d. x+y+1 e. egyik sem

Adattípusok. Max. 2GByte

Web-fejlesztés NGM_IN002_1

Széchenyi István Egyetem

Honlap szerkesztés Google Tudós alkalmazásával

Oktatási segédlet 2014

Intervenciós röntgen berendezés teljesítményszabályozójának automatizált tesztelése

Gráfok mindenhol. x $ SZENDI-VARGA JÁNOS IOT SOCIAL NETWORKS FRAUD DETECTION MASTER DATA MANAGEMENT RECOMMENDATION ENGINES. Internet of Things

Programzás I gyakorlat

Trendek a nyílt forráskódú térinformatikai fejlesztésekben

LOGISZTIKAI ADATBÁZIS RENDSZEREK JOIN, AGGREGÁCIÓ

Vizuális adatelemzés - Gyakorlat. Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék

C++ programozási nyelv

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Többfelhasználós és internetes térkép kezelés, megjelenítés

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Szoftver termék metrikák alkalmazása a szoftverkarbantartás területén

Vizuális, eseményvezérelt programozás XI.

Adatintegritás ellenőrzés Felhasználói dokumentáció verzió 2.0 Budapest, 2008.

Név: Neptun kód: Pontszám:

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

22. GRÁFOK ÁBRÁZOLÁSA

Átírás:

Statikus kódanalízis c# nyelvhez Sok kódanalizátort lehet találni c# nyelvhez, bár ezek minősége igen vegyes. Három fő kategóriára oszthatóak. A legmegbízhatóbbak a Microsoft saját termékei, az FxCop, vagy a már Visual Studioban is elérhető Code Metrics funkció. Kevésbé megbízhatóak a fizetős szoftverek, melyeknek csak a demóját tudtam kipróbálni. Ilyen például az NDepend. A sor végén pedig az ingyenes programok állnak, melyekkel vagy nagyon kevés funkció érhető el vagy gyakran lefagynak. Mivel a C# a.net keretrendszer fő nyelve, ezért a keret rendszer köztes nyelvét (IL) is lehet elemezni, mely egyszerűbb mint általában a gépi kódok és rendelkezésre állnak a kódelemek nevei. A köztes nyelv elemzőknek a DLL-ekre van szükségük, így F#, vagy Visual Basic nyelven íródott programokat is tudnak elemezni. Az általam vizsgált IL elemző az NDepend, FxCop és a Nitriq. A közvetlenül a forráskódot elemző programok általában más nyelveket is megértenek, tehát nem kötődnek a.net keretrendszerhez. Ilyen például az Understand és a SourceMonitor. Az elemzők két további osztályra bonthatóak. Az egyik csoport kódmetrikákat számol, a másik szabályok ellenőriz. Vannak olyanok is, melyek a szabályokba kódmetrikákat is belevesznek. A SourceMonitor például csak metrikákat számol, és a Visual Studio Premium Editionjében lévő kód analizátor is csak ennyit tud. A szabály ellenörzők egyrészt stílusbeli hibákat is ellenőrizhetnek, például, hogy a bináris operátorok mellet van-e szóköz, ilyen például a StyleCop. A többség viszont tervezési, vagy fenntarthatósági hibákat keres, például, azon függvények megkeresése, melyek lehetnének statikusak, de nem azok. Egyes programok azt is támogatják, hogy saját szabályokat definiáljunk, ehhez általában egy SQL-hez hasonló nyelv áll rendelkezésre (NDepend, Nitriq). Fontosabb kód metrikák Cyclomatic Complexity Egymástól különböző végrehajtási utak száma. Pontosabban, a program folyamatábráján lévő lineárisan független utak száma. Élek száma - Pontok száma + 2 * Összefüggő komponensek száma. Coupling / Dependency Csatoltság. Egyes elemek mennyire függenek más elemek működésétől. Többféleképpen is lehet mérni, például az egyik modul a másik modul hány függvényét hívja meg. Class Coupling / Coupling Between Objects (CBO) Hány másik osztályt használ egy adott osztály. Minél nagyobb ez a szám annál rosszabb. [S2010] szerint a 9 az optimális felső korlát.

Efferent Coupling (Ce) / Afferent Coupling (Ca) A Coupling kétfelé bontható. Az Afferent Coupling azt méri, hogy az adott kódelemet hány másik kódelem használja. Az Efferent Coupling pedig azt méri, hogy a kérdéses kódelem, hány másik kódelemet használ. A kódelem lehet assembly, namespace, metódus, mező, stb.. Cohesion Megmutatja, hogy egy modul mennyire összefüggő. Halstead Complexity Mértékek Először ezeket ki kell számolni a kód alapján: = hány különböző fajta operátor van = hány operandusként használt entitás van = operátorok száma = operandusok száma Ebből számos mérőszám számolható: Program vocabulary: Program length: Calculated program length: Volume: Difficulty : Effort: Number of delivered bugs: Time required to program: seconds A difficulty azt próbálja mérni, hogy mennyire nehéz megérteni a kódot. Az effort azt méri, hogy mekkora munka lekódolni. Maintainability Index (MI) Azt méri mennyire karbantartható a kód. Valójában a méretére utaló különböző mennyiségek súlyozott átlaga. Maximális értéket csak az üres kód érheti el, mivel annál karbantarthatóbb nincs. Ha valaki ugyanazt a funkcionalitást tömörebben lekódolja, az magasabb értéket kap. Először ezeket kell kiszámolni a kód alapján: V = Halstead Volume G = Cyclomatic Complexity LOC = Lines Of Code (SLOC) Ezekből ki lehet számolni az indexet:

Az eredeti formula: A Visual Studio által használt formula át van skálázva 0-tól 100-ig: Depth of Inheritance (DIT) A Depth of inheritance három alapvető feltevésen alapszik: 1. Minél mélyebben van egy osztály a hierarchiában, annál több metódust örökölhet, ami megnehezíti a viselkedésének előrejelzését. 2. Mélyebb osztályhierarchia fák nagyobb tervezési komplexitást vonnak maguk után, mivel több osztályt és metódust tartalmaznak. 3. Mélyebb osztályok nagyobb eséllyel hasznosítják újra az örökölt metódusokat. Az első két feltevés alapján a nagy mélység rossz, viszont a harmadik szerint hasznos a potenciális kód újrahasznosítás miatt. Tehát ebben nincs ideális érték. Method Rank A google pagerank algoritmusát futtatja a metódusok gráfján, és ez alapján méri le, hogy melyik milyen fontos. Ha ez magas értéket ad, akkor arra a metódusra jobban oda kell figyelni. Kipróbált analizátorok MS Visual Studio A 2008 Premium Editiontől felfelé be van építve a Code Metrics számítás. Csak a legfőbb mennyiségeket méri: Maintainability Index Cyclomatic Complexity Depth of Inheritance Class Coupling Lines of Code Nagyon kényelmes, mivel teljesen integrálva van a fejlesztőkörnyezetbe és a Microsofttól elvárhatóan még sose volt vele problémám.

Ha a Code Analysis-t futtatjuk, akkor szabályellenörzést végez a Visual Studio. Rendelkezésre állnak előre definiált szabály halmazok, és mi is kiválaszthatjuk hogy nekünk pontosan mik kellenek. Az eredményeket a fordítási hibák ablakában írja ki a Warningok közé, kattintásra odavisz a problémás részre.

NDepend Ennek az analizátornak van egy fizetős változata, vagy pedig Open Source, Academic Licence vagy 2 hét demo az ami ingyen jár, de mindegyik gyakorlatilag ugyanazokat a korlátozásokat tartalmazza. Hasonlít a Visual Studio-val járó kód analizátorhoz, ez is beépül a fejlesztő környezetbe, viszont természetesen nem annyira az eredeti. Például nagyon belassítja az ablak átméretezését és az ablakainak az elhelyezésivel is vannak problémák, gyakorlatilag az egész GUI elég rosszul van megírva. Cserébe viszont sokkal gazdagabb a funkcionalitása. Az NDepend a lefordított DLL-eket analizálja, így az elemzést nem a forráskódon, hanem a köztes nyelven (IL) végzi. Be lehet állítani, hogy mely assambly-ket szeretnénk bevenni az analízisbe, majd le lehet futtatni. Az egyik leglátványosabb eszköze a Dependecy Graph, mely az egyes assambly-k közötti függőségeket ábrázolja. Ki lehet választani, hogy az egyes élek vastagságai a típus hivatkozások, vagy metódushivatkozások, stb.. alapján változzanak. Az assambly-ket jelölő téglalapok mérete is függővé tehető a kódsorok mennyisége vagy a ciklikus komplexitás vagy egyéb mennyiségektől.

Egy másik szemléletes diagram típus a Metrics, amely egy Tree Map, egyszerre ábrázolja az osztályokat és azok tagjait. A tagok kiválasztott kódmetrikájától függ az őket jelölő téglalap mérete. Ez a megjelenítés típus a gyors navigálást segíti, mivel egyszerre minden ábrázolva van. Egy adott téglalap fölé állva az egérrel megjeleníti a mért mennyiségeket. Dupla kattintásra a forráskódhoz navigálna, de ez csak a fizetős verzióban érhető el.

A mért mennyiségek: IL Instructions Lines of Code Lines of Comment Percentage Comment Cyclomatic Complexity IL Cyclomatic Complexity IL Nesting Depth Overloads Parameters Variables Method Level Efferent Coupling Afferent Coupling Method Rank Fontos eszköze az analizátornak a Code Query Language (CQL), mely egy SQL-hez hasonlító lekérdező nyelv, melyben a kóddal kapcsolatos lekérdezéseket lehet írni. Például ki lehet listáztatni a kritikus metódusokat, melyek ciklomatikus komplexitása nagyobb mint 40 és a beágyazottsági mélysége nagyobb mint 4: WARN IF Count > 0 IN SELECT METHODS WHERE ILCyclomaticComplexity > 40 AND ILNestingDepth > 4 ORDER BY ILCyclomaticComplexity DESC A fenti diagramon ennek eredményeit kékkel jelölte a rendszer. Az eredményül kapott metódusok tényleg nagyon bonyolult más programnyelvből automatikusan átfordított kódrészek. Sajnos van egy komoly hibája. Sok assambly-t kizár a vizsgálatból, mert több helyen is megtalálja a DLL-jét és különböznek, ez akkor fordulhat elő, ha a különböző módokban (Debug, Release, x86, x64..) nincs mind újrafordítva az adott projekt. Ez gyakorlatilag lehetetlenné tette az érdemi kód metrika mérést, mert csak néhány projektre működött. Sajnos nem lehet neki

megadni egyesével a DLL-eket, mert a Solution Projectjeit veszi alapul. Nitriq A Nitriq egy VS-tól független letisztultnak tűnő kódanalizátor. Ez is IL alapon dolgozik, viszont előnye, hogy teljesen független a forráskódtól, elég csak az elemzendő DLL-eket kiválasztani, így az NDependnél meglévő problémám itt nem lépett fel. Azábrán látható lekérdezés pl hasznosnak bizonyult, talált jópár olyan metódust, melyek lehetnének statikusak de nem azok. Itt is lehet saját szabályokat definiálni. Nagy előny, hogy nem egy külön nyelvet kell megtanulni mint az NDependnél, hanem C# nyelven írhatunk lekérdezéseket. Ha a LINQ alnyelvet használjuk, akkor SQL-hez hasonló lekérdezéseket lehet készíteni. Ebben a lekérdezésben pl C#-os módon használnak Regex kifejezéseket: //if a method name contains a conjunction like "And", "Or", or "Then", //then it may be doing too many things and is violating the //Single Responsibility Principle (SRP) var results = from m in Methods where!m.ispropertygetter &&!m.ispropertysetter && m.isincoreassembly && m.name.like(".*and[a-z].*.*then[a-z].*.*or[a-z].*", false) //false => case sensitive select new { m.methodid, m.name, m.fullname };

Warn(results, 0); Az eredményeket itt is meg lehet jeleníteni egy Treemapen. Sajnos viszont nem lehet odanavigálni a forráskódhoz, mivel az nem áll rendelkezésre. Ennek a programnak is vannak hibái. Az egyik assembly-mnél elszáll, így ezt sem tudom használni. SourceMonitor Ez egy nagyon fapados program. Több nyelvet is támogat: C++, C#, Java, Delphi, C, HTML, Visual Basic. Elég nehézkes a kezelőfelülete főleg az új projekt létrehozásánál, viszont könnyen ki lehet választani, hogy pontosan mely fileokat vegyen figyelembe. Csak kód metrikákat mér, de azok között vannak egész érdekesek, pl a Stmts/Method. A teljes lista: Lines Statements % Comments % Docs, Classes Methods/Class Calls/Method Stmts/Method Max complexity Max Depth Avg Depht Avg Complexity Understand Ez is egy több nyelvet támogató program (Ada, C/C++, C#, FORTRAN, Java, JOVIAL, Pascal, PL/M, VHDL, Cobol, PHP, HTML, CSS, JavaScipt, Python), így a programkódot, és nem az ILkódot elemzi. Ez fizetős program, viszont 14 napos teljes funkcionalitású kipróbálási verziója elérhető. Nem sikerült túl sokat kihoznom ebből az analizátorból. Az egyes assambly-khez ki tud írni alap dolgokat: AvgCyclomatic CountDeclClasa CountDeclFile CountLine CountLineCode RatioCommentToCode Az egyik fő probléma, hogy könyvtár struktúra alapján akarja kezelni a hierarchiákat, így csak Projektek közti függőségeket tudtam vele kirajzoltatni pl:

Itt is állítható, hogy az egyes nyilak mit jelentsenek. Osztályokról nem sok mindent tudtam meg. Ki tud rajzolni egy osztálydiagramot, de az viszont elég nehezen értelmezhető, mert 1335 x 37425 pixeles lett. Ez a program is tudja ábrázolni Treemapen a metrikákat:

Habár ez az eszköz tűnt a Microsoftosokon kívül a legmegbízhatóbbnak, nem igazán sikerült olyan funkciót találnom amit használnék belőle. Microsoft FxCop, StyleCop Ezek mind a Microsoft ingyenes termékei. Az FxCop részben beépült a Visual Studio újabb verzióiba Code Analytics menüpontként, de külön is elérhető. IL alapon történik az ellenörzés, és egy előre definiált szabályok halmazából lehet válogatni. Elég jól átlátható program, a különböző súlyosságú hibákat jól megkülönbözteti. Sajnos a forráskódhoz itt sem lehet navigálni. A StyleCop nyílt forráskódú és a VisualStudióba pluginként lehet telepíteni. A forráskódot elemzni, pl olyan hibákat keres, hogy az összeadás jel két oldalán nincs szóköz.

Felhasznált irodalom Maintainability Index: http://www.projectcodemeter.com/cost_estimation/help/gl_maintainability.htm Halsted Complexity Measures: http://en.wikipedia.org/wiki/halstead_complexity_measures Kohézió: http://en.wikipedia.org/wiki/cohesion_(computer_science) Coupling: http://en.wikipedia.org/wiki/coupling_(computer_programming) Affernt / Efferent Coupling: http://codebetter.com/patricksmacchia/2008/02/15/code-metrics-on-coupling-dead-code-designflaws-and-re-engineering/ Class Coupling: http://blogs.msdn.com/b/zainnab/archive/2011/05/25/code-metrics-class-coupling.aspx Cyclomatic Complexity

http://en.wikipedia.org/wiki/cyclomatic_complexity Depth of Inheritance: http://blogs.msdn.com/b/zainnab/archive/2011/05/19/code-metrics-depth-of-inheritance-dit.aspx [S2010] Chidamber, S. R. & Kemerer, C. F. (1994). A Metrics Suite for Object Oriented Design (IEEE Transactions on Software Engineering, Vol. 20, No. 6). Retrieved May 14, 2011, from the University of Pittsburgh web site: http://www.pitt.edu/~ckemerer/ck%20research%20papers/ MetricForOOD_ChidamberKemerer94.pdf FxCop: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6544 http://en.wikipedia.org/wiki/fxcop StyleCop: http://en.wikipedia.org/wiki/stylecop