Eckdaten
Aufgrund der zunehmenden Komplexität von Embedded-Anwendungen beansprucht die Lokalisierung und Behebung von Fehlern immer mehr Ressourcen im Entwicklungsprozess. Entwickler verbringen viel Zeit damit, die Qualität ihres Codes sicherzustellen, um damit auch die hohe Qualität der Anwendung und des Endproduktes gewährleisten zu können. Diese Bugs und potenziellen Fehlerquellen im eigenen Code zu finden, kann nervtötend zeitaufwendig sein. Eine Unterstützung durch ein einfach zu nutzendes Tool für die statische Analyse ist daher hochwillkommen.
Statische Analyse bedeutet für jeden etwas anderes. In diesem Beitrag definieren wir sie als eine Analyse auf Quellcode-Ebene, im Gegensatz zur Laufzeitanalyse, bei der für die Suche nach potenziellen Fehlern ein Programm ausgeführt wird. Die statische Analyse im Quellcode findet mögliche Fehlerquellen und Muster, die die Portierbarkeit des Codes auf andere Hardwareplattformen erschweren oder den Code bekannten Sicherheitsrisiken aussetzen können. Sie stellt außerdem sicher, dass der Code den gängigen Codierungsstandards entspricht. Deshalb ist die Nutzung von statischen Analysetools in jedem Embedded-Entwicklungsprojekt empfehlenswert – und zum Beispiel bei der Entwicklung von sicherheitsrelevanten Produkten mit Safety-Zertifizierung zwingend vorgeschrieben.
Ein Tool für die statische Analyse muss – wie wir bei IAR Systems im Austausch mit Kunden feststellen konnten – nicht nur ein sehr gutes Kosten-Nutzen-Verhältnis aufweisen, sondern auch einfach zu nutzen sein. Unser Anspruch war es, eine große Bandbreite an identifizierbaren Problemen abzudecken und gleichzeitig auch die Überprüfung der Einhaltung von formalisierten Codierungsstandards wie zum Beispiel verschiedenen Misra-Regelsätzen zu sichern. Aus diesem Grund ist das statische Analysetool C-Stat als Add-on für die C/C++-Compiler- und Debugger-Toolchain IAR Embedded Workbench verfügbar.
Teil des täglichen Arbeitsablaufs
Was C-Stat von anderen Tools für die statische Analyse unterscheidet, ist die vollständige Integration in die Toolchain. Damit werden komplexe Konfigurationen überflüssig und es gibt keine Probleme mit der Sprachunterstützung oder allgemeine Build-Probleme. Wenn Entwickler bevorzugt in der eigenen Build-Umgebung arbeiten, kann der Code direkt und ohne großen Aufwand in der Befehlszeile analysiert werden.
Mit nur wenigen Klicks und nach einer einfachen Auswahl der Prüfkriterien überprüft C-Stat wahlweise ein einzelnes Projektfile oder ein vollständiges Projekt, indem es den Code mit den etablierten Codierungsrichtlinen wie den Secure-Coding-Standards CERT-C/C++ und der Common Weakness Enumeration (CWE) abgleicht. Das Tool erkennt und markiert mögliche Fehler und Schwachstellen wie Konvertierungsfehler oder Divisionen durch Null, Probleme im Speichermanagement wie Speicherleaks, Puffer-Überläufe und Out-of-Bound-Zugriffe sowie toten Code und Portierungsfehler.
Neben der Verbesserung der Codequalität im Allgemeinen unterstützt die Analyse auch die Einhaltung von industriellen Codierungsstandards wie Misra C:2012, Misra C:2004 und Misra C++:2008. Die individuelle Konfiguration der Checks kann auch exportiert werden, sodass dieses Setup ganz einfach in den Projekten von Co-Entwicklern genutzt werden kann. Umgekehrt können Checks auch importiert werden, etwa um die Analyseabläufe über das Entwicklungsteam hinaus zu synchronisieren.
Alle Prüfvorgänge innerhalb von C-Stat werden lückenlos dokumentiert und mit Bezügen zu den entsprechenden Einträgen in CWE sowie den Misra- und Cert-Standards versehen. Durch Auswahl der Regel und Drücken der F1-Taste wird der entsprechende Auszug aus dem Userguide aufgerufen, der sowohl eine Beschreibung der Regel als auch ein einfaches Codebeispiel enthält (Bild 2).
Detaillierte Warnmeldungen
Nach der Ausführung von C-Stat in der Embedded Workbench zeigt das Programm eine Liste mit umfassenden und detaillierten Meldungen. Diese Meldungen sind sortiert nach der individuellen Kategorisierung und enthalten jeweils detaillierte Informationen sowie eine Angabe zum Schweregrad des Verstoßes (level of severity). Per Klick auf die F1-Taste ist wiederum eine detaillierte Beschreibung zur ausgewählten Meldung verfügbar.
Für alle Meldungen kann ein vollständiger HTML-basierender Report erstellt werden. Dieses Dokument ist hilfreich, wenn es um die Prüfung der Ergebnisse von laufenden Entwicklungsaufgaben und die Wartung des Quellcodes des Projektes in seiner Gesamtheit geht. Der Report kann auch in die Dokumentation des Entwicklungsteams einfließen, zu statistischen Auswertungen herangezogen werden oder wichtige Informationen für Zertifizierungen bereitstellen.
Unterdrücken von Meldungen
Manchmal ist es aber auch notwendig, bestimmte Regeln für bestimmte Codezeilen oder Bereiche zu unterdrücken. In C-Stat kann dies auf verschiedene Arten bewerkstelligt werden, zum Beispiel mit einer speziellen Kommentar-Syntax (Bild 4).
Nachdem Verstöße zu ausgewählten Codierungsrichtlinien stets dokumentiert werden sollten, sind derartige Unterdrückungen immer im HTML-Report von C-Stat aufgeführt.
Der Lohn statischer Analyse
C-Stat wurde zu Beginn des Jahres 2015 eingeführt. Aktuell ist das Add-on-Tool verfügbar für die Embedded Workbench für ARM, MSP430, AVR32, AVR, RX, V850, CR16C, STM8, 8051, RL78 und RH850. Kunden aus allen Anwendungsbereichen, etwa der industriellen Automatisierung, der Gebäudeautomatisierung und Medizintechnik, setzen C-Stat bereits ein. Die Gründe für die Nutzung dieses Tools für die statische Codeanalyse sind unabhängig von Region oder Branche sehr ähnlich: Die Unternehmen streben nach einer effizienten Optimierung der Qualität ihrer Produkte. Mit der zunehmenden Komplexität von Embedded-Anwendungen steigt bei den Unternehmen der Druck, die Produktivität zu erhöhen, um eine frühe Markteinführung ihrer Produkte bei gleichzeitig hoher Produktqualität zu gewährleisten. Statische Codeanalyse-Tools wie C-Stat, die sich einfach in den alltäglichen Entwicklungsprozess integrieren lassen, können hier einen Unterschied machen. Der Lohn dafür sind stabile und zuverlässige Anwendungen, zeitnah geliefert.