Power-Metriken in der statischen Analyse

Power Metriken in der statischen Analyse

Software-Code-Metriken, auch bekannt als Software-Qualitätsmetriken, sind zu einem unverzichtbaren Werkzeug für Software-Entwickler geworden.

Sie stellen die Qualität, Wartbarkeit und Testbarkeit ihres Codes sicher.

Softwaremetriken können Entwicklerteams bei der Ermittlung potenzieller Probleme, komplexer Bereiche und besonders gefährdeter Bereiche innerhalb des Codes unterstützen.

Noch bevor diese Probleme zu Fehlern oder Unzulänglichkeiten während der Laufzeit oder Bereitstellung führen.

Es gibt eine große Anzahl verschiedener Softwaremetriken.

Diese reichen von einfachen Größen- und Komplexitätsmaßen (wie der Anzahl der Lines of Code (LOC) und der Anzahl der Parameter einer Funktion) bis hin zu komplexeren Berechnungen (wie der Anzahl der unabhängigen Pfade durch eine Methode oder Funktion) und OO-spezifischen Metriken wie Coupling und Cohesion.

Schließlich gibt es aus der akademischen Forschung abgeleitete Metriken, welche relativ realistische Maße für die Komplexität oder Testbarkeit liefern, wie die McCabe-Metrik für zyklomatische Komplexität oder die Halstead-Komplexitätsmaße.

Statische Analysetools werden oft verwendet, um Software-Code-Metriken als Ergebnis der bereits durchgeführten Analyse und Verarbeitung zu erstellen.

SciTools Understand ist ein solches statisches Analysetool.

Understand ist in der Lage, detaillierte Berichte über eine breite Palette von Softwaremetriken zu erstellen.

Diese helfen den Entwicklern, ihren Code besser zu verstehen und zu erkennen, welche Teile überarbeitet oder verbessert werden müssen. 

Welche Metriken unterstützt Understand?

Understand ist sehr effizient beim Sammeln von Daten über den zu analysierenden Code.

Diese Daten können automatisch über Befehlszeilenaufrufe extrahiert, in Tabellenkalkulationen exportiert, grafisch angezeigt, dynamisch in der GUI untersucht oder über die Understand Perl API angepasst werden.

Sie können auch auf Projektebene, für Dateien, Klassen, Funktionen oder benutzerdefinierte Architekturen ausgegeben werden.

Metriken in der statischen Analyse

Die meisten Metriken in Understand können in die folgenden Gruppen eingeteilt werden:

  • Komplexitätsmetriken (z.B. McCabe Cyclomatic)
  • Umfangsmetriken (z.B. Lines of Code)
  • Objektorientiert (z.B. Kopplung zwischen Objektklassen)

Understand drängt nicht auf eine bestimmte Codierungsmethodik.

Understand sagt Ihnen nicht, dass Ihr Code „gut“ oder „schlecht“ ist. Understand versucht nur, die Daten so flexibel wie möglich darzustellen.

So können Sie die Daten so interpretieren, wie Sie es für richtig halten.

Hier finden Sie eine vollständige Liste der Metriken, die Understand unterstützt und eine Beschreibung ihrer Berechnung.

Hier finden Sie für eine detaillierte Beschreibung, wie viele der C++-Metriken implementiert sind.

Verwendung von eigenen Metriken in Understand

Um Ihre eigenen Metriken mit Understand zu verwenden, gibt es eine vollständige Perl-API-Schnittstelle zur Datenbank sowie einen vollständig entwickelten Plugin-Mechanismus.

Zum Beispiel gibt es ein Beispiel-Perl-API-Skript, das mit Understand ausgeliefert wird und der Halstead Maintainability Index wird für jede Datei und Funktion in Ihrem Projekt erzeugt.

Die zyklomatische Komplexitäts (CC) Metrik

Zyklomatische Komplexität (CC) – auch bekannt als McCabe Cyclomatic Complexity oder Conditional Complexity – ist ein Maß für die Komplexität in Bezug auf den Kontrollflussgraphen der Programmeinheiten.

Understand zählt die Anzahl der linear unabhängigen Pfade durch ein Modul und meldet die Aggregat-, Durchschnitts- und Summenmetriken für die Klassen und Dateien, die sie enthalten

Ein hoher CC-Wert deutet darauf hin, dass es zu viele Verzweigungspfade innerhalb der Funktion gibt, was dazu führt, dass das Softwaremodul komplexer zu lesen, schwieriger zu verstehen und zeitaufwändiger zu testen ist.

Zyklomatische Komplexität (CC)Risikobewertung
1-10ein einfaches Programm, ohne großes Risiko
11-20komplexer, mäßiges Risiko
21-50komplexes, risikoreiches Programm
50+nicht prüfbares Programm (sehr hohes Risiko)
Die Zyklomatische Komplexität

Man könnte nun denken, dass jedes hochkomplexe Programm neu geschrieben werden sollte und ein Re-Factoring in Erwägung ziehen.

Allerdings sollten auch die Zusammenhänge und die möglichen Auswirkungen berücksichtigt werden.

Wenn ein komplexes Programm jahrelang mit minimalen Problemen erfolgreich gelaufen ist, sollte man sehr vorsichtig sein, es umzuschreiben, nur um die Komplexität zu reduzieren.

Varianten der zyklomatischen Komplexität

Die McCabe-Metrik der zyklomatischen Komplexität ist definiert als zyklomatische Komplexität eines strukturierten Programms mit nur einem Eingangs- und einem Ausgangspunkt = der Anzahl der in diesem Programm enthaltenen Entscheidungspunkte plus eins.

Understand berechnet die zyklomatische Metrik nach der folgenden Methode: 

  • Für eine gegebene Funktion werden die Schlüsselwörter für Entscheidungspunkte (FOR, WHILE, usw.) gezählt und dann 1 addiert. Bei einer switch-Anweisung wird jeder „case“ als 1 gezählt und der „switch“ selbst addiert 1 zum endgültigen zyklomatischen Komplexitätswert. Understand unterstützt mehrere Varianten zur Berechnung dieser Metrik:
  • Die modifizierte zyklomatische Komplexität soll die Auswirkungen auf die Komplexität der Lesbarkeit von Modulen besser widerspiegeln, welche eine oder mehrere große Strukturanweisungen mit mehreren Entscheidungen (switch-Anweisungen in C/C++) und mit vielen Entscheidungen (cases in C/C++) enthalten können. In der normalen CC-Metrik haben Switch-Anweisungen in der Regel einen großen Einfluss auf die Metrik, da jeder Fall eine Entscheidung hinzufügen würde. Solche Switch-Anweisungen kommen häufig in Zustandsmaschinensystemen oder Hauptausführungsfunktionen von Prozessen vor. Obwohl sie aus Sicht der Testbarkeit zu einer erheblichen Komplexität führen, sind sie normalerweise sehr einfach zu lesen und zu verstehen. In der Tat sind sie eine recht ordentliche Lösung für solche Anforderungen. Die modifizierte CC-Metrik soll diese Lesbarkeit verbessern. Jeder Fall in einer switch-Anweisung wird nicht gezählt, sondern die gesamte switch-Struktur wird als eine gezählt.
  • Die strenge zyklomatische Komplexität fügt den Begriff der logischen UND- und ODER-Verknüpfungen in bedingten Ausdrücken hinzu und erhöht die Komplexität für jedes ihrer Vorkommen um 1. Diese Metrik lässt sich gut mit der booleschen Abdeckung für Testzwecke verbinden, wie sie bei sicherheitskritischen Systemen häufig erforderlich ist. 

Weitere Komplexitätsmetriken

Understand berechnet auch viele andere Komplexitätsmetriken, einschließlich Depth of Inheritance Tree (DIT), Nesting, Knots, und Halstead Complexity (via Plugin).

Die Daten können direkt in Understand über den Metrik-Browser betrachtet werden.

Zusätzlich können Sie Metriken in eine Tabellenkalkulation exportieren.

Die Metrik-Treemap bietet eine weitere Möglichkeit, Metriken mit Hilfe von Größe und Farbe darzustellen.

In dieser Treemap wird die Komplexität durch die Dunkelheit der Farbe dargestellt und die Größe jeder Box repräsentiert die Anzahl der Codezeilen in jeder Funktion.

Fazit

Zusammenfassend lässt sich sagen, dass der Einsatz von Software-Metriken für Software-Entwickler in einer ganzen Reihe von unterschiedlichen Disziplinen und Aufgaben einen enormen Wert darstellt.

Die in Understand enthaltenen Metriken haben sich über viele Jahre hinweg entwickelt, um die häufigsten und wichtigsten Kundenanforderungen zu erfüllen.

Wir wissen jedoch, dass Sie vielleicht etwas anderes brauchen.

Um Sie bei der Entwicklung eigener Metriken zu unterstützen, gibt es eine vollständige API-Schnittstelle zur Understand-Datenbank sowie einen ausgereiften Plugin-Mechanismus.

Wenn Sie Fragen haben, unterstützt unser Supportteam Sie gerne: support@emenda.com

Textquellen

https://support.scitools.com/support/solutions/articles/70000582289-metrics-overview

https://support.scitools.com/support/solutions/articles/70000582297-understanding-mccabe-cyclomatic-complexi

https://support.scitools.com/support/solutions/articles/70000582299-cyclomatic-complexity

https://scitools.freshdesk.com/support/solutions/articles/70000582300-source-lines-of-code

,