ASIL A | ASIL B | ASIL C | ASIL D | |
---|---|---|---|---|
Statement Coverage | ++ | ++ | + | + |
Branch Coverage | + | ++ | ++ | ++ |
MC/DC (Modified Condition/Decision Coverage | + | + | + | ++ |
Tabelle: Empfehlungen zu Code-Coverage-Verfahren nach ISO 26262 (Zeichenerklärung: ++ unbedingt empfohlen, + empfohlen).
Zumindest für einen Großteil der gängigen Optimierungsstrategien bietet der Kontrollflussgraph dennoch ausreichend Informationen, auch für die auf gewonnenem Code-Trace basierende Branch-Coverage-Analyse. Jedoch kann der Debugger die Kontrollflussinformationen aus den Binaries nur in Fragmenten rekonstruieren. Genau gesagt ist die Rekonstruktion nur bei direkten Sprünge zweifelsfrei möglich, bei indirekten nicht.
Für den Compiler ist der Kontrollflussgraph nicht mehr und nicht weniger die Basis für alle Optimierungen. Alle Optimierungsschritte sind letztendlich Transformationen dieses Graphen. Trotzdem wird er am Schluss verworfen und nicht in die Debug-Informationen aufgenommen. Mittels einer von PLS forcierten Ergänzung des DWARF-Formats lässt sich dies bei Bedarf allerdings einfach ändern. Der Compiler kann den finalen Kontrollflussgraphen nun in einer definierten Debug-Sektion hinterlegen. Die Struktur dieser Sektion ist relativ einfach und beinhaltet im Wesentlichen die Startadressen der Basisblöcke und eine Liste der Nachfolger für jeden Block.
Der Vorteil dieser Lösung liegt auf der Hand. Da sich nur die Debug-Sektion ändert, das Binary jedoch unangetastet bleibt, wird das Laufzeitverhalten nicht verändert. Seitens des Coverage Tools, in diesem Falle der Universal Debug Engine (UDE), werden die verfügbaren Kontrollflussinformationen direkt mit den gewonnen Trace-Daten verknüpft. Damit ist eine Branch-Coverage-Analyse nicht-invasiv möglich, ohne Instrumentierung und ohne Verletzung des Laufzeitverhaltens von optimiertem Code.
Fazit
Der Beitrag verdeutlicht, dass beim Thema Code Coverage der Teufel nach wie vor gerne im Detail steckt. Besonders kritisch ist und bleibt das Testen optimierter Produktionssoftware direkt auf dem Target. Hochsprachen- oder Maschinencode-orientiertes Code Coverage, der vernünftige Umgang mit optimiertem Code und die effiziente Datengewinnung mittels Trace erfordern nicht nur immer leistungsfähigere Tools. Sie verlangen Entwicklern und Testern auch ein hohes Maß an Hintergrundwissen ab. Daran wird sich so schnell leider auch nichts ändern.(fr)