Eine der Hauptquellen für Probleme in der Anwendungsentwicklung sind Speicherzugriffsfehler, die durch verschiedene Arten von Bugs wie Buffer-Überläufe und Speicherlecks ausgelöst werden. Mit einer neuen Technik werden Entwickler dabei unterstützt, solche Fehler in Zukunft zu vermeiden.
Im Jahr 1996 explodierte die Rakete Ariane 5 der Europäischen Weltraumorganisation (ESA) wegen eines Softwarefehlers nur 39 s nach dem Start, was zu einem Schaden von mehr als 370 Mio. US-Dollar führte. Aber nicht nur in solchen extremen Beispielen, sondern auch im Alltag können Bugs eine große Gefahrenquelle darstellen, wenn man zum Beispiel an das autonome Fahren denkt.
Laut der Common Weakness Enumeration (CWE) [1] führen typische Speicherzugriffsfehler wie Out-of-Bound-Schreib- oder Lesezugriffe oder Use-After-Free die Top-25-Liste der gefährlichsten Softwareschwachstellen an. Sie zu finden ist also besonders wichtig. Lauterbach, Anbieter von Debug- und Trace-Tools, hat eine neue Technik entwickelt, die es erlaubt, solche Softwarefehler in Echtzeitsoftware für Embedded-Systeme automatisch zu identifizieren, indem sie die Trace-Technik des Mikroprozessors nutzt. Sie nennt sich »Advanced Dynamic Code Analysis« (ADCA).
Erstmals wird die neue Technik am 15. März um 11:30 Uhr auf der embedded world Conference vorgestellt, wo Firmengründer und CTO Stephan Lauterbach einen entsprechenden Vortrag hält.
Bekannte und seit Langem eingesetzte dynamische Code-Analyse-Tools wie Valgrind und Asan (AddressSanitizer) instrumentieren den Code, um speicherspezifische Fehler zu erkennen. Das Problem ist, dass dies die Codeausführung um den Faktor 2 bis 20 verlangsamt und die Codegröße »explodiert«, sodass diese Tools für Echtzeitanwendungen ungeeignet sind.
Der Ansatz von Lauterbach ist ganz anders: Wie in Bild 1 zu sehen ist, basiert ADCA auf einem gewöhnlichen Echtzeit-Flowtrace und Lauterbachs Context Tracking System (CTS). Durch die Verwendung von Flow Trace werden die Informationen des Adress- und Datenbusses so übertragen, wie sie direkt am CPU-Kern anfallen. Durch die ungefilterte Aufzeichnung aller Trace-Daten ist es sehr wahrscheinlich, dass der gesuchte Fehler bei entsprechenden Aufzeichnungszeiten in den Trace-Daten gefunden werden kann. Darüber hinaus stehen mehrere Programmläufe für Laufzeitstatistiken und/oder Codeabdeckungsanalysen zur Verfügung. Echtzeit-Flow-Trace an sich ist keine Hexerei.
Lauterbachs Context Tracking System (CTS) ermöglicht es, den Zustand eines Zielsystems auf der Grundlage der im Trace-Puffer gesammelten Informationen wiederherzustellen. CTS ermöglicht das Re-Debugging eines Programmabschnitts, Vorwärts- und Rückwärts-Debugging, Trace-Darstellung in Hochsprache einschließlich aller lokalen Variablen und es hat die Fähigkeit, Trace-Lücken zu füllen, die durch eine begrenzte Bandbreite eines Trace-Ports entstehen können.
ADCA schließlich ist ein erweiterter CTS-Modus zur Untersuchung und Behebung von Speicherzugriffsfehlern. Es wird nach dem Start des Codes ausgeführt und erfasst die anfänglichen Speicher- und Registerzustände. Allen Daten und Speicheradressen werden statische und dynamische Tags zugewiesen. Tags sind unsichtbare Metainformationen, die vom Debugger mitgezogen werden. Speicherverletzungen werden nach dem Schlüssel-Schloss-Prinzip erkannt: Ein Datum mit einem bestimmten Tag darf nur auf eine Speicheradresse zugreifen, die mit demselben Tag verbunden ist (Bild 2).
Bild 3 zeigt ein Beispiel für einen Array-Zugriff außerhalb der Grenzen. ADCA meldet einen Fehler beim Zugriff auf ein Array und die Speicheradresse der Zugriffsverletzung. Entwickler können diese Informationen nutzen, um den Code zu analysieren und den/die Fehler zu beheben, indem sie zusätzliche Informationen nutzen, die in Lauterbachs TRACE32 PowerView GUI angezeigt werden; Details hierzu werden im Vortrag auf der embedded world Conference erläutert.
Nur Lauterbachs Advanced Dynamic Code Analysis erfüllt die Anforderungen von Embedded-Entwicklern hinsichtlich Echtzeitanforderungen und Erkennung der wichtigsten potenziellen Speicherzugriffsfehler in C/C++. ADCA ist ein großer Schritt nach vorne, um diese schwer zu findenden und schwer reproduzierbaren Fehler zu identifizieren und unterstützt dabei sogar Multicore-Architekturen. Für ausgewählte Architekturen wird die Technik im Software-Update von TRACE32 PowerView in einem der nächsten Releases ohne zusätzliche Kosten für Kunden verfügbar sein.