Welche Sprachen werden für sicherheitskritische Software verwendet? [geschlossen]

StackOverflow https://stackoverflow.com/questions/243387

  •  04-07-2019
  •  | 
  •  

Frage

Ich bin der Erforschung der Entwicklung von sicherheitskritischer Software und insbesondere, welche Auswirkungen die Wahl der Programmiersprache auf eine solche Entwicklung.

Bitte erläutern im Detail, welche Sprachen häufig verwendet werden und warum.

War es hilfreich?

Lösung

Ada und Ökosystem Codeverifikationswerkzeuge für diese Sprachen , obwohl auch diese Technologie für mehr Mainstream-Sprachen als auch .

Erlang war von Grund auf neu entwickelt hohe Zuverlässigkeit Telekommunikations Code zu schreiben. Es wurde entwickelt Trennung von Bereichen für die Fehlerwiederherstellung zu erleichtern (das heißt das Teilsystem die Fehler zu erzeugen unterscheidet sich von dem Untersystem, das den Fehler verarbeitet). Es kann auch auf formale Beweise unterzogen werden, obwohl diese Fähigkeit nicht wirklich weit aus Forschung Kreisen bewegt hat.

Funktionale Sprachen wie Haskell die aufgrund eines href durch automatisierte Systeme auf formale Beweise unterzogen werden kann <= "http://en.wikipedia.org/wiki/Declarative_programming" rel =" noreferrer "> deklarative Natur der Sprache. Dies ermöglicht Code mit Nebenwirkungen in monadischen Funktionen enthalten sein. Für einen formalen Korrektheitsbeweis kann der Rest des Codes ausgegangen werden, nichts zu tun, aber was angegeben ist.

Allerdings sind diese Sprachen Müll gesammelt und die Garbage Collection ist für den Code, so dass es auf diese Weise nicht begründet werden. Müll gesammelt Sprachen sind normalerweise nicht vorhersehbar genug für harte Echtzeit-Anwendungen, obwohl es eine Einrichtung der laufenden Forschung ist in der Zeit inkrementelle Garbage Collectors begrenzt.

Eiffel und seine Nachkommen haben eingebaute Unterstützung für eine Technik namens Design by Contract , die für den Einbau vor und nach den Kontrollen Invarianten. Während Eiffel wirklich nie erwischt, neigt dazu, mit hohen Zuverlässigkeit der Entwicklung von Software für bestehen Schreibprüfungen und Handler Ausfallmodi up-front, bevor die Funktionalität tatsächlich geschrieben werden.

Obwohl C und Sammlung Müll ab. Die Kernlaufzeitbibliotheken von C und C ++ Sprachen sind relativ einfach, ausgereift und gut verstanden, so gehören sie zu den stabilsten Plattformen verfügbar. Die meisten, wenn nicht alle der statischen Analysetools für Ada verwendet auch C und C ++ unterstützen, und es gibt viele andere solche Werkzeuge für C zur Verfügung. Es gibt auch mehr weit verwendet C / C ++ basierend Tool Ketten ; die meisten Werkzeugketten für Ada verwendet auch in Versionen kommen, die Unterstützung C und / oder C ++.

Formale Methoden wie Axiomatic Semantics (PDF), Z Notation oder Communicating Sequential Processes Programmlogik erlaubt mathematisch überprüft werden, und werden oft bei der Gestaltung von Sicherheit verwendet kritische Software, wo die Anwendung einfach genug ist, sie anzuwenden (typischerweise Kontrollsysteme eingebettet). Zum Beispiel einen meiner früheren Dozenten einen formalen Korrektheitsbeweis eines Signalisierungssystemes taten für das deutsche Eisenbahnnetz.

Der Hauptmangel der formalen Methoden ist ihre Tendenz exponentiell mit Bezug auf das zugrundeliegende System ist erwiesen, Komplexität zu wachsen. Dies bedeutet, dass es erhebliche Gefahr von Fehlern in dem Beweis, so dass sie praktisch auf ziemlich einfache Anwendungen beschränkt. Formale Methoden sind ziemlich weit für die Überprüfung Hardware Korrektheit verwendet als Hardware-Fehler sehr teuer zu beheben ist, vor allem auf Massenprodukte. Da die Pentium FDIV Bug haben formale Methoden gewonnen ziemlich viel Aufmerksamkeit und haben verwendet, um die Richtigkeit der FPU auf allen Intel-Prozessoren seit dem Pentium Pro zu überprüfen.

Viele andere Sprachen verwendet worden, um höchst zuverlässige Software zu entwickeln. Viele Forschungen zu diesem Thema durchgeführt. Man kann vernünftigerweise, dass Methodik argumentieren, ist wichtiger als die Plattform obwohl es Prinzipien wie Einfachheit und Auswahl und Kontrolle von Abhängigkeiten, die href="http://news.bbc.co.uk/2/hi/business/7605871.stm" rel="noreferrer"> schließt die Verwendung von bestimmten Plattformen .

Wie verschieden der anderen angemerkt hat, bestimmte O / S-Plattformen haben Eigenschaften Zuverlässigkeit und vorhersagbare Verhalten, wie Watchdog-Timer und garantierte Interrupt-Antwortzeiten zu fördern. Simplicity ist auch ein starker Treiber der Zuverlässigkeit und viele RT-Systeme werden immer bewusst sehr einfach und kompakt. QNX (die einzige derartige O / S, die ich mit vertraut bin, einmal mit einem Betonmischan System darauf basierenden) sehr klein ist, und auf eine Diskette passen. Aus ähnlichen Gründen die Leute, die machen OpenBSD - die für ihre robuste Sicherheit und gründliche Code Revision bekannt ist - auch gehen aus dem Weg, hält das System einfach.

EDIT: Dieser Beitrag hat einige Links zu gute Artikel über sicherheitskritische Software, insbesondere Hier und Hier . Requisiten S.Lott und Adam Davis für die Quelle. Die Geschichte der Therac-25 ist ein bisschen eine klassische Arbeit in diesem Bereich.

Andere Tipps

Für C ++, den Joint Strike Fighter (F-35) C ++ Standard-Codierung ist ein gutes Buch:

http://www.stroustrup.com/JSF-AV-rules.pdf

Ich glaube, Ada noch im Gebrauch in einigen staatlichen Projekten ist, die Sicherheit und / oder Mission kritisch. Ich habe noch nie die Sprache, aber es ist auf meiner Liste der „lernen“, zusammen mit Eiffel verwendet. Eiffel bietet Design by Contract, die angeblich Zuverlässigkeit und Sicherheit zu verbessern.

Zum einen sicherheitskritischen Software hält sich an die gleichen Prinzipien, die Sie in den klassischen Maschinenbau und Elektrotechnik Felder sehen würde. Redundanz, Fehlertoleranz und Ausfallsicherheit.

Als Nebenwirkung, und als die vorherigen Poster erwähnt (und waren aus irgendeinem Grunde nach unten gestimmt), dem wichtigsten Faktor in der Lage, dies zu erreichen, für Ihr Team ist ein Rock-solides Verständnis des alles zu haben, das ist geht. Es versteht sich, dass eine gute Software-Design auf Ihrer Seite Schlüssel. Aber es bedeutet auch, eine Sprache, die zugänglich ist, reifen, gut unterstützt, für die es viele kommunale Wissen und erfahrenen Entwicklern zur Verfügung.

Viele Plakate haben bereits kommentiert, dass das OS ein Schlüsselelement in dieser Hinsicht ist, die die meisten sehr wahr ist, weil es deterministisch sein muss (siehe QNX oder VxWorks). Dies schließt aus den meisten interpretierten Sprachen, die Dinge hinter den Kulissen für Sie tun.

ADA

ist eine Möglichkeit, aber es ist weniger Werkzeuge und Unterstützung gibt, und was noch wichtiger ist der Stern Menschen sind nicht so leicht verfügbar.

C ++ ist eine Möglichkeit, aber nur, wenn Sie genau eine Untergruppe erzwingen. In dieser Hinsicht ist es Werkzeug des Teufels, und versprach uns das Leben leichter zu machen, aber oft zu viel zu tun,

C ist ideal. Es ist sehr ausgereift, schnell, hat eine vielfältige Reihe von Tools und Support, viele erfahrene Entwickler gibt, plattformübergreifende und äußerst flexibel, kann nahe an der Hardware arbeiten.

ich entwickelt habe in der alles von smalltalk bis rubin und schätzt und alles genießen, was höhere Sprachen zu bieten haben. Aber wenn ich kritische Systementwicklung zu tun bin ich beißen die Kugel und halten mit C. Nach meiner Erfahrung (Verteidigung und viele Klasse II und III Medizinprodukte) weniger ist mehr.

ich Haskell abholen würde, wenn es die Sicherheit über alles andere. Ich schlage vor, Haskell, weil es sehr starre statische Typprüfung hat und es fördert die Programmierung, wo man Teile in einer solchen Weise zu bauen, dass sie sehr einfach zu testen.

Aber dann würde ich nicht über die Sprache viel kümmern. Sie können so viel viel mehr Sicherheit zu bekommen, ohne dabei durch insgesamt ohne Fristen in Zustand und arbeiten Ihr Projekt haben. Insgesamt als alle grundlegenden Projektmanagement an Ort und Stelle zu haben. Ich würde vielleicht auf umfangreiche Tests konzentrieren alles, um sicherzustellen, funktioniert wie es sollte, Tests, die alle Sonderfälle abdecken + mehr.

Die Sprache und O ist wichtig, aber so ist das Design. Versuchen Sie, es nackte Knochen, umwerfend einfach.

Ich würde beginnen, indem das Nötigste von Zustandsinformationen (Laufzeitdaten) haben, die Chance bekommt es im Widerspruch zu minimieren. Dann, wenn Sie zum Zweck der Fehlertoleranz haben Redundanz mögen, stellen Sie sicher, dass Sie narrensicher Möglichkeiten haben aus den Daten zu gewinnen immer inkonsistent. Redundanz ohne eine Möglichkeit von Inkonsistenz zu erholen nur Ärger bringen.

Haben Sie immer einen Rückfall für wenn angeforderten Aktionen in angemessener Zeit nicht ausfüllen. Da sie in der Flugsicherung sagen, eine unbestätigte Freiheit ist kein Spiel.

Lassen Sie sich nicht von Abfragemethoden Angst. Sie sind einfach und zuverlässig, auch wenn sie ein paar Zyklen verschwenden kann. Scheuen Verarbeitung, die ausschließlich auf Ereignisse oder Mitteilungen angewiesen, weil sie leicht fallen gelassen werden können oder vervielfältigt oder misordered. Als Ergänzung zu der Wahl, sie sind in Ordnung.

Ein Freund von mir auf der APOLLO-Projekt einmal bemerkte, dass er wusste, dass sie ernst waren immer, wenn sie beschlossen, auf Abruf vertrauen, anstatt Ereignisse, obwohl der Computer war horrend langsam.

P. S. Ich habe gerade gelesen durch die C ++ Air Vehicle Standards. Sie sind in Ordnung, aber sie scheinen anzunehmen, dass es viele Klassen, Daten, Zeiger und dynamische Speicherzuweisung sein. Das ist genau das, was es soll nicht mehr von als unbedingt notwendig. Es sollte eine Datenstruktur czar mit einem großen Sense sein.

Das Betriebssystem ist wichtiger als die Sprache. Verwenden Sie eine Echtzeit-Kernel wie VxWorks oder QNX. Wir sahen beide zur Steuerung von Industrierobotern und entschieden mit VxWorks zu gehen. Wir verwenden C für die eigentliche Robotersteuerung.

Für wirklich kritische Software, wie zB Flugzeug automatische Landung Systeme, möchten Sie mehrere Prozessoren laufen unabhängig Prüfergebnissen überqueren.

Realtime-Umgebungen haben in der Regel „sicherheitskritischen“ Anforderungen. Für diese Art der Sache, Sie unter VxWorks aussehen könnte, ein beliebtes Betriebssystem in Echtzeit. Es ist derzeit in vielen verschiedenen Arenen wie Boeing, BMW iDrive Interna, RAID-Controller und verschiedene Raumschiff. ( Check it out .)

Entwicklung für die VxWorks-Plattform kann mit mehreren Werkzeugen durchgeführt werden, darunter Eclipse-, Workbench , SCORE und andere. C, C ++, Ada und Fortran (ja, Fortran) werden unterstützt, ebenso wie einige andere.

Da Sie keine Plattform geben, würde ich C / C ++ sagen. Auf den meisten Echtzeit-Plattformen, sind Sie relativ in Optionen begrenzt sowieso.

Die Nachteile von C Tendenz lassen Sie sie schießen in dem Fuß durch die Anzahl der Werkzeuge versetzt wird, um den Code und die Stabilität und die direkte Abbildung des Codes auf die Hardware-Fähigkeiten der Plattform zu validieren. Auch für etwas kritisch, können Sie nicht auf Software von Drittanbietern verlassen, die nicht umfassend geprüft worden - sind diese die meisten Bibliotheken - auch von denen viele von Hardware-Herstellern zur Verfügung gestellt

.

Da alles in Ihrer Verantwortung sein wird, Sie wollen einen stabilen Compiler, vorhersagbares Verhalten und eine enge Zuordnung der Hardware.

Hier ein paar Updates für einige Tools, die ich noch nicht erörtert gesehen hatte, dass ich mit in letzter Zeit gespielt, die ziemlich gut sind.

Die LLVM Compiler Infrastructure , ein kurzer Satz auf ihrer Hauptseite (enthält Frontends für C und C ++. Vorne -ends für Java, Schema und andere Sprachen sind in der Entwicklung);

  

Eine Compiler-Infrastruktur - LLVM ist auch eine Sammlung von Quellcode,   implementiert die Sprache und   Kompilation Strategie. der primäre   Komponenten der LLVM Infrastruktur   sind a-GCC basierte C & C ++ Front-End, ein   Link Zeitoptimierung Rahmen mit   eine wachsende Gruppe von globalen und   interprozedurales Analysen und   Transformationen, statisch-Back-Ends für   die X86, x86-64 PowerPC 32/64, ARM,   Daumen, IA-64, Alpha, SPARC, MIPS und   CellSPU Architekturen, ein Back-End   welches emittiert tragbaren C-Code, und eine   Just-In-Time-Compiler für X86, x86-64   PowerPC 32/64 Prozessoren und ein   Emitter für MSIL.

VCC ;

  

VCC ist ein Werkzeug, Korrektheit beweist   kommentierter gleichzeitige C-Programme oder   findet in ihnen Probleme. VCC erstreckt C   mit Design by Contract Features, wie   Vor- und Nachbedingung sowie Art   Invarianten. Mit Anmerkungen versehene Programme sind   logischen Formeln übersetzt mit   das Boogie-Tool, das es geht auf   ein automatisiertes SMT-Solver Z3 zu überprüfen   ihre Gültigkeit.

VCC verwendet den kürzlich veröffentlichten Gemeinsame Compiler Infrastructure .

Diese beiden Werkzeuge, LLVM oder VCC ist so konzipiert, mehr Sprachen und Architekturen zu unterstützen, ich glaube, dass sie ein Anstieg der Codierung durch Vertrag und andere formale Verifikation Praktiken.

WPF (nicht die MS Framework :), ist ein guter Anfang, wenn Sie versuchen, einige der jüngsten Forschung und Werkzeuge im Programm Validierung Raum auszuwerten.

WG23 ist die primäre Ressource jedoch für ziemlich aktuelle und spezifische kritische Systeme Entwicklung Sprache Details . Sie decken alles von Ada, C, C ++, Java, C #, Scripting, etc ... und haben zumindest einen anständigen Satz von Referenz und Leitlinien für Richtungsinformationen auf sprachspezifische Mängel und Schwachstellen zu aktualisieren.

Es gibt viele gute Referenzen unter http://www.dwheeler.com ( "High-Sicherheit Software ").

Für Auto Sachen finden Sie in dem MISRA-C-Standard. C, aber Sie können nicht mehr als zwei Ebenen von Zeigern verwenden, und einige andere Sachen.

adahome.com hat gute Informationen über Ada. Ich mochte dieses C ++ zu Ada Tutorial: http://adahome.com/Ammo/cpp2ada.html

Für harte Echtzeit, hat Tom Hawkins einige interessante Haskell Sachen gemacht. Siehe:. VERBESSERN (Sprache enthält ein SMT-Solver Verifikationsbedingungen zu überprüfen) und Atom (EDSL für harte Echtzeit gleichzeitige Programmierung ohne tatsächliche Threads oder Tasks)

Eine Sprache, die sorgfältige Muster erlegt helfen kann, aber man kann vorsichtig Muster aufzuzwingen jede Sprache verwenden, auch Assembler. Jede Annahme über jeden Wert muss Code, der die Annahme prüft. Zum Beispiel immer Divisor testet für Null vor der Teilung.

Je mehr Sie wieder verwendbare Komponenten vertrauen, die Aufgabe, die einfacher, aber wiederverwendbare Komponenten sind für die kritischen Einsatz selten zertifiziert und werden Sie nicht durch behördliche Sicherheitsprozesse bekommen. Sie sollten einen kleinen OS-Kernel verwenden und dann winzigen Module bauen, die Einheit mit zufälliger Eingabe getestet sind. Eine Sprache wie Eiffel könnte helfen, aber es gibt keinen Königsweg.

Jedes Softwareprodukt kann die DO-178B Zertifizierung passiert jedes Werkzeug verwenden, aber die Frage ist, wie schwierig es sein würde. Wenn der Compiler nicht zertifiziert ist müssen Sie Ihren Code ist auf Baugruppenebene nachvollziehbar demonstrieren. So ist es hilfreich, dass Ihr Compiler zertifiziert ist. Wir verwenden C auf unseren Projekten, sondern hatten auf Baugruppenebene zu überprüfen und einen Code-Standard verwenden, die die Optimierer, begrenzter Stackverbrauch, begrenztes Interruptverwendungsprofil, transparente zertifizierbare Bibliotheken ausgeschaltet enthielten usw. ADA ist nicht Feenstaub, aber es macht die PSAC Plan aussehen erreichbar.

Als applicatons größer werden, Assembler-Code wird weniger gute Wahl. Der ARM-Prozessor lädt nur C ++, aber wenn Sie fragen Unternehmen wie Kiel es ihr Werkzeug ist zertifiziert, sie mit einem zurück „nicht wahr?“ Und vergessen Sie nicht, dass verificaton Werkzeuge müssen auch zertifiziert werden. Versuchen Sie, ein LabView-Testprogramm zu überprüfen.

Ich weiß nicht, welche Sprache ich verwenden würde, aber ich weiß, welche Sprache ich nicht will:

HINWEIS AUF JAVA-Unterstützung. DIE SOFTWARE KANN UNTERSTÜTZUNG FÜR PROGRAMME ENTHALTEN in Java geschrieben. JAVA-TECHNOLOGIE ist nicht fehlertolerant und ist nicht darauf ausgelegt, HERGESTELLT ODER FÜR DIE VERWENDUNG ODER RESALE AS ON-LINE STEUERANLAGEN in explosionsgefährdeten Bereichen ERFORDERLICH NOTLAUFFUNKTION PERFORMANCE BESTIMMT, WIE IM BETRIEB VON KERNKRAFTANLAGEN, FLUGZEUGEN IN KOMMUNIKATIONSSYSTEMEN, AIR VERKEHRSKONTROLLE, LEBENSERHALTUNGSSYSTEMEN ODER WAFFENSYSTEMEN, bei denen der Ausfall der Java-Technologie DIREKT ZUM TOD, PERSONENSCHÄDEN ODER SCHWEREN PHYSISCHEN ODER UMWELTSCHÄDEN FÜHREN KÖNNEN.

HAL / S für den Space Shuttle verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top