Frage

Ich versuche, ein allgemeines Bild des Zustands der formellen Software-Überprüfung zusammenzugeben, und ich habe ein gutes Stück Ärger. Für den Kontext komme ich aus meist einem mathematischen Hintergrund. Ich bin mit dem Zustand des automatisierten Theorems, der sich in Bezug auf ihre Verwendung in Bezug auf ihre Verwendung ergibt, gut ausgebildete mathematische Erklärungen (z. B. in Coq, Isabelle, Mager usw.) vertraut. Ich habe Probleme, das Verständnis zu verstehen, ist das, was in praktischen CS-Anwendungen mit "formalen Methoden" vorgeht.

Ich habe festgestellt, dass Unternehmen wie Microsoft und AWS TLA + als "formale Methode" in ihrer Softwareentwicklung etwas erheblich eingesetzt haben. Als ich jedoch anfing, Wayne's praktisches TLA + -Buch zu lesen, fand ich fest, dass er ein Programm gilt, das formal überprüft wurde, wenn wir einfach überprüfen, wenn wir nur einen Sortieralgorithmus auf Listenlisten der Länge $ mit Einträgen zwischen 1 und $ N $ für einige fixe $ n $ , dh wir prüfen nur endlich viele Fälle und sagen, dass der Algorithmus im Allgemeinen arbeiten sollte. Das scheint nicht besonders interessant zu sein; Nur ein Beispiel für besonders strenge Untertests. Insbesondere ist es kein formeller Korrektheitsnachweis.

Auf der anderen Seite habe ich Murmeln über Isabelle und Coq gesehen, um Dinge von der Lage zu sein, Dinge über Software zu beweisen, wie sie als mathematische Theoreme beweisen können. Wenn ich in den Büchern in die Bücher schaue, die dies zu versprechen scheinen, z. CHlipala's Zertifizierte Programmierung mit abhängigen Typen , ich sehe viel abstrakte Zeug, die sich vage, um Programme formal zu überprüfen scheint, aber keine Beispiele für das Einnehmen eines echten Programms, das in einer Sprache geschrieben wurde, die den weit verbreiteten Gebrauch aufweist (z. B. C ++) , Python, Java usw.) oder sogar nur Pseudocode und "Überprüfung dessen", was auch immer das bedeutet.

Kann jemand versuchen, meine Verwirrung aufzuklären?

War es hilfreich?

Lösung

Ein formal bewährtes Programm ist ein formal bewährtes Programm, unabhängig davon, welche Sprache es in der Sprache ist. Nur weil ein Programm in COQ und vielleicht extrahierte nach Ocaml oder Haskell, anstatt in mehreren" Enterprisey "-Schande wie C ++ oder Java zu schreiben, macht es nicht weniger ein Programm.

Programme, die in allgemeinen Programmiersprachen geschrieben wurden, sogar "Tame" wie Haskell, ist schwer, da diese Sprachen in der Regel viele Convenience-Funktionen, dunkle Ecken für die Leistung und die Schnittstelle mit dem Betriebssystem enthalten, und reich und komplex Bibliotheken. Um eine Eigenschaft eines Programms zu beweisen, müssen Sie zuerst diese Eigenschaft angeben, und die Anweisung beinhaltet die Semantik der Sprache, in der das Programm geschrieben wird. Wenn Sie versuchen, Sprachen zu formalisieren, die ursprünglich ohne formelle Semantik entworfen wurden (was fast ist Alle), Sie schlagen sehr schnell dunkle Ecken, die die englische Beschreibung nicht spezifiziert verlässt, oder wo es mehrdeutig ist oder wo es ein völliger Selbst widersprach ist, oder wenn die Referenzimplementierung nicht tut, was die Beschreibung nicht sagt, und das ist ein Fehler in der Beschreibung das Englisch statt in der Implementierung. Der Stand der Technik der Beweiseigenschaften von in einer bereits bestehenden Sprache verfassten Programmen besteht darin, die Programme auf eine Teilmenge der Sprache einzuschränken.

was in diese Teilmenge geht, ist sehr variabel. Syntaktischer Zucker ist nicht zu schwierig: Die Semantik muss nur in einfachere Konstrukte übersetzen. Reflexionseigenschaften sind nicht besonders schwierig, um zu modellieren, können aber das Modell viel schwieriger machen, um etwa (z. B. die Eigenschaften von Eigenschaften wie "Dieses Snippet of Code hat keine Möglichkeit, diese Variable zu verweisen, daher kann es nicht Ändern Sie den Wert ")"), so dass viele Rahmene dies ausschließen. Interaktionen mit dem Betriebssystem (typischerweise über Bibliotheken) sind problematisch, da sie das Modellieren des Betriebssystems benötigen, das extrem komplex ist. Floating Point-Operationen sind hart, weil die Annäherung der Annäherung an aufeinanderfolgende Operationen einen riesigen Blow-Up verursacht.

für c, einer der wichtigsten großen Teilmengen mit einem formalen Modell ist compcert c, die Sprache von compcert . Compcert ist ein formal verifizierter Compiler (in COQ geschrieben). Wenn Sie also eine Eigenschaft des C-Programms beweisen, können Sie zusätzlich einen Nachweis des generierten Maschinencodes erhalten. compcert c ist eine sehr große Teilmenge von C99, aber die Formalisierung schließt den größten Teil des Standards aus Bibliothek und einige Reiche der Sprache.

Um ein Programm zu beweisen, das in einer (passenden Teilmenge einer) realen Programmiersprache geschrieben wird, muss das Programm so strukturiert sein, dass der Proof-Traktable angeht. In der Praxis bedeutet dies, dass das Programm zuerst in einer übergeordneten Sprache geschrieben und nachgewiesen wurde (die keine Implementierung auf echte Hardware hat) und diese übergeordnete Sprache als Spezifikation des Endprogramms nutzen. Oft gibt es mehrere aufeinanderfolgende Verfeinerungen zwischen dem ausführbaren Programm und der Spezifikation.

Es ist ziemlich häufig, dass das endgültige Programm nicht manuell geschrieben wird, sondern mechanisch aus einer höheren Sprache extrahiert wird. Das Schreiben von COQ, das zu OCAML extrahiert ist, oder das Schreiben von f * , der an C extrahiert wird, aber das Der gegenüberliegende Ansatz ist auch möglich, zum Beispiel beim Schreiben ("TAME") C, die es mit den Eigenschaften von Funktionen und anderen Codeunterteilungen annotieren und Frama-C , um diese Eigenschaften zu beweisen (und das implizierte Eigenschaft, das das C-Programm nicht undefiniertes Verhalten hat).

Wenn Sie eine formelle Semantik einer Programmiersprache und eine Möglichkeit haben, die Eigenschaften von Programmen auszudrücken, ist ein mathematischer Theorem. Normalerweise beinhalten diese Theorems keine komplexen Mathematik, wie beispielsweise Kalkül (sofern nicht von der Anwendungsdomäne eingeführt wird, z. B. der Verfolgung der Bewegung eines physischen Objekts), ist jedoch schwer zu beweisen, weil sie sehr große Formeln beinhalten und arithmetische Aussagen enthalten ( $ x ^ n + y ^ n= z ^ n $ ist keine komplexe Gleichung, aber das Lösen ist nicht elementar!). Es ist theoretisch unmöglich, ein Programm zu schreiben, das ein nicht triviales semantisches Eigentum aller Programme beweisen kann und praktisch unmöglich, ein Programm zu schreiben, das viele interessante Eigenschaften typischer Programme erweisen kann. Die formale Überprüfung beinhaltet eine Kombination, um das Problem in ausreichend geringe Schritte abzubrechen (schreibt kleine Funktionen und Angabe genügend genauer Eigenschaften dieser Funktionen), wobei ein Werkzeug automatisch einige dieser Eigenschaften beweist (z

als Sat Solver für Solllogik), und der Mensch schreibt Beweise, wo der Computer kann Tun Sie es (aber der Computer wird den Beweis des Menschen überprüfen). Für diesen letzten Schritt kommen Proof-Assistants wie Coq und Isabelle ein.

Das formale Beweis eines realen Programms ist eine große Anstrengung, die eine viel größere Zeit und das Know-how erfordert als das typische Softwareprojekt. Es ist selten außerhalb von High-Assurance-Umgebungen gemacht, hauptsächlich Umgebungen mit hohen Sicherheitsmaßnahmen wie Transport (Flugzeuge, Züge, nicht so viele Autos), manchmal Umgebungen mit hohen Kosten wie Raum oder (sehr selten) mit hohen Sicherheitsanforderungen wie Smart Karten.

Wenn wir einfach überprüfen, sagen wir einen Sortieralgorithmus auf Listenlisten .

Das wäre kein formeller Nachweis, es sei denn, das Programm hatte ein Limit von N-Punkten für seine Eingabe. Ich kenne dieses Buch nicht, aber ich vermute, dass Sie entweder etwas falsch liefern. Das formale Überprüfen eines Sortierprogramms würde sich beinhalten, seine Richtigkeit für alle n.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top