Qualitätssicherung von Software (SWQS) Prof. Dr. Holger Schlingloff Humboldt-Universität zu Berlin und Fraunhofer FOKUS 6.6.2013: Statische Analyse Fragen zur Wiederholung • Was ist der Unterschied Software-HW Model Checking? • Was versteht man unter Zustandsraumexplosion? • Was kann dagegen tun? H. Schlingloff, Software-Qualitätssicherung Folie 2 statische Analyse • mit semantischer Bedeutung Variableninitialisierung Range and Bounds Checker Pointer and Storage Allocation Race Condition • Verifikationswerkzeuge zunehmende Komplexität Coding Rules Checker, Linker, … zunehmende Mächtigkeit • ohne semantische Konsequenzen Modellprüfer, Äquivalenzprüfung interaktive Beweisverfahren H. Schlingloff, Software-Qualitätssicherung Folie 3 Statische Analyse: Compiler • Typkorrektheit • Initialisierung von Variablen • Programmflussgraph Unerreichbarer Code Unveränderliche Felder Konstante Terme und Bedingungen • Feldgrenzenverletzung ? • Nullzeiger-Dereferenzierung ? • Synchronisationsfehler ? H. Schlingloff, Software-Qualitätssicherung Folie 4 statische Analysewerkzeuge • Es gibt „viele“ http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis • einfache Tools, in Compiler oder IDE integriert • Spezialwerkzeuge zur tiefergehenden Analyse Lint (Splint, PCLint,…) ESC/Java2 PolySpace Verifier … • Unterschiedliche Analysetiefe, unterschiedliche Ergebnisrate • Hauptproblem: false positives H. Schlingloff, Software-Qualitätssicherung Folie 5 Lint • Grundidee Programmierer annotiert das Programm Lint prüft ob Annotationen erfüllt sind • Einfache (schnelle!) Datenflussanalyse! Beispiel: H. Schlingloff, Software-Qualitätssicherung Folie 6 anderes Beispiel: only • einzige Referenz zu besagtem Objekt • explizite Abgabe der Besitzrechte am Objekt H. Schlingloff, Software-Qualitätssicherung Folie 7 Buffer Overflow • Verantwortlich für viele Sicherheitslücken • Annotation der Puffergröße in Splint H. Schlingloff, Software-Qualitätssicherung Folie 8 Probleme bei Abstraktionen • falsche Positive Überapproximation des Programms Bsp.: if (p&&q) ... if (p) ... mangelnde Korrektheit: Fehler die evtl. keine sind erhöhter QS-Aufwand • falsche Negative • • • • Unterapproximation des Programms Bsp.: if (p) ... if (p&&q) ... mangelnde Vollständigkeit: manche Fehler werden nicht erkannt trügerische Sicherheit H. Schlingloff, Software-Qualitätssicherung Folie 9 Bsp.: Cppcheck H. Schlingloff, Software-Qualitätssicherung Folie 10 Bsp.: ESC/Java2 H. Schlingloff, Software-Qualitätssicherung Folie 11 Abstrakte Interpretation • Wie findet man solche Probleme? Ausführung des Programms mit symbolischen Werten (bzw. „Mengen von Werten“) Berechnung der möglichen Werte jeder Variablen an jeder Programmstelle („collecting semantics“) • Was kann man daraus ableiten? Initialisierungen, Überlauf, Division durch Null, Indexüberschreitung, … Keine Aussage über Terminierung oder korrekte Funktionalität H. Schlingloff, Software-Qualitätssicherung Folie 12 Beispiel • {x{2,4,6}} x=3*x+1 {x{7,13,19}} A B C E F G H D H. Schlingloff, Software-Qualitätssicherung Folie 13 allgemeine Vorgehensweise • ergibt ein (rekursives) Gleichungssystem • Lösung als kleinster Fixpunkt H. Schlingloff, Software-Qualitätssicherung Folie 14 Fixpunktsatz von Knaster und Tarski • jede monotone Funktion f in einem vollständigen • Verband hat einen kleinsten Fixpunkt, nämlich inf{x|x≤f(x)} wenn f stetig ist, so ist der kleinste Fixpunkt gegeben durch lim fn(0) • Für die statische Analyse bedeutet das starte mit allen Gleichungswerten undefiniert berechne den Wert der (n+1)-ten Iteration einer Gleichung aus den Werten der n-ten Iteration solange, bis sich nichts mehr ändert H. Schlingloff, Software-Qualitätssicherung Folie 15 Probleme • Terminierung des Verfahrens ist nicht garantiert! (Limesbildung über transfinite Ordinalzahlen) • Rechnen mit symbolischen Zustandsmengen z.B. Menge der Quadratzahlen, symbolische Ausdrücke wie x2+3x+5 usw. Gleichheit von beliebigen Mengenausdrücken unentscheidbar! H. Schlingloff, Software-Qualitätssicherung Folie 16 nochmal: Abstraktion • Beispiel x*y=z (xmod n * ymod n) mod n = zmod n • „mod n“ ist eine Abstraktion, die einen unendlichen • Wertebereich auf {0,1,...,n-1} abbildet um zu prüfen, ob eine Multiplikation korrekt ausgeführt wurde, kann man die Abstraktion prüfen 8*7=56 2 * 1 = (8mod 3 * 7mod 3) mod 3 = 56mod 3 (8mod 3 * 7mod 3) mod 3 57mod 3 8*757 aber: 8*7 65, obwohl (8mod 3 * 7mod 3) mod 3 = 65mod 3 • „false positives“: Der abstrakte Check findet keinen Fehler, obwohl noch einer enthalten ist (vgl. Test) H. Schlingloff, Software-Qualitätssicherung Folie 17 • Datenabstraktion x x mod 3 x*y ((x mod 3) * (y mod 3) mod 3) • eigentlich Rechnen mit Mengen von Werten konkreter Datenraum wird partitioniert in Mengen von Restklassen 0, 1, 2 konkrete Operationen werden abgebildet auf abstrakte; Rechnen mit Repräsentanten • Eigenschaftserhaltung C erfüllt P A erfüllt P A verletzt P C verletzt P H. Schlingloff, Software-Qualitätssicherung Folie 18 Wie abstrahieren? • Restklassen • Positiv/Null/Negativ (vgl. Grenzwertanalyse) • Polyeder-Verband Konjunktionen linearer Ungleichungen z.B. 17≤x≤32 & 1≤y<100 • Rechnungen in diesem Verband lassen sich in polynomialer Zeit (schnell!) nachvollziehen z.B. x = x+y ergibt 18≤x≤132 H. Schlingloff, Software-Qualitätssicherung Folie 19