Codeanalyse mit FX Cop für MS Visual Studio - Seminararbeit 2011

Die Seite wird erstellt Noelle Albert
 
WEITER LESEN
Codeanalyse mit FX Cop für MS Visual Studio - Seminararbeit 2011
FACHHOCHSCHULE KÖLN – COLOGNE UNIVERSITY OF APPLIED SCIENCES

    Codeanalyse mit FX Cop
     für MS Visual Studio
                            Seminararbeit 2011
                                 Michael Laudenberg, 11040923
                                          26.05.2011

Die Codeanalyse wird im allgemeinen eingesetzt um Programmierfehler auszuschließen. Durch
Codierungsregeln, kann die Produktivität einzelner Softwareentwickler gesteigert werden. …
Codeanalyse mit FX Cop für MS Visual Studio - Seminararbeit 2011
Fachhochschule Köln – Cologne University of Applied Sciences 2
                                                                         Codeanalyse mit FX Cop für MS Visual Studio

1.     Vorwort: .....................................................................................................................................3
2.     Grundlagen Codeanalyse.............................................................................................................3
     2.1.     Das V-Modell .......................................................................................................................4
     2.2.     Statische Codeanalyse .........................................................................................................5
       2.2.1.        Manuelle formale Inspektion .......................................................................................6
       2.2.2.        Manuelle Reviewtechnik ..............................................................................................6
       2.2.3.        Stilanalyse....................................................................................................................7
       2.2.4.        Slicing ..........................................................................................................................8
       2.2.5.        Datenflussanomalien ...................................................................................................9
3.     FX Cop....................................................................................................................................... 10
     3.1.     Systemvoraussetzungen .................................................................................................... 11
     3.2.     Introspection Code Model ................................................................................................. 11
4.     CIL – Common Intermediate Language ...................................................................................... 12
5.     Installation von FX Cop .............................................................................................................. 13
6.     Erstellen eigener Regeln (Custom Rules) ................................................................................... 13
     6.1.     Metadata XML ................................................................................................................... 14
     6.2.     BaseCustomRule................................................................................................................ 16
     6.3.     Die erste Custom Rule ....................................................................................................... 17
     6.4.     Verwenden der Custom Rule ............................................................................................. 19
     6.5.     Testen der Custom Rule ..................................................................................................... 22
7.     Alternativen / Ergänzungen ....................................................................................................... 23
8.     Fazit .......................................................................................................................................... 24
9.     Quellen ..................................................................................................................................... 25
Codeanalyse mit FX Cop für MS Visual Studio - Seminararbeit 2011
Fachhochschule Köln – Cologne University of Applied Sciences 3
                                                     Codeanalyse mit FX Cop für MS Visual Studio

1. Vorwort:
Ich bin seit ca. zwei Jahren in der Softwareentwicklung der Firma „Oevermann Networks“ tätig. Da
die Firma stetig am expandieren ist, werden auch regelmäßig neue Programmierer eingestellt. Diese
kommen meist frisch aus dem Studium und haben kaum Berufserfahrung. Als ich in der Firma
angefangen habe zu programmieren, ist es mir so ergangen, dass ich nur Antworten auf gezielte
Fragen von den Experten bekommen habe. Es kam sehr selten vor, dass sich jemand die Zeit nehmen
konnte, gemeinsam mit mir meinen geschrieben Code zu analysieren. Fehler treten daher oft erst
kurz vor der Projektabnahme in Erscheinung. Ein frühzeitiges Hinweisen auf potentielle
Fehlerquellen im Code, würde einem Anfänger sehr großen Nutzen bringen.

Da die Firma ein eigenes Framework besitzt, ist es verboten gewisse Methoden aus dem .Net
Framework zu verwenden. Ebenso gibt es im .Net gewisse Stolpersteine, wie z.B. das man keine
„public const“-Variablen verwenden soll. Statt dessen „pubic readonly“. Eine „public const“-Variable
wird in einer geerbten Klasse durch einen festen Wert ersetzt. Wenn jetzt der Wert für die „public
const“-Variable in der Vaterklasse geändert wird, würde die Änderung erst nach einem Rebuild in
der geerbten Klasse ankommen. Dies kann in der Praxis zu einer sehr komplizierten Fehlersuche
führen. Damit nicht jeder Neuling der Firma solche Erfahrungen machen muss, wurden bei
Oevermann Networks Programmierungsregeln in Form einer statischen Codeanalyse eingeführt.
Verstöße gegen Programmierungsregeln, werden bereits beim kompilieren im Microsoft Visual
Studio inklusive Lösungsvorschlag angezeigt. Somit ist die Codeanalyse ein wichtiger Beitrag zur
Qualitätssicherung geworden.

Meine Zielsetzung dieser Seminarbeit umfasst eine Demonstration der Einsetzbarkeit und
Vielseitigkeit der Statischen Codeanalyse. Nachdem einige Grundlagen der Codeanalyse beschrieben
werden, wird die Erstellung eigener „Custom Rules“ anhand von Beispielen dargestellt.

2. Grundlagen Codeanalyse
Mit der stetig steigenden Komplexität und dem Umfang von Softwareprojekten, steigt auch die
Fehleranfälligkeit. Eine Methode um dieser entgegenzuwirken, ist der Einsatz von
Codeanalyseverfahren. Man unterscheidet hierbei zwischen statischer und dynamischer Codeanalyse
[Ligg02]. Der wesentliche Unterschied liegt darin, dass bei der statischen Analyse die Software nicht
ausgeführt wird. Es wird der geschriebene Quelltext oder Maschinencode auf Merkmale untersucht.
Bei der dynamischen Analyse hingegen, wird die Software gestartet und mit Testdaten gefüttert. Eine
Code Analyse soll Fehler erkennen und möglichst auch lokalisieren, um den Zeitaufwand beim
aufwändigen Debuggen zu minimieren.

Jedes große Softwareprojekt sollte nach einem im Voraus festgelegten Vorgehensmodell geplant
werden. Dabei sollte auch bereits das Testen integriert werden. Bekannt ist in diesem
Zusammenhang das V-Modell von Boehm [Spil07]. Es stellt die Testaktivitäten als gleichwertig zur
Entwicklung und Programmierung dar. Das Verständnis vom Softwaretest wurde damit nachhaltig
beeinflusst. Auch wenn im Projekt nach einem anderen Vorgehensmodell gearbeitet wird, lassen sich
die im Folgenden dargestellten Prinzipien übertragen.
Fachhochschule Köln – Cologne University of Applied Sciences 4
                                                             Codeanalyse mit FX Cop für MS Visual Studio

    2.1.Das V-Modell
Die Grundidee des allgemeinen V-Modells ist, dass Entwicklungsarbeiten und Testarbeiten
zueinander korrespondierende, gleichberechtigte Tätigkeiten sind. Bildlich dargestellt wird dies durch
die zwei Äste eines „V“s [Spil07].
Der linke Ast steht für die immer detaillierter werdenden Entwicklungsschritte, in deren Verlauf das
vom Kunden gewünschte System schrittweise entworfen und schließlich programmiert wird. Der
rechte Ast steht für Integrations- und Testarbeiten, in deren Verlauf elementare Programmbausteine
sukzessive zu größeren Teilsystemen zusammengesetzt (integriert) und jeweils auf richtige
Funktionen geprüft werden. Integration und Test enden mit der Abnahmeprüfung des auf diesem
Weg entstandenen Gesamtsystems.

             Anforderungsdefinition                                                        Abnahmetest

                        Funktionaler                                                  Systemtest
                       Systementwurf

                        Technischer Systementwurf                             Integrationstest

                                      Komponenten-                      Komponententest
                                       spezifikation

                                                       Programmierung

                                                                                                 Statische
                                                                                                 Codeanalyse
       Verifikation

       Validierung

       Konstruktion & Integration

Anforderungsdefinition: Die Wünsche und Anforderungen des Auftraggebers oder späteren
Systemanwenders werden gesammelt, spezifiziert und verabschiedet. Zweck und gewünschte
Leistungsmerkmale des zu erstellenden Softwaresystems liegen damit fest.

Funktionaler Systementwurf: Die Anforderungen werden auf Funktionen und Dialogabläufe des
neuen Systems abgebildet.

Technischer Entwurf: Die technische Realisierung des Systems wird entworfen (Schnittstellen,
Systemarchitektur).

Komponentenspezifikation: Für jedes Teilsystem werden Aufgabe, Verhalten, innerer Aufbau und
Schnittstelle zu anderen Teilsystemen definiert.
Fachhochschule Köln – Cologne University of Applied Sciences 5
                                                      Codeanalyse mit FX Cop für MS Visual Studio

Programmierung: Implementierung jedes spezifizierten Bausteins (Modul, Unit, Klasse o.Ä.) in einer
Programmiersprache. Während der Programmierung wird die statische Codeanalyse ausgeführt.
Fehler werden beim kompilieren angezeigt.

Der Komponententest prüft, ob jeder einzelne Softwarebaustein für sich seiner Spezifikation erfüllt.

Der Integrationstest prüft, ob Gruppen von Komponenten wie im technischen Systementwurf
zusammenspielen.

Der Systemtest prüft, ob das System als Ganzes die spezifizierten Anforderungen erfüllt.

Der Abnahmetest prüft, ob das System aus Kundensicht die vertraglich vereinbarten
Leistungsmerkmale aufweist.

In jeder Teststufe ist also zu überprüfen, ob die Entwicklungsergebnisse diejenigen Anforderungen
erfüllen, die auf der jeweiligen Abstraktionsstufe relevant bzw. spezifiziert sind. Dieses Prüfen der
Entwicklungsergebnisse gegen die ursprünglichen Anforderungen wird Validieren genannt.

    2.2. Statische Codeanalyse
Grundsätzlich kann man folgende Merkmale der statischen Codeanalyse zuweisen [Ligg02]:

    -   Es erfolgt keine Ausführung der zu prüfenden Software.
    -   Alle statischen Analysen können prinzipiell ohne Computerunterstützung durchgeführt
        werden.
    -   Es werden keine Testfälle gewählt.
    -   Vollständige Aussagen über die Korrektheit oder Zuverlässigkeit können nicht erzeugt
        werden.

Ungeachtet der manuellen Durchführbarkeit statischer Analysen ist eine Werkzeugunterstützung
sinnvoll und sollte in jedem Fall genutzt werden. Bei den statischen Analysetechniken unterscheidet
man zwischen Stilanalyse, Grafiken und Tabletten, Slicing, Datenflussanomalieanalyse und den
manuellen Inspektions- und Review-Techniken.
Fachhochschule Köln – Cologne University of Applied Sciences 6
                                                      Codeanalyse mit FX Cop für MS Visual Studio

        2.2.1. Manuelle formale Inspektion
Die formale Inspektion hat das Ziel eine Steigerung von Effektivität und Effizienz der Fehlerfindung
durch einen formal definierten Prozess zu erreichen. Die formale Inspektion ist nach der „IEEE
Standard for Software Reviews“ in 6 Phasen eingeteilt.

1. Planung
2. Einführung
3. Vorbereitung
4. Inspektionssitzung
5. Nachbearbeitung
6. Wiedervorlage

In der Phase Planung werden die beteiligten Personen, Verfahren sowie die Dokumente und der
Aufwand festgestellt. In der nächsten Phase werden die Informationen über Prüflinge und
Spezifikationen an die Inspektoren weiter gegeben. Die Vorbereitung dient zur Auseinandersetzung
mit dem Prüfling. Die Inspektionssitzung ist eine Diskussionsrunde mit klaren Regeln, in der alle
Befunde protokolliert werden. In der Nachbearbeitung erfolgen die Fehlerkorrekturen. In der Phase
Wiedervorlage werden die Korrekturen überprüft und die Inspektionsberichte angefertigt. Die
Vorteile der formalen Inspektion liegen in der Anwendbarkeit auf alle Dokumente der
Softwareentwicklung und zählt als die leistungsfähigste manuelle Technik. Jedoch ist die
Durchführung zeitaufwendig und teuer. Daher wird sie nur auf kleine Teilprodukte angewendet.

Die formale Inspektion kommt überwiegend bei kritischen Software-Komponenten mit zentraler
Bedeutung zum Einsatz, da sie sehr leistungsfähig jedoch auch teuer und zeitaufwendig ist.

       2.2.2. Manuelle Reviewtechnik
Im Unterschied zur formalen Inspektion gibt es hier keinen formalen Ablauf und die Reviewdaten
werden in der Regel nicht aufgezeichnet. Reviews sind nicht so Effizient wie die formale Inspektion.
Jedoch werden bei der Durchführung weniger Ressourcen und Zeit verbraucht, was dieses Verfahren
Kostengünstiger macht. Durch diese Eigenschaften werden Reviews nicht nur zur Fehlerfindung,
sondern auch zur Entscheidungsfindung benutzt.

Die Reviewtechnik kommt meist bei Software-Teilen von mittlerer Kritikalität zum Einsatz, da sie
nicht so teuer wie die formale Inspektion und trotzdem leistungsfähig ist.

Die Durchführung findet in Form einer Sitzung statt, bei der gemeinsam mit einem Arbeitskollegen
der programmierte Code begutachtet wird. Dieser Arbeitskollege muss bereits gut vorbereitet in die
Sitzung kommen, da ca. 80 % der Fehler bereits in der Vorbereitung erkannt werden. Laut einer
Studie von Dipl. Inf. Peter Rösler, werden für 100 – 150 NLOC („non commentary lines of code“)
einer Stunde Aufwand berechnet.
Fachhochschule Köln – Cologne University of Applied Sciences 7
                                                     Codeanalyse mit FX Cop für MS Visual Studio

       2.2.3. Stilanalyse
Ein Anwendungspunkt der Werkzeuggestützten statischen Codeanalyse ist die Stilanalyse. Diese
beschäftigt sich mit der Überprüfung der Programmierkonventionen. Diese
Programmierkonventionen werden in Bereiche eingeteilt, wie etwa:

Regelwerk für Sourcecode:
Hier fallen beispielsweise Regeln der Firmen, Abteilungen oder Teams an, sowie Vorschriften durch
den Anwendungsbereich.

Ausschließen von Konstrukten:
Das Ausschließen festgelegter Konstrukte, die Fehler begünstigen, Qualität mindern, Portabilität
verhindern oder das Verständnis reduzieren.

Layout:
Beispielsweise die Kammersetzung der {}-Klammern. Es sind viele weitere Konventionen denkbar.

Beispiel für Regeln der Stilanalyse:
Kontrollstrukturen
        ➔ return nur einmal pro Funktion
        ➔ keine Schleifen mit mehrfachen Ausgängen
        ➔ kein continue oder break innerhalb von Schleifen
        ➔ ...
Operationen
        ➔ Zuweisungen in Ausdrücken sind verboten
        ➔ Mehrfachzuweisungen sind Verboten (x=y+(z=5))
        ➔ ...
Datentypen, Variablen
        ➔ Variablen sind stets zu initialisieren
        ➔ ungültige Zeiger sind als NULL-Pointer zu belegen
        ➔ Konstanten und Makros komplett in Großbuchstaben
        ➔ Variablen und Funktionen in Kleinbuchstaben
        ➔ ...

Bewertung der Stilanalyse:
Die Stilanalyse schränkt Fehlerquellen ein, kann die Lesbarkeit verbessern, das Code-Verständnis
steigern und die Testbarkeit erhöhen.
Die Stilanalyse ist bei Programmiersprachen mit liberaler, qualitätsmindernder Syntax unverzichtbar.
Fachhochschule Köln – Cologne University of Applied Sciences 8
                                                     Codeanalyse mit FX Cop für MS Visual Studio

         2.2.4. Slicing
Slicing zielt auf die weitgehend automatische Bereitstellung von Informationen über
Wirkzusammenhänge in einem betrachteten Programm. Die Arbeitsweise ist vergleichbar mit der
manuellen Fehlersuche (Debugging) nach dem Auftreten eines Fehlverhaltens. Ein Programm Slice
beschreibt, welche Anweisungen auf welche Weise einen betrachteten Wert beeinflussen. Ein Slice
wird also stets in Bezug auf einen betrachteten Wert an einer bestimmten Stelle des Programms
angegeben. Streng genommen ist dies die Definition des so genannten rückwärtsgerichteten Slicing.
Es gibt auch forward Slicing. Ein derartiger Slice stellt also dar, welche Anweisungen auf welche
Weise von einem betrachteten Wert beeinflusst werden. Rückwärtsgerichtetes Slicing entspricht der
Analyse, die bei der manuellen Ursachensuche für ein betrachtetes Fehlverhalten durchgeführt wird.
Zunächst wird man prüfen, ob das Fehlverhalten durch die aktuell betrachtete Anweisung verursacht
wurde. Ist das nicht der Fall, so werden die Anweisungen überprüft, die für die Anweisung Daten
liefern oder ihre Ausführung steuern. Dieses Verfahren kann fortgesetzt werden, bis keine Vorgänger
mehr existieren, also Eingabeanweisungen erreicht werden. Der so erzeugte Slice enthält alle
potentiellen Verursacher des fehlerhaften Wertes an der betrachteten Stelle. Durch Slicing liegt die
folgende Information in komprimierter Form vor:

    -   Anweisungen, die den Wert einer betrachteten Variablen an einer bestimmten Stelle
        beeinflussen können
    -   Beteiligte Variablen und Datenflüsse
    -   Kontrollflüsse

Alle Anweisungen, die nicht Bestandteil des Slices sind, müssen bei der Fehler suche nicht geprüft
werden. Durch automatisches Slicing kann daher die der Aufwand reduziert werden. Man
unterscheidet statisches und dynamisches Slicing.

Statisches Slicing:
Es werden Wirkungszusammenhänge aus dem Quellcode heraus erzeugt.
Diese dienen zum Verständnis von Programmen.

Dynamisches Slicing:
Die Wirkungszusammenhänge werden zur Laufzeit ermittelt und bestimmte Situationen betrachtet.
Diese dienen zum Debugging von Programmen.
Fachhochschule Köln – Cologne University of Applied Sciences 9
                                                        Codeanalyse mit FX Cop für MS Visual Studio

        2.2.5. Datenflussanomalien
Diese Methode dient zur statischen Überprüfung des Datenflusses auf Anomalien. Die Prüfung ist
Teilweise in Compilern oder IDEs vorhanden [Ligg02].

U: undefiniert
D: definiert
R: referenziert

Es werden Zugriffsequenzen in Bezug auf eine Variable betrachtet.
Beispielsequenz: „URDRU“
Die Beispielsequenz beginnt mit „UR“. Dabei tritt das Problem auf, das zu dem Zeitpunkt an dem
referenziert wird , die Variable noch undefiniert ist. Es handelt sich um eine Anomalie.

Anomalien:
   - UR: Referenz auf undefinierte Variable
   - DD: Doppelte Definition einer Variable
   - DU: Definierte Variable wird ohne Verwendung des Wertes wieder Undefiniert.

Zustandsautomat zur Datenflussanomalie:

                                      D                           D
                  Datenfluss-                    definiert                 referenziert
                   Anomalie
                                      U                           R

                                  R                    D              U

                     Start            U         undefiniert

                                                                      U
Fachhochschule Köln – Cologne University of Applied Sciences 10
                                                     Codeanalyse mit FX Cop für MS Visual Studio

3. FX Cop
Im Folgenden wird die statische Analyse von Microsoft verwendet, „FX Cop“. FX Cop wurde
entwickelt um .Net Code auf Programmierregeln oder Codierungsrichtlinien hin zu prüfen.

Die Fähigkeiten von FX Cop umfassen das gesamte Spektrum der statischen Code-Analyse. Es gibt
eine Vielzahl von Elementen auf die zugegriffen werden kann. Ob Namenskonvertierungen,
Parameterwerte, Rechtschreibung oder XML Kommentare. Jede Zeile Code wird eindeutig als
OPCode repräsentiert. Es kann so ziemlich für jedes Problem eine spezifische Regel erstellt werden.

Durch die Verwendung von Fx Cop Regeln können Sie unter anderem folgende Ergebnisse erzielen:

Sicherstellen, dass Bezeichnungen von Steuerelemente in Formularen und Web-Seiten Ihrer
Namenskonventionen folgen.
Prüfen, ob die bevorzugten Steuerelemente, Komponenten und Klassen verwendet werden.
Es können Bedingungen und Schleifen auf ihre Code-Metrik untersucht werden.
Ganze Methoden und Klassen, oder je nach Implementierung auch nur spezielle Varianten beim
Aufrufen von Methoden, können gesperrt werden.
Überprüfen ob Elemente korrekt durch XML-Kommentare dokumentiert sind.
Es gibt viele weitere Möglichkeiten.

Microsoft bietet bereits eine Fülle von Programmierungsregeln an. Diese sind in verschiedene
Kategorien aufgeteilt. Die Folgenden Beispiele beschreiben einige Regeln.

• Design
        Bsp.: CA1007 „Nach Möglichkeit Generika verwenden“
• Globalization
        Bsp.: CA1309 „Ordinal-StringComparison verwenden“
• Naming
        Bsp.: CA1707 „Bezeichner sollten keine Unterstriche enthalten“
• Performance
        Bsp.: CA1821 „Leere Finalizer entfernen“
• Security
        Bsp.: CA2100 „SQL-Abfragen auf Sicherheit überprüfen“
• Usage
        Bsp.: CA1806 „Methodenergebnisse nicht ignorieren“
•…

Anders als bei bisherigen statischen Analyse Tools wie z.B. „lint“ für C, untersucht FX Cop nicht den
Source Code, sondern die binäre „Common Intermediate Language“ (CIL) (Siehe Kap. 4). Diese liegt in
Form einer DLL oder Exe da. Dies hat den Vorteil, dass die Regeln auf jede .Net Sprache wie C# oder
VB angewendet werden können.

Die erste Version vom FX Cop wurde bereits kurz nach der Veröffentlichung vom .Net Framework 1.0
im Jahr 2002 bereit gestellt.
Fachhochschule Köln – Cologne University of Applied Sciences 11
                                                           Codeanalyse mit FX Cop für MS Visual Studio

    3.1.Systemvoraussetzungen
Es wird natürlich vorausgesetzt das eine aktuelle Version von Microsoft Visual Studio und dem .NET
Framework vorliegt. Weitere Mindestvoraussetzungen die das System betreffen sind nicht
spezifiziert. Die folgenden Beispiele wurden alle unter Visual Studio 2010 erstellt.

    3.2. Introspection Code Model
Bislang wurde zum analysieren von CIL (siehe Kap. 4) die API „System.Reflection“ verwendet. Mit
Reflection ist man allerdings schnell an seine Grenzen gestoßen. Das .NET Framework bietet daher
zusammen mit dem FX Cop, eine alternative Technologie namens Introspektion an. Die Introspektion
API ähnelt der bisherigen Reflection API, sie ist aber spezialisiert auf die Analyse-Funktionen. Wer mit
Reflection zufrieden war, wird von der Introspection API begeistert sein.

Das Code Modell unterteilt die Metadaten in eine Hierarchie von „Nodes“. Für jede Node wurde eine
Klasse in der Introspection API angelegt. Anhand dieser Nodes kann jede .Net Klasse oder Methode
untersucht werden.

In Abbildung 1 wird das komplette Introspection Code Model gezeigt. Die Klassen sind so
angeordnet, dass es dem Entwickler möglich ist von einer „Node“ zur anderen zu springen. Das
Introspection Code Model kann sehr detailliert eine .NET Klasse darstellen.

Abbildung 1: Introspection Code Model [Kres08]
Fachhochschule Köln – Cologne University of Applied Sciences 12
                                                     Codeanalyse mit FX Cop für MS Visual Studio

4. CIL – Common Intermediate Language
[Wenz08]

Die Common Intermediate Language (CIL auch bekannt als IL oder MSIL) ist eine Zwischensprache, in
die alle Programme der Common Language Infrastructure übersetzt werden. CIL ist eine
objektorientierte Assemblersprache und ist vollständig stackbasiert. Auf dem Zielcomputer wird die
CIL von einem Laufzeitsystem (Virtual Execution System) in systemeigenen Programmcode übersetzt,
um die in CIL vorliegenden Programme ausführen zu können. Es ist das gleiche Prinzip wie auch die
Java Runtime Environment.

Vorteil dabei ist, dass alle .NET Sprachen, wie C#, VB und J# die selbe CIL erzeugen. Dadurch kann der
FX Cop für sämtliche .NET Sprachen eingesetzt werden, ohne dass jedes Mal die Regeln neu
programmiert werden müssen.

Da die FX Cop Codeanalyse nur auf CIL angewendet werden kann, ist es nicht möglich Regeln zu
programmieren, die Beispielsweise falsche Einrückungen oder leere Zeilen erkennen.

Aus dem C# Code wird CIL erzeugt. Ein kleines Beispiel zeigt den Zusammenhang.

C#:
a = a + b;
oder,
a += b;

CIL:
ldloc.0             //   (ldloc = load local) erste lokale Variable laden;
ldloc.1             //   zweite lokale Variable laden;
add                 //   Addieren
stloc.0             //   (stloc = store local) speichern des Ergebnisses
Fachhochschule Köln – Cologne University of Applied Sciences 13
                                                      Codeanalyse mit FX Cop für MS Visual Studio

5. Installation von FX Cop
Fx Cop ist Bestandteil des .NET Framework 4 in der Version 7.1. oder aktueller. Um FX Cop einsetzen
zu können, müssen die folgenden zwei Schritte erledigt werden.

    1. Laden Sie das Microsoft Windows SDK für Windows 7 und .NET Framework 4 Version 7.1.
       runter und installieren Sie es.
       http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=6B6C21D2-2006-
       4AFA-9702-529FA782D63B
    2. Starten Sie %ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin\FXCop\FxCopSetup.exe um
       die Installation von FX Cop aufzurufen.

6. Erstellen eigener Regeln (Custom Rules)
Zum Erstellen einer eigenen Regel empfiehlt es sich zwei Projekte in Visual Studio anzulegen. In
einem Projekt erstellen wir neue Regeln und in dem anderen werden Sie getestet.

                            Abbildung 2: Projektmappe

Die Projektmappe sollte diese Struktur aufweisen, damit das Arbeiten übersichtlich bleibt.

Es gibt ein paar wichtige Punkte, die bei der Erstellung des Projektes berücksichtigt werden müssen.
Es ist zwingend notwendig das diese Vorgaben eingehalten werden, da sonst die erstellten Regeln
nicht als solche vom System erkannt werden.

    1. Das Projekt, welches die Implementierungen der Custom Rules enthalten soll, muss vom Typ
       „Klassenbibliothek“ sein und exakt die gleiche Bezeichnung haben wie die übergeordnete
       Projektmappe. In unserem Beispiel heißt diese „StaticCodeAnalyse“.
Fachhochschule Köln – Cologne University of Applied Sciences 14
                                                       Codeanalyse mit FX Cop für MS Visual Studio

   2. Es müssen zwei Referenzen angegeben werden, FxCopSdk.dll und Microsoft.Cci.dll. Man
      kann dazu die DLLs im Installationsverzeichnis von Visual Studio suchen, oder man löst es ein
      wenig eleganter. Rechtsklick auf das Projekt und „Projekt entladen“ auswählen. Jetzt kann
      die *.csproj Datei geöffnet und bearbeitet werden. In dieser Datei muss innerhalb der
      -Node folgender Code hinterlegt werden.

              $(CodeAnalysisPath)\FxCopSdk.dll
              False
            
              $(CodeAnalysisPath)\Microsoft.Cci.dll
              False
            
   3. Nachdem die Änderungen gespeichert sind, muss das Projekt mit einem Klick auf „Projekt
      erneut laden“ wieder geladen werden.

   6.1.Metadata XML
In dem Projekt „CodeAnalyse“ wurde ein Ordner „MetaData“ angelegt. Jedes Projekt das Custom
Rules erstellen möchte, benötigt eine XML Datei in der die Meta Daten für sämtliche Regeln definiert
werden. Damit diese XML Datei nach der Kompilierung in die erstellte Assembly integriert wird, muss
in den Eigenschaften der XML Datei angegeben werden das sie eine „eingebette Ressource“ ist.

           Abbildung 3: Metadata XML Eigenschaften
Fachhochschule Köln – Cologne University of Applied Sciences 15
                                                      Codeanalyse mit FX Cop für MS Visual Studio

Im Folgenden kann der Aufbau dieser XML Datei eingesehen werden. Jede Regel bekommt ein
„Rule“-Tag. Hier werden sämtliche Informationen zu einer Custom Rule gesammelt.

FriendlyName: Der Name, der in der Regelbibliothek und der Fx Cop GUI auftaucht.
TypeName:      Der Name der .NET-Klasse, die die Regel implementiert.
Category:      Die Kategorie der Regel. Sie sollte in etwa den gleichen Namen haben wie der
FrienlyName. Das Feld Categorie ist für den End User wichtig, wenn er Meldungen der „Custom Rule“
abfangen will.
CheckId:       Identifizierungsnummer der Regel. Es dürfen keine Regeln die selbe CheckId
verwenden. (Bsp.: „CR1010“)

Name:            Der Name der Regel, der in der FxCop Gui auftaucht.
Description: Eine kurze Beschreibung der Regel. Bei einem Verstoß gegen die Regel wird die
Beschreibung im Errorfenster angezeigt.
Url:             Diese Url sollte auf eine Seite weiterleiten, auf der ein konkretes Lösungsbeispiel
dargestellt wird.
Resolution:      Bei einem Regelverstoß erscheint die Resolution als Lösungsvorschlag im
Errorfenster.
MessageLevel: CriticalError, Error, CriticalWarning oder Warning.
Certainty:       Ein Wert von 0 – 100 der beschreiben soll, wie oft es sich bei einem erkannten Fehler
um einen Tatsächliches Problem handelt. Der Wert dient nur zur Information.
Email:           Eine Email Adresse die in Verbindung mit der Regel angezeigt wird. Meistens bleibt
dieses Feld leer.
FixCategories: Breaking, NonBreaking oder DependsOnFix. Dient nur als Information.
Owner:           Der Besitzer oder Ersteller der Custom Rule. Bleibt meistens leer.
Fachhochschule Köln – Cologne University of Applied Sciences 16
                                                        Codeanalyse mit FX Cop für MS Visual Studio

         6.2.BaseCustomRule
    Wie in Abbildung 2 zu sehen, liegt in der Projektmappe „CodeAnalyse“ eine Klasse mit dem Namen
    „BaseCustomRule“. Diese erbt von „BaseIntrospectionRule“ und wird später die Vaterklasse aller
    erzeugten CustomRules werden.

    Es werden zwei Verweise benötigt, die im Installationsordner von FxCop zu finden sind. „FxCopSDK“
    und „Microsoft.Cci“.

Abbildung 4: BaseCustomRule
Fachhochschule Köln – Cologne University of Applied Sciences 17
                                                             Codeanalyse mit FX Cop für MS Visual Studio

         6.3.Die erste Custom Rule
     Zur Demonstration wird in dem folgenden Source Code eine Custom Rule erstellt, die sämtliche
     Methoden auf Groß- bzw. Kleinschreibung prüft. Ich möchte damit erreichen, dass jede Methode die
     definiert wird großgeschrieben wird. Man könnte die Regel noch erweitern, so dass alle Variablen
     kleingeschrieben werden.

     Die Regel hat den Namen „MethodsToUppercase“ bekommen.

Abbildung 5: Custom Rule, MethodsToUppercase

     Da die selbst erstellte Custom Rule nur Methoden untersuchen soll, muss die Check Methode mit
     einem Parameter vom Typ Member überschrieben werden. Ein Member kann entweder eine
     EventNode, ein Field, eine PropertyNode oder ein Methode sein. Für jede Methode oder für jedes
     Field in der Prüfenden Klasse, wird sie aufgerufen. Im Falle der MethodsToUppercase Regel,
     interessieren nur die Methoden. Daher startet die Check-Methode mit einer Typumwandlung von
     Member in eine Methode. Kommt bei diesem Cast ein „null“ heraus, ist klar das es sich bei dem
     Member um keine Methode handelt. Handelt es sich aber um eine Methode, so wird per Substring
     das erste Zeichen des Methodennamens ausgelesen und auf die Großschreibung geprüft. Bei einem
Fachhochschule Köln – Cologne University of Applied Sciences 18
                                                              Codeanalyse mit FX Cop für MS Visual Studio

    Verstoß wird ein „Problem“ zurückgegeben. Anhand der Definition in der Metadaten-XML, wird
    daraus ein Fehler erstellt und in der Fehlerliste von Visual Studio ausgegeben.

    Die XML Definition für die Regel „MethodsToUppercase“ könnte wie folgt aussehen.

Abbildung 6: Metadaten für die Regel MethodsToUppercase

    In der „Resolution“ tauchen zwei Werte in geschweiften Klammern auf. Diese werden, wie bei der
    Verwendung von „string.Format()“, durch die Werte ersetzt, welche dem Problem übergeben
    wurden. Das sind in diesem Fall der Name der Methode und die Zeichenfolge „method“.
Fachhochschule Köln – Cologne University of Applied Sciences 19
                                                      Codeanalyse mit FX Cop für MS Visual Studio

       6.4.Verwenden der Custom Rule
  Nachdem die Regel und die Metadaten geschrieben sind, kann die Projektmappe kompiliert werden.
  Als Resultat erhält man eine DLL die sich in der Projektmappe unter „/bin“ finden lässt.

Abbildung 7: Build Resultat

  Diese DLL muss in das Rules Verzeichnis von Visual Studio 2010 gelegt werden.

  “C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\Rules”
Fachhochschule Köln – Cologne University of Applied Sciences 20
                                                            Codeanalyse mit FX Cop für MS Visual Studio

Abbildung 8: Das Zielverzeichnis für unsere Custom Rule

Achtung! Es ist wichtig das Visual Studio 2010 neu gestartet wird, nachdem die Regel in das
Zielverzeichnis verschoben wurde.

Wie schon in Abbildung 2, in der Projektmappe zu sehen ist, benötigen wir ein zweites Projekt zum
Testen der Regeln. In diesem Projekt können beliebig viele Klassen abgelegt werden. Es ist sinnvoll
darin einen Fehlerfall und einen korrekten Fall zu implementieren. Beim späteren Kompilieren sollte
die Regel dann im Fehlerfall anschlagen.

Ein Rechtsklick auf dieses Testprojekt, in unserem Fall „ErrorTesting“, öffnet einen Dialog, in dem wir
„Eigenschaften“ auswählen. In den Eigenschaften selektiert man den Unterpunkt „Codeanalyse“, wie
in der nächsten Abbildung dargestellt.
Fachhochschule Köln – Cologne University of Applied Sciences 21
                                                            Codeanalyse mit FX Cop für MS Visual Studio

Abbildung 9: Einstellungen des Projektes "ErrorTesting"

Es wird ein bestehendes „RuleSet“ ausgewählt und auf „Öffnen“ geklickt. Man kommt nun zu einer
Auswahl von Regeln. Darunter sollte sich jetzt auch die erstellte Custom Rule befinden.

Abbildung 10: Auswahl der verwendeten Regeln

In diesem Beispiel habe ich alle vordefinierten Regeln ausgeschaltet und nur die Custom Rule
aktiviert. Diese Auswahl wird gespeichert.
Fachhochschule Köln – Cologne University of Applied Sciences 22
                                                           Codeanalyse mit FX Cop für MS Visual Studio

    6.5.Testen der Custom Rule
Wie schon im letzten Abschnitt angesprochen, wird ein zweites Projekt benötigt, in dem die
erstellten Custom Rules getestet werden können. Zum Testen der neuen Regel werden zwei
Methoden erstellt. Eine ist großgeschrieben und die andere klein.

Wenn jetzt der Code kompiliert wird, wird er dabei gegen diese Regel geprüft. Die nächste Abbildung
zeigt die Resultierende Fehlermeldung.

Abbildung 11: Die Fehlerliste unter Verwendung der Custom Rule

Unsere Regel hat erfolgreich zugeschlagen. Mit einem „Warning“ wird darauf hingewiesen, dass die
Methode „methodToUppercaseTest2“ mit einem großen Buchstaben beginnen sollte.
Fachhochschule Köln – Cologne University of Applied Sciences 23
                                                       Codeanalyse mit FX Cop für MS Visual Studio

7. Alternativen / Ergänzungen
Es ist nicht Möglich mit FXCop C#-Code direkt zu analysieren. FXCop prüft immer nur die aus C#-Code
resultierende CIL. Alternativ dazu bietet sich der StyleCop von Microsoft an. Mit dem StyleCop kann
man ein Regelwerk aufbauen, dass direkt auf C# Code angewendet wird. Somit können falsche
Einrückungen, leere Zeilen, Rechtschreibung und vieles mehr geprüft werden.

StyleCop ist nicht in der Standardinstallation von Visual Studio enthalten. Es steht aber frei im
Internet zum Download bereit. (http://stylecop.codeplex.com/releases/view/48036)

Es gibt sogar ein frei verfügbares Plug-In , welches Fehler nicht nur erkennt, sondern auch beheben
kann. Leere Zeilen etc. werden automatisch entfernt.

Weitere Hilfreiche Tools sind Cat.NET. und Pex.
Cat.NET ist ein Add-In für Visual Studio. Das Tool hilft dabei, Sicherheitslücken zu identifizieren und
Sicherheitsmängel in Bezug auf Cross-Site Scripting (XSS), SQL Injection und XPath Injection in
Applikationen zu verhindern.

Pex ist ein Whiteboxtest, welcher ebenfalls als Plug-In für Visual Studio bereit steht.
Mit Pex können Schleifen und Methoden dynamisch analysiert werden. Es werden beim Test einer
Schleife alle möglichen Parameter mitgegeben. Anschließend erhält man eine Auskunft darüber ob es
eine Konstellation von Parametern gibt, die eine Endlosschleife erzeugen.
Fachhochschule Köln – Cologne University of Applied Sciences 24
                                                    Codeanalyse mit FX Cop für MS Visual Studio

8. Fazit
Statische Codeanalyse sollte fester Bestandteil eines jeden Softwareherstellers sein. Der Aufwand
zum Erstellen von Custom Rules darf nicht unterschätzt werden, aber die Mühe wird durch höhere
Codequalität bezahlt. Man kann von keinem Softwareentwickler erwarten, dass er fehlerfrei Code
erzeugt. Doch durch den Einsatz präziser Regeln, kann sichergestellt werden, dass bestimmte Fehler
vermieden werden.

Bei Oevermann Networks haben sich ca. 40 Custom Rules etabliert. Das Erstellen dieser Regeln hat
inklusive Einarbeitung etwa drei Monate, bei 20 Std./Woche, gedauert.

Meiner Meinung nach ist Codeanalyse den Aufwand wert und ist eine enorme Ergänzung zur
Qualitätssicherung.
Fachhochschule Köln – Cologne University of Applied Sciences 25
                                                       Codeanalyse mit FX Cop für MS Visual Studio

9. Quellen
Buch:

    -      [Wenz08] Christian Wenz, Tobias Hauser, Karsten Samaschke, Jürgen Kotz: ASP .NET 3.5 mit
           Visual C# 2008, 2008, ISBN 3-8273-2302-6
    -       [Ligg02] Peter Liggesmeyer: Software-Qualität, 2002, ISBN 3-8274-1118-1
    -      [Spil07] Andreas Spillner, Tilo Linz: Basiswissen Softwaretest, 2007, ISBN 3-89864-358-1

Artikel:

    -      [Kres08] Jason Kresowaty: FxCop and Code Analysis: Writing Your Own Custom Rules, 2008
Sie können auch lesen