Alles beginnt mit der Codequalität.

Alles beginnt mit der Codequalität.

Eckdaten

Mit statischer Codeanalyse können Entwickler die Codequalität nachhaltig steigern. Seit 2015 bietet IAR Systems für seine C/C++-Compiler- und Debugger-Toolchain IAR Embedded Workbench das vollständig integrierte Add-On-Tool C-Stat an. C-Stat führt eine erweiterte Codeanalyse entsprechend von Standards wie Misra C:2012, Misra C++:2008 und Misra C:2004 durch und erkennt Fehler und Sicherheitsrisiken, wie sie durch die Common Weakness Enumeration (CWE) und CERT C definiert sind. Für eine noch schnellere Sicherheitszertifizierung bietet IAR Systems ein breites Angebot an zertifizierten Functional-Safety-Versionen der IAR Embedded Workbench an.

Codeanalyse

Mit integrierten Codeanalyse-Tools lässt sich die Codequalität sichern und die Zertifizierung der funktionalen Sicherheit beschleunigen. IAR

Die Zertifizierung der funktionalen Sicherheit einer Anwendung ist in vielen Bereichen wie Automobil, Luftfahrt, Medizintechnik und Industriesteuerung inzwischen fast selbstverständlich. Das Durchlaufen aller erforderlichen Prozesse und Tests war schon immer sehr aufwendig, aber die Zertifizierung lässt sich durch zahlreiche Optimierungsmöglichkeiten im Entwicklungsprozess beschleunigen. Letztendlich beginnt jedoch alles mit der Codequalität. Und diese lässt sich mit ein paar einfachen Mitteln fast sofort und mit überschaubarem Aufwand nachhaltig verbessern.

Standards nutzen

In C99 gibt es rund 190 verschiedene Unschärfen in der Code-Spezifikation. Das heißt, es gibt in C99 190 verschiedene syntaktisch legale C-Konstrukte, die in der Sprachspezifikation von C nicht näher erläutert werden. Es wird sogar noch etwas schlimmer bei C18 oder C++, wo es inzwischen auch Konzepte der multiplen und virtuellen Vererbung gibt. Aufgabe des Compilers ist es, den Quellcode in einen konkreten Code umwandeln, also muss er eine Interpretation des Codes auswählen und ausführen.

In der Praxis bedeutet das, dass verschiedene Compiler einen Quellcode unterschiedlich interpretieren. In einem System mit hoher Zuverlässigkeit ist dies ein Albtraumszenario, zumal viele Unternehmen, die eine Zertifizierung der funktionalen Sicherheit anstreben, ihren Code auf mehreren Plattformen cross-kompilieren, um ihn leichter testen zu können. Das kann sich natürlich sehr nachteilig auf die Dauer des Zertifizierungsprozesses auswirken, da alle Situationen getestet werden müssen, um die Wiederholbarkeit und Zuverlässigkeit des Codes nachzuweisen.

Dieses Problem lässt sich nur umgehen, indem Zweideutigkeiten im Code vermieden werden. Schnelle Abhilfe leistet auch der Einsatz von Codierungsstandards wie Misra, mit denen die Entwickler die üblichen Stolperstellen im Code vermeiden. Diese Standards unterstützen auch sichere und zuverlässige Codierungsmethoden, um die Anzahl der Mängel im Code zu verringern. Aber wie lässt sich sicherstellen, dass diese Standards befolgt werden? Glücklicherweise bieten die Normen für funktionale Sicherheit dazu eine Möglichkeit.

Standards erfordern Codeanalyse

Praktisch jeder Standard für funktionale Sicherheit verlangt eine statische Codeanalyse und empfiehlt dringend, den Code einer Laufzeitanalyse (oder dynamischen Analyse) zu unterziehen. Der weitreichendste dieser Standards ist die IEC 61508 für sicherheitsrelevante Systeme im Allgemeinen. In Abschnitt C.4.2 dieser Norm wird für alle Anwendungen oberhalb von Sicherheitsintegritätslevel SIL 1 von der Verwendung von C ohne Codierungsstandards, die mehrdeutiges und gefährliches Verhalten beseitigen, abgeraten. Wer also eine SIL-2- bis SIL-4-Zertifizierung für sein Produkt anstrebt, muss die statische Analyse verwenden, um seinen Code robuster zu machen. Tools für statische Codeanalyse können einen Entwickler dazu zwingen, Codierungsstandards wie Misra zu implementieren. Darüber hinaus hilft die statische Analyse und die Laufzeitanalyse dabei, die Qualität des Codes zu verbessern, indem sie den Entwickler zeitnah auf Schwachstellen im Code hinweist – insbesondere auf solche, die aus den oben erwähnten Mehrdeutigkeiten der Codierungsstandards resultieren.

In jedem Fall gilt: Wenn diese Art von automatisierten Tools eingesetzt wird, kann das einen großen Einfluss auf den Zertifizierungszeitplan haben. Viele Unternehmen nutzen Codeanalyse-Tools, die schwer zu konfigurieren und umständlich im täglichen Arbeitsablauf sind und als Teil eines nächtlichen Builds auf einem Build-Server ausgeführt werden. Das Problem hierbei ist, dass der einzelne Entwickler kein sofortiges Feedback darüber erhält, was mit dem von ihm gerade geschriebenen Code nicht in Ordnung ist. Außerdem sind die Warnmeldungen, die von diesen Tools kommen, manchmal unverständlich und der Entwickler verschwendet wertvolle Zeit beim Versuch herauszufinden, was die Meldungen bedeuten und wie der Code korrigiert werden kann, um die Warnung verschwinden zu lassen. Wird die Codeanalyse aber während der Entwicklung – noch bevor der Code in einen formalen Build eingecheckt wird – durchgeführt, dann ist es so, als wäre der Defekt gar nicht erst aufgetreten. Das Entwicklungsteam erhält auf diese Weise eine niedrigere Fehlerrate für das Projekt – und das sehen die Zertifizierungsstellen gerne, weil es bedeutet, dass sie es mit einer sehr ausgereiften Entwicklungsorganisation zu tun haben.

Codeanalyse als Teil des täglichen Arbeitsablaufs

Die Erfahrung mit vielen verschiedenen Unternehmen aus verschiedensten Branchen zeigt: Je einfacher die Konfiguration und Verwendung von Codeanalyse-Tools ist, desto eher werden Entwickler sie verwenden und somit schneller von den Vorteilen profitieren. Sind die automatisierten Werkzeuge integraler Bestandteil der Toolsuite des Entwicklers, kann er die Codequalität noch während der Anwendungsprogrammierung überprüfen und verbessern. Gleichzeitig entwickelt er ein tieferes Verständnis dafür, was ein konkreter Codeabschnitt tut und wie er mit anderen Modulen im System interagiert. Am effizientesten funktioniert das, wenn die Tools in den täglichen Arbeitsablauf integriert werden.

Die Vorzüge einer integrierten Codeanalyse haben auch andere erkannt. Ein in einer ACM-Publikation veröffentlichter Artikel von Google wirft einen ganzheitlichen Blick auf die gesamte Codebasis des Unternehmens einschließlich C, C++ und Java – und die Ergebnisse sind sehr deutlich:

„Durch den Compiler erkannte Fehler werden früh im Entwicklungsprozess angezeigt und in den Entwickler-Workflow integriert. Wir haben festgestellt, dass die Erweiterung der Compiler-Checks effektiv zur Verbesserung der Codequalität bei Google beiträgt.“

Die Autoren konstatieren, dass die Durchführung der statischen Analyseprüfungen zu einem früheren Zeitpunkt im Compiler-Workflow und das frühzeitige Aufzeigen von Fehlern auf Seiten der Entwickler eine drastische Erhöhung der Aufmerksamkeit für die Ergebnisse des Tools bewirkt – was letztendlich dazu führt, dass der Code eine wesentlich höhere Qualität aufweist.

Der Text beschäftigt sich auch mit einer Umfrage unter Entwicklern, die kurz zuvor auf einen Compiler-Fehler gestoßen waren, und solchen, die einen Patch mit einer Fehlerbehebung für dasselbe Problem erhalten hatten. Die befragten Google-Entwickler hielten Fehler, die zum Zeitpunkt der Kompilierung aufgezeigt wurden, für wichtiger als jene, die beim eingecheckten Code mit Patches versehen wurde. 74 Prozent der zum Kompilierungszeitpunkt markierten Fehlerstellen wurden als „ernstzunehmende Probleme“ eingestuft, im Vergleich zu 21 Prozent der Fehler, die im eingecheckten Code gefunden wurden.

Statische Analyse in den Arbeitsablauf integrieren

Wie wichtig es ist, die Codeanalyse zu einem Teil des Workflows zu machen, stellten die Autoren fest, als sie Commits automatisch durch ein statisches Analysetool laufen ließen und die Entwickler einluden, sich das Analyse-Dashboard anzusehen – nur die wenigsten folgten dieser Einladung. Die unmittelbare Rückmeldung während des Kompilierungsprozesses machte die statische Analyse dagegen einfacher in der Anwendung und schwieriger zu ignorieren. Daher entschied man sich dafür, die statische Analyse standardmäßig in den Arbeitsablauf aller Entwickler zu integrieren. Die Zufriedenheit der Entwickler gilt als Schlüssel zum Erfolg: Sie müssen das Gefühl haben, dass sie von der Verwendung der Codeanalyse profitieren, und die Codeanalyse-Tools gerne verwenden.

Aber welche Art von Ergebnissen darf man von der Integration der Codeanalyse in den Entwicklungs-Workflow erwarten? Zunächst einmal ist da die Verbesserung der allgemeinen Sicherheit einer Anwendung, da eine hohe Codequalität Schwachstellen wie Pufferüberläufe, illegale Pointer und ähnliches beseitigen kann. Obwohl dies an sich schon ein guter Grund für den Einsatz der Codeanalyse ist, ist es manchmal schwierig, die Projektbeteiligten davon zu überzeugen, dass „Vorbeugung die beste Medizin“ ist. Aussagekräftigere Ergebnisse sind erforderlich, um Entwickler und Management gleichermaßen von den Vorzügen der Codeanalyse zu überzeugen.

In einem Beitrag von Stefan Wagner und seinen Kollegen und Kolleginnen wurden empirische Daten verwendet, um den Nutzen von Codeanalyse-Tools im Vergleich zu traditionellen Tests auf verschiedenen Code-Grundlagen zu berechnen. Ihre Ergebnisse sind sehr aufschlussreich: Von den 769 identifizierten Mängeln wurden 76 Prozent durch Codeanalyse-Tools und nur vier Prozent durch herkömmliche Tests identifiziert (die restlichen 20 Prozent wurden beim Code-Review gefunden). Wie schnell lässt sich ein MTTF (Mean Time to Failure) -Ziel bei Software erreichen, wenn 75 Prozent der Fehler beseitigt werden können, noch bevor überhaupt mit Test begonnen wird? Die Antwort ist: Extrem schnell. Allein die Zeit- und Kostenersparnis beim Testen macht die Investition in Codeanalyse-Tools lohnenswert, ganz zu schweigen von der Zeitersparnis bei der Markteinführung. Dies ist die Art von Prozessen, die Zertifizierungsstellen für funktionale Sicherheit am liebsten sehen, weil sie das Risiko, dass es Fehler im Endprodukt bis in die Anwendung beim Nutzer schaffen, drastisch reduziert.

Hohe Codequalität beschleunigt Zertifizierung für funktionale Sicherheit

Der Schlüssel zur Beschleunigung der Zertifizierung nach den Standards für funktionale Sicherheit liegt in der Verbesserung der Codequalität. Damit werden Fehlerraten gesenkt, die Software-Release-Kriterien schneller erreicht und der gesamte Entwicklungsablauf macht auf die Zertifizierungsstelle einen sehr ausgereiften Eindruck. Auch wenn sich nie genau feststellen lässt, wie viele Fehler in einer Anwendung noch vorhanden sind, so lässt sich mit dem frühzeitigen und verstärkten Einsatz von Codeanalyse-Tools deren Anzahl doch nachhaltig minimieren.

Shawn Prestridge

Senior Field Application Engineer, IAR Systems

(neu)

Sie möchten gerne weiterlesen?

Unternehmen

IAR Systeme GmbH

Werner-Eckert-Str. 9
81829 München
Germany