code checker ausreizen - electronics goes medical 2012
TRANSCRIPT
© Zühlke 2012
Wie kann man Software testen?
Software Tests
Statische Tests
Reviews Statische Analyse
Dynamische Tests
© Zühlke 2012
Wie kann man Software analysieren?
Statische Analyse
Architektur Metriken Code-
Checker
Stil Kodier-regeln
Anomalien
Sicherheits-
probleme
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Später ist teurer – 10er Regel nach Tilo Pfeiffer
11. Oktober 2012
Während Entwicklungx 1 Während Testphase
x 10
Beim Anwenderx 100
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Später ist teurer – Statische Analyse im V-Modell
11. Oktober 2012
Anforderungs-
spezifikation
Architektur-design
Komponenten-
spezifikation
Implementierung
Komponenten-tests
Integrations-tests
Validierung
Dyn
amis
che
Test
s
Statische Analyse
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Statisch vs. dynamisch – Fehlerzustand und Fehlerwirkung
Fehlerzustand
result = NULL;
if(a%2){ result="a";}
if (b % 2){ result="b";}
output(result);
Fehlerwirkung
• a=1,b=2 „a“
• a=2,b=1 „b“
• a=2,b=2 ?
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Code-Checker im Vergleich – Bugs pro Meldung
Fehlerzustand
result = NULL;
if(a%2){ result="a";}
if (b % 2){ result="b";}
output(result);
Bugs pro Meldung
• Stil: x Meldungen, 0 Bugs
• Kodierregeln: x Meldungen, 0 Bugs
• Anomalien: 1 Meldung, 1 Bug
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Datenflussanalyseur-Anomalie
int i;array[i] = 1;
11. Oktober 2012
undefined
referenced
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Datenflussanalysedu-Anomalie
int complicated(void){ int result; int tmp = 0; result = tmp; tmp = 100 x T + 4; return result;}
11. Oktober 2012
defined
undefined
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Datenflussanalysedd-Anomalie
int complicated(void){ int tmp = 22; tmp = 100 x T + 4; return tmp;}
11. Oktober 2012
defined
defined
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Unerreichbarer Code Endlos-Schleife
void complicated(uint8_t i){ if ( i >= 256 ) { … }}
uint8_t i;for ( i = 0; i < 256; i++ ){ …}
KontrollflussanalyseAnomalien
11. Oktober 2012
3 Tage Fehlersuche
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
void complicated(bool b1, bool b2, bool b3){ int a = 1; if ( b1 ) a = a + 2; if ( b2 ) a = a + 3; if ( b3 ) a = a + 4; if ( a > 10 ) { /* Dead code */ }}
Value Tracking
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
void complicated( int i ){ static bool array[2]; array[i] = true;}
Interprozedurale Analyse
complicated( 0 );
complicated( 1 );
complicated( 2 );
11. Oktober 2012
complicated( 0 );
complicated( 1 );
complicated( 0 );
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Force_mN force(Pressure_Pa p){ return p * MY_AREA_mm2 * 1000;}
Dimensionsanalyse
11. Oktober 2012
Richtig?
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
1. Definition des Einheitensystems
DimensionsanalyseFunktionsprinzip
11. Oktober 2012
Einheit
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
2. Zuordnung von Datentypen
DimensionsanalyseFunktionsprinzip
11. Oktober 2012
Einheit Datentyp
MY_AREA_mm2
Pressure_Pa
Force_mN
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
3. Zurückleitung auf Produkt der Basiseinheiten
DimensionsanalyseFunktionsprinzip
11. Oktober 2012
Force_mN p * MY_AREA_mm2 * 1000
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
• Datenflussanalyse: ein bisschen
• Kontrollflussanalyse: ein bisschen
• Value Tracking: eher nicht
• Interprozedurale Analyse: eher nicht
• Dimensionsanalyse: Boost.Units
• Mit ausgeschalteten Warnungen: sowieso nicht!
Das macht mein Compiler doch schon!
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
• 60.000 Zeilen Code
• Produkt 10+ Jahre auf dem Markt
• 4 Datenflussanomalien– Variable wird ohne Initialisierung verwendet– Abhängig von mehreren Konfigurationsoptionen
• Bisher unerkannt– Passte die zufällige „Initialisierung“ immer?– Kommt kritische Konfiguration nicht vor?– Wurden Fehler nicht erkannt / nicht gemeldet?
PraxisbeispielAssessment von Alt-Code
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
• Tool kaufen und in Betrieb nehmen
• Entwickler schulen (buy-in!)
• Meldungen aus altem Code wegschaffen
• Neue Meldungen während Entwicklung untersuchen
Investition
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
• Abraxas CodeCheck
• Coverity
• Findbugs
• Gimpel PC-Lint
• Klocwork
• Parasoft CodeWizard
• PMD
• ProgrammingResearch QA/C, QA/C++
• MathWorks Polyspace
• Microsoft FxCop
• Splint
• …
Tools am Markt
11. Oktober 2012
© Zühlke 2012Code-Checker ausreizen | Matthias Kraaz
Statische Analyse auf Anomalien ist
• früher einsetzbar als dynamische Tests
• ergiebiger als Kodierregeln zu prüfen
• eventuell mit vorhandenen Tools möglich
und erleichtert die Fehlersuche.
Nutzen / Fazit
11. Oktober 2012