10 Vor. QSQM Statische Analyse

Nennen Sie andere Methoden für Software-Qualität?

(KlausuerFrage)

  • Fuzzing
  • Formale Verifikation
  • Dynamische Analyse
  • Monitoring


Was ist das Fuzzing?

mit vor&nach Teile

Fuzzing

Erzeugen zufälliger Eingaben, um Abstürze und Fehler auszulösen

• + Findet Fehler, die traditionelle Tests nicht finden

• - Kann die Abwesenheit von Fehlern auch nicht beweisen

Was ist das Formale Verifikation?

mit vor&nach Teile

Formale Verifikation

Experten schreiben mathematisch fundierte Beweise

• + Kann die Abwesenheit (bestimmter) Fehler mit Sicherheit beweisen

• - Enorm zeitaufwendig

• - Spezifisch für ein bestimmtes Programm

• - Oft schwer, die richtige zu beweisende Eigenschaft zu finden

Was ist das Dynamische Analyse?

mit vor&nach Teile

Dynamische Analyse

Daten während Ausführung sammeln und analysieren,

um Informationen zu gewinnen

• Typischerweise mit ausgewählten Programmeingaben (ähnlich zu Tests)

• + "Reale" Ausführungen

• - Begrenzte Anzahl an Ausführungen

• - Wie Programmeingaben auswählen?

Was ist das Monitoring?

mit vor&nach Teile

Monitoring

Daten während tatsächlichem Software-Einsatz sammeln,

kontinuierlich auf Abweichungen beobachten

• + Reale Ausführung

• + Findet relevante Probleme

• - Probleme werden erst gefunden, wenn sie die Nutzung schon beeinflussen

Was ist statische Analyse?

statische Analyse

Infos über Programm (Quelltext/Binary) gewinnen, ohne es auszuführen

• + Vollständig automatisiert

• + Starke Garantien

• + Alle möglichen Ausführungspfade

• - Unentscheidbar

• - Kann keine nutzerdefinierten Eigenschaften beweisen

Erzählen Sie Beispiels In IDEs zur Unterstützung von Entwicklern?

In IDEs zur Unterstützung von Entwicklern

• Klassenhierarchie, Methodenaufruf-Informationen, Code-Navigation.

• Fehler, Warnungen, Code Smells, Vorschläge für Optimierungen.

• Refactoring, z.B. Umbenennen, Ändern von Methodensignaturen, Code verschieben.

• Vorschläge während des Programmierens, Auto-Complete.

statische Analyse Verwendung In Sicherheitsanalysen

In Sicherheitsanalysen

• Finden von Fehlern, Schwachstellen, schwacher Kryptographie, falscher Verwendung von APIs

• Identifikation von Schadsoftware

• Erkennen von Leaks privater Daten

Was sind die Herausforderungen Statische Analyse:


  • Unentscheidbarkeit
  • Vollständigkeit (Completeness)
  • Korrektheit (Soundness)

Was sind die Eigenschaft des Unentscheidbarkeit?

Unentscheidbarkeit

“Jede nicht-triviale Eigenschaft von Programmen ist unentscheidbar”


Unentscheidbare Eigenschaften:

• Terminiert das Programm? (Halteproblem)

• Können zwei Pointer auf dieselbe Speicherstelle zeigen (Alias)

• ... (prinzipiell jede interessante Eigenschaft von Programmen)


Was sind die Möglichkeiten des Unentscheidbarkeit?

Möglichkeiten:

• Keine Ausgabe einer definitiven Antwort

• Überapproximation

• Unterapproximation

Erklären Sie Vollständigkeit (Completeness)?

Vollständigkeit (Completeness)

Keine zur Laufzeit unmöglichen Ergebnisse produzieren

⇒ Keine Überapproximation

• Maß: Genauigkeit (precision) = #Richtig−positive / #Ergebnisse =

• Weniger falsch-positive Ergebnisse

⇒ weniger ungerechtfertigte Warnungen

Erklären Sie Korrektheit (Soundness)?

Korrektheit (Soundness)

Aller zur Laufzeit möglichen Ergebnisse produzieren

⇒ Keine Unterapproximation

• Maß: Trefferquote (recall) = #Richtig−positive / #erwartete Ergebnisse

• Weniger falsch-negative Ergebnisse

⇒ weniger übersehene Probleme

• Vollständige Korrektheit in der Praxis

oft nicht erreichbar:

◦ z.B. dynamisch geladener Code, Reflection

• Soundiness: Bewusste, dokumentierte inkorrekte Design Entscheidungen für Praxistauglichkeit

Erklären Sie Skalierbarkeit ?

Skalierbarkeit

Ergebnisse für große Software in beschränkter Zeit/Speicher produzieren

• Schnelle Ergebnisse in IDEs (unter einer Sekunde)

• Akzeptable Laufzeit/Speicherverbrauch in Continuous Integration

• Analyse von riesigen Software-Verzeichnissen (z.B. Maven Central)


Genauigkeit, Trefferquote und Skalierbarkeit sind Anforderungen,

die oft im Konflikt miteinander stehen

Was sind Analysetypen

  • Kontrollflussanalyse

Kontrollfluss beschreibt Reihenfolge in der Anweisungen ausgeführt werden:

• Welche Anweisung kann nach welcher ausgeführt werden

  • Datenflussnalyse

Datenflussanalysen verfolgen den Fluss von Werten durch ein Programm:

• Wo wird ein hier definierter Wert genutzt

• Wo wurde ein hier genutzter Wert definiert

Nennen und erklären die Eigenschaften statischer Analysen


  • Umfang:

◦ Intraprozedurale Analysen betrachten jede Methode für sich

◦ Interprozedurale Analysen berücksichtigen das gesamte Programm

  • Flusssensitivität:

◦ Flussinsensitive Analysen berechnen ein global gültiges Ergebnis

◦ Flusssensitive Analysen berechnen ein Ergebnis für jede Anweisung

  • Kontextsensitivität:

◦ Kontextinsensitive Analysen betrachten jedes Stück Code nur ein Mal

◦ Kontextsensitive Analysen nutzen mehrere Kontexte (z.B. aufrufende Methode)

Erklären die Eigenschaften statischer Analysen

Umfang:

  • Umfang:

◦ Intraprozedurale Analysen betrachten jede Methode für sich

◦ Interprozedurale Analysen berücksichtigen das gesamte Programm

Erklären die Eigenschaften statischer Analysen

Flusssensitivität:

  • Flusssensitivität:

◦ Flussinsensitive Analysen berechnen ein global gültiges Ergebnis

◦ Flusssensitive Analysen berechnen ein Ergebnis für jede Anweisung

Erklären die Eigenschaften statischer Analysen

Kontextsensitivität:

  • Kontextsensitivität:

◦ Kontextinsensitive Analysen betrachten jedes Stück Code nur ein Mal

◦ Kontextsensitive Analysen nutzen mehrere Kontexte (z.B. aufrufende Methode)

Nennen Sie die Analysetechniken

  • Slicing
  • Constraint-basierte Analyse
  • Big-Step abstrakte Interpreter
  • Symbolische Ausführung
  • Interpropedurale Datenflussanalyse: IFDS & IDE
  • Monotone Datenflussanalyse
  • Typ- und Effektsysteme

Erklären Sie Typ- und Effektsysteme


Typsysteme:

◦ Weisen dem Ergebnis jedes Ausdrucks einen Typ zu

◦ Kompositional: Typ folgt direkt aus Typen von Teilausdrücken

◦ Häufig genutzt, um Fehler schon beim Kompilieren zu verhindern

Effektsysteme:

◦ Weisen jedem Ausdruck einen Effekt zu

◦ Kompositional

◦ Seltener genutzt (aber Sie kennen vermutlich ein sehr einfaches)

Erklären Sie Monotone Datenflussanalyse


(Intraprozedurale) Analyse, wie Werte zwischen Variablen fließen. Z.B.:

• Liveness: Kann Wert nach einem bestimmten Punkt noch gelesen werden?

• Reaching definitions: Woher stammen Werte, die eine Anweisung erreichen?

• Available expressions: Welche Werte wurden bereits berechnet?

Genutzt für Optimierungen, z.B.

• Entfernen von unerreichbarem Code (Dead-code removal)

• Loop-invariant code motion

• Common subexpression elimination

Erklären Sie Interpropedurale Datenflussanalyse: IFDS & IDE


• Interprozeduraler Datenfluss als Graph-Erreichbarkeits-Problem

• Sehr effizient, wenn das Problem geeignet ist (wichtig: Distributivität)

• Nutzung: z.B. Taintanalyse (verfolgen von sensiblen o. gefährlichen Daten)

Erklären Sie Symbolische Ausführung


• Interpretiert Programme mit symbolischen statt konkreten Werten

• Spaltet Ausführung bei Verzweigungen auf

• - Pfadexplosion!

Erklären Sie Big-Step abstrakte Interpreter


• Berechnen Abstraktionen konkreter Werte

• Abstraktionen stammen aus Lattice-basierten Domänen

Z.B. Vorzeichen, Intervalle

• Vereinigt Werte nach Verzweigungen, um Pfadexplosion zu vermeiden

Erklären Sie Constraint-basierte Analyse


• Erzeugt Bedingungen für das Analyseergebnis aus dem analysierten

Programm

• Löst dann die Menge der Bedingungen für die präziseste Lösung

• - Menge der Bedingungen kann schwer zu lösen sein

Erklären Sie Slicing


Extrahiert Anweisungen mit Bezug auf ein Slicingkriterium (z.B. Ort+Variable)

• Rückwärtsslicing: Anweisungen, die das Slicingkriterium beeinflussen

• Vorwärtsslicing: Anweisungen, die vom Slicingkriterium beeinflusst werden

• Anwendungen: Debugging, Klonerkennung, Parallelisierung, etc.

was sind die Wichtige Analysen

  • Immutability & Purity
  • Escape- & Alias-Analyse
  • Points-To-Analyse
  • Callgraphen
  • Kontrollflussgraph und Dominator-Bäume

Erklären Sie Kontrollflussgraph und Dominator-Bäume


CFG: Welche Anweisung wird direkt nach welcher ausgeführt?

Dominatorbaum: Welche Anweisung muss zuvor ausgeführt worden sein?

Post-Dominator-Baum: Welche Anweisung muss danach ausgeführt werden?

Erklären Sie Callgraphen


• Verbinden eine Methode (caller) mit den Methoden, die sie aufruft (callees)

• Notwendige Voraussetzung für alle interprozeduralen Analysen

• Viele Algorithmen mit verschiedenen Abwägungen zwischen Präzision

und Skalierbarkeit

Erklären Sie Points-To-Analyse


• Auf welche Objekte kann eine Variable (Feld, etc.) verweisen?

• Meistens der Ort, an dem das Objekt erzeugt wurde

• Nützlich für viele andere Analysen wie Callgraphen

Erklären Sie Escape- & Alias-Analyse

Escapeanalyse betrachtet die dynamische Lebenszeit von Objekten:

• Kann ein Objekt außerhalb eines beschränkten Kontexts (z.B. Methode, Package) gesehen werden

Nützlich, um Grenzen von Effekten zu kennen und für Optimierungen

Aliasanalyse betrachtet Beziehungen zwischen Variablen:

• Können (may)/müssen (must) zwei Variablen (Felder, etc.) auf das selbe Objekt verweisen?

• May-Analyse oft flussinsensitiv, Must-Analyse immer flusssensitiv

Erklären Sie Immutability & Purity

Immutability: Kann Feld/Klasse/Objekt/etc. nach der Initialisierung verändert werden?

Purity: Ist eine Methode deterministisch und seiteneffektfrei?

• Für sicheren, wartbaren Code

• Besondere Unterstützung in modernen Programmiersprachen

• Kann über ein Typsystem garantiert werden