Software-Engineering II Eingebettete Systeme, Softwarequalität, Projektmanagement Prof. Dr. Holger Schlingloff Institut für Informatik der Humboldt Universität und Fraunhofer Institut für Rechnerarchitektur und Softwaretechnik
Folie 2 H. Schlingloff, Software-Engineering II statische Analyse ohne semantische Konsequenzen Coding Rules Checker, Linker, … mit semantischer Bedeutung Range and Bounds Checker Pointer and Storage Allocation Race Condition Verifikationswerkzeuge Modellprüfer, Äquivalenzprüfung interaktive Beweisverfahren zunehmende Mächtigkeit zunehmende Komplexität
Folie 3 H. Schlingloff, Software-Engineering II Statische Analyse: Compiler Typkorrektheit Initialisierung von Variablen Programmflussgraph Unerreichbarer Code Unveränderliche Felder Konstante Terme und Bedingungen Feldgrenzenverletzung ? Nullzeiger-Dereferenzierung ? Synchronisationsfehler ?
Folie 4 H. Schlingloff, Software-Engineering II statische Analysewerkzeuge Spezialwerkzeuge zur tiefergehenden Analyse Lint (Splint, PCLint,…) PolySpace Verifier … Unterschiedliche Analysetiefe, unterschiedliche Ergebnisrate Problem: false positives
Folie 5 H. Schlingloff, Software-Engineering II Lint Grundidee Programmierer annotiert das Programm Lint prüft ob Annotationen erfüllt sind Einfache (schnelle!) Datenflussanalyse! Beispiel:
Folie 6 H. Schlingloff, Software-Engineering II anderes Beispiel: only einzige Referenz zu besagtem Objekt explizite Abgabe der Besitzrechte am Objekt
Folie 7 H. Schlingloff, Software-Engineering II Buffer Overflow Verantwortlich für viele Sicherheitslücken Annotation der Puffergröße in Splint
Folie 8 H. Schlingloff, Software-Engineering II Abstrakte Interpretation Wie beweist man solche Constraints? 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
Folie 9 H. Schlingloff, Software-Engineering II Beispiel {x {2,4,6}} x=3*x+1 {x {7,13,19}}
Folie 10 H. Schlingloff, Software-Engineering II allgemeine Vorgehensweise ergibt ein (rekursives) Gleichungssystem Lösung als kleinster Fixpunkt
Folie 11 H. Schlingloff, Software-Engineering II Fixpunktsatz von Knaster und Tarski jede monotone Funktion f in einem vollständigen Verband hat einen kleinsten Fixpunkt, nämlich inf{x|xf(x)} wenn f stetig ist, so ist der kleinste Fixpunkt gegeben durch lim f n (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
Folie 12 H. Schlingloff, Software-Engineering II Probleme Terminierung des Verfahrens ist nicht garantiert! (Limesbildung über transfinite Ordinalzahlen) Rechnen mit symbolischen Zustandsmengen z.B. Menge der Quadratzahlen, symbolische Ausdrücke wie x 2 +3x+5 usw. Gleichheit von beliebigen Mengenausdrücken unentscheidbar!
Folie 13 H. Schlingloff, Software-Engineering II Pause!
Folie 14 H. Schlingloff, Software-Engineering II Abstraktion Beispiel x*y=z (x mod n * y mod n ) mod n = z mod 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 = (8 mod 3 * 7 mod 3 ) mod 3 = 56 mod 3 (8 mod 3 * 7 mod 3 ) mod 3 57 mod 3 8*7 57 aber: 8*7 65, obwohl (8 mod 3 * 7 mod 3 ) mod 3 = 65 mod 3 false positives: Der abstrakte Check findet keinen Fehler, obwohl noch einer enthalten ist (vgl. Test)
Folie 15 H. Schlingloff, Software-Engineering II 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
Folie 16 H. Schlingloff, Software-Engineering II Wie abstrahieren? Restklassen Positiv/Null/Negativ (vgl. Grenzwertanalyse) Polyeder-Verband Konjunktionen linearer Ungleichungen z.B. 17x32 & 1y<100 Rechnungen in diesem Verband lassen sich in polynomialer Zeit (schnell!) nachvollziehen z.B. x = x+y ergibt 18x132
Folie 17 H. Schlingloff, Software-Engineering II PolySpace C Verifier Analyse des Codes, symbolische Berechnung möglicher Fehler Rechenzeiten im Stunden- und Tagebereich False Negatives müssen manuell betrachtet werden Möglichkeit von False Positives Trotzdem massive Erhöhung der Sicherheit Initialisierung, Zeigerkonsistenz, Nulldivision, Wertebereichs- und Indexüberläufe, Speicherlecks unerreichbarer Code, Endlosschleifen und -rekursionen Problematisch: OO-Programme