it-swarm.com.de

Welche Sprachen werden für sicherheitskritische Software verwendet?

Ich untersuche die Entwicklung sicherheitskritischer Software und insbesondere, welche Auswirkungen die Wahl der Programmiersprache auf diese Entwicklung hat.

Bitte erläutern Sie ausführlich, welche Sprachen häufig verwendet werden und warum.

167
marcumka

Für C++ ist der C++ - Kodierungsstandard von Joint Strike Fighter (F-35) eine gute Lektüre:

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

48
Andrew Medico

Ich glaube Ada wird immer noch in einigen Regierungsprojekten verwendet, die sicherheits- und/oder missionskritisch sind. Ich habe die Sprache noch nie benutzt, aber sie ist auf meiner Liste der "zu lernen", zusammen mit Eiffel. Eiffel bietet Design By Contract an, mit dem Zuverlässigkeit und Sicherheit verbessert werden sollen.

24
Thomas Owens

Erstens befolgt sicherheitskritische Software dieselben Prinzipien wie im klassischen Maschinenbau und in der Elektrotechnik. Redundanz, Fehlertoleranz und Ausfallsicherheit.

Nebenbei bemerkt und wie das vorherige Poster anspielte (und aus irgendeinem Grund herabgestimmt wurde), ist der wichtigste Faktor, um dies zu erreichen, dass Ihr Team ein grundsolides Verständnis für alles hat, was vor sich geht. Es versteht sich von selbst, dass ein gutes Software-Design Ihrerseits der Schlüssel ist. Es setzt aber auch eine Sprache voraus, die zugänglich, ausgereift und gut unterstützt ist und für die viel kommunales Wissen und erfahrene Entwickler zur Verfügung stehen.

In vielen Postern wurde bereits darauf hingewiesen, dass das Betriebssystem ein Schlüsselelement in dieser Hinsicht ist. Dies trifft vor allem deshalb zu, weil es deterministisch sein muss (siehe QNX oder VxWorks). Dies schließt die meisten interpretierten Sprachen aus, die Dinge hinter den Kulissen für Sie tun.

ADA ist eine Möglichkeit, aber es gibt weniger Tools und Support, und was noch wichtiger ist, die hervorragenden Leute sind nicht so schnell verfügbar.

C++ ist eine Möglichkeit, aber nur, wenn Sie eine Teilmenge streng erzwingen. In dieser Hinsicht ist es das Werkzeug des Teufels, das verspricht, unser Leben leichter zu machen, aber oft zu viel tut.

C ist ideal. Es ist sehr ausgereift, schnell, verfügt über ein breites Spektrum an Tools und Support, viele erfahrene Entwickler, plattformübergreifend und äußerst flexibel, können in der Nähe der Hardware arbeiten.

Ich habe mich in allem von Smalltalk zu Ruby) entwickelt und schätze und genieße alles, was höhere Sprachen zu bieten haben Meine Erfahrung (Verteidigung und viele Medizinprodukte der Klassen II und III) ist weniger mehr.

16
Shaun

Ich würde haskell abholen, wenn es die Sicherheit über alles andere ist. Ich schlage haskell vor, weil es eine sehr strenge statische Typprüfung hat und die Programmierung fördert, bei der Sie Teile so bauen, dass sie sehr einfach zu testen sind.

Aber dann würde mir die Sprache nicht viel ausmachen. Sie können viel mehr Sicherheit erreichen, ohne Kompromisse eingehen zu müssen, indem Sie Ihr Projekt insgesamt in gutem Zustand halten und ohne Fristen arbeiten. Alles in allem, als ob das gesamte grundlegende Projektmanagement vorhanden wäre. Ich würde mich vielleicht auf umfangreiche Tests konzentrieren, um sicherzustellen, dass alles so funktioniert, wie es sollte, Tests, die alle Eckfälle abdecken.

13
Cheery

Die Sprache und das Betriebssystem sind wichtig, aber auch das Design. Versuchen Sie, es einfach zu halten.

Ich würde mit einem Minimum an Statusinformationen (Laufzeitdaten) beginnen, um die Wahrscheinlichkeit zu minimieren, dass diese inkonsistent werden. Wenn Sie dann aus Gründen der Fehlertoleranz Redundanz wünschen, müssen Sie über kinderleichte Möglichkeiten verfügen, um Daten wiederherzustellen, die inkonsistent werden. Redundanz ohne die Möglichkeit, sich von Inkonsistenzen zu erholen, fordert nur Ärger.

Verwenden Sie immer einen Fallback, wenn die angeforderten Aktionen nicht in angemessener Zeit ausgeführt werden. Wie es in der Flugsicherung heißt, ist eine unbestätigte Freigabe keine Freigabe.

Hab keine Angst vor Wahlmethoden. Sie sind einfach und zuverlässig, auch wenn sie einige Zyklen verschwenden können. Scheuen Sie sich vor einer Verarbeitung, die ausschließlich auf Ereignissen oder Benachrichtigungen beruht, da diese leicht gelöscht, dupliziert oder fehlgeordnet werden können. Als Ergänzung zur Umfrage geht es ihnen gut.

Ein Freund von mir im APOLLO-Projekt bemerkte einmal, dass er wusste, dass sie es ernst meinten, als sie beschlossen, sich auf Abstimmungen und nicht auf Ereignisse zu verlassen, obwohl der Computer schrecklich langsam war.

P.S. Ich habe gerade die C++ Air Vehicle-Standards durchgelesen. Sie sind in Ordnung, gehen jedoch davon aus, dass es viele Klassen, Daten, Zeiger und dynamische Speicherzuordnungen geben wird. Genau davon sollte es nicht mehr als unbedingt nötig geben. Es sollte einen Datenstrukturzaren mit einer großen Sense geben.

12
Mike Dunlavey

Das Betriebssystem ist wichtiger als die Sprache. Verwenden Sie einen Echtzeitkernel wie VxWorks oder QNX. Wir haben uns beide für die Steuerung von Industrierobotern angesehen und uns für VxWorks entschieden. Wir verwenden C für die eigentliche Robotersteuerung.

Bei wirklich kritischer Software, wie z. B. Flugzeug-Autoland-Systemen, möchten Sie, dass mehrere Prozessoren unabhängig voneinander ausgeführt werden, um die Ergebnisse zu überprüfen.

10
Jim C

In Echtzeitumgebungen gelten normalerweise "sicherheitskritische" Anforderungen. Für solche Dinge können Sie sich VxWorks ansehen, ein beliebtes Echtzeit-Betriebssystem. Es wird derzeit in vielen verschiedenen Bereichen wie Boeing-Flugzeugen, BMW iDrive-Einbauten, RAID-Controllern und verschiedenen Raumschiffen eingesetzt. ( Check it out .)

Die Entwicklung für die VxWorks-Plattform kann mit verschiedenen Tools erfolgen, darunter Eclipse , Workbench , SCORE , und andere. C, C++, Ada und Fortran (ja, Fortran) werden ebenso unterstützt wie einige andere.

7
Alan

Hier sind ein paar Updates für einige Tools, die ich noch nicht besprochen habe und mit denen ich in letzter Zeit gespielt habe. Diese sind ziemlich gut.

The LLVM Compiler Infrastructure , ein kurzer Text auf der Hauptseite (enthält Frontends für C und C++. Frontends für Java, Scheme und andere Sprachen sind in Entwicklung);

Eine Compiler-Infrastruktur - LLVM ist auch eine Sammlung von Quellcode, die die Sprache und die Kompilierungsstrategie implementiert. Die Hauptkomponenten der LLVM-Infrastruktur sind ein GCC-basiertes C & C++ - Front-End, ein Framework zur Link-Time-Optimierung mit einer wachsenden Anzahl globaler und interproceduraler Analysen und Transformationen sowie statische Back-Ends für X86, X86-64 und PowerPC 32/64-, ARM-, Thumb-, IA-64-, Alpha-, SPARC-, MIPS- und CellSPU-Architekturen, ein Back-End, das portablen C-Code ausgibt, und ein Just-In-Time-Compiler für X86, X86-64, PowerPC 32/64 Prozessoren und ein Emitter für MSIL.

VCC ;

VCC ist ein Tool, das die Korrektheit von mit Anmerkungen versehenen gleichzeitigen C-Programmen beweist oder Probleme darin findet. VCC erweitert C um Vertragsmerkmale wie Vor- und Nachbedingungen sowie Typinvarianten. Mit Annotationen versehene Programme werden mit dem Boogie-Tool in logische Formeln übersetzt und an einen automatisierten SMT-Solver Z3 übergeben, um ihre Gültigkeit zu überprüfen.

VCC verwendet die kürzlich veröffentlichte Common Compiler Infrastructure .

Beide Tools, LLVM oder VCC, wurden für die Unterstützung mehrerer Sprachen und Architekturen entwickelt. Ich bin der Meinung, dass die vertragliche Kodierung und andere formale Überprüfungspraktiken zunehmen.

WPF (nicht das MS-Framework :), ist ein guter Ausgangspunkt, wenn Sie versuchen, einige der neuesten Forschungsergebnisse und Tools in der Programmvalidierung zu bewerten Platz.

WG2 ist jedoch die primäre Ressource für relativ aktuelle und spezifische Details der Entwicklungssprache kritischer Systeme . Sie decken alles ab, von Ada, C, C++, Java, C #, Scripting usw., und verfügen zumindest über eine Reihe von Verweisen und Anleitungen, um Informationen zu sprachspezifischen Fehlern und Schwachstellen zu aktualisieren.

6

Da Sie keine Plattform angeben, muss ich C/C++ sagen. Auf den meisten Echtzeitplattformen sind die Optionen ohnehin relativ begrenzt.

Die Nachteile der Tendenz von C, sich in den Fuß schießen zu lassen, werden durch die Anzahl der Tools zum Überprüfen des Codes sowie die Stabilität und direkte Zuordnung des Codes zu den Hardware-Funktionen der Plattform ausgeglichen. Außerdem können Sie sich bei kritischen Problemen nicht auf Software von Drittanbietern verlassen, die nicht ausführlich geprüft wurde. Dies gilt auch für die meisten Bibliotheken, selbst für viele von Hardwareanbietern.

Da alles in Ihrer Verantwortung liegt, möchten Sie einen stabilen Compiler, vorhersehbares Verhalten und eine enge Zuordnung zur Hardware.

6
Cade Roux

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

Informationen zum Thema Auto finden Sie in der MISRA C-Norm. C, aber Sie können nicht mehr als zwei Ebenen von Zeigern und so etwas verwenden.

adahome.com hat gute Infos zu Ada. Ich mochte dieses Tutorial von C++ zu Ada: http://adahome.com/Ammo/cpp2ada.html

Für harte Echtzeit hat Tom Hawkins einige interessante Haskell-Sachen gemacht. Siehe: ImProve (Sprache enthält einen SMT-Solver zum Überprüfen der Überprüfungsbedingungen) und Atom (EDSL für zeitnahe Echtzeitprogrammierung ohne Verwendung von tatsächlichen Threads oder Tasks).

5
solrize

Ein neuer sicherheitskritischer Standard für Java befindet sich derzeit in der Entwicklung - JSR 302: Safety Critical Java) Technologie .

Das sicherheitskritische Java (SCJ) basiert auf einer Teilmenge von RTSJ. Ziel ist ein Framework, das für die Entwicklung und Analyse sicherheitskritischer Programme zur sicherheitskritischen Zertifizierung geeignet ist (DO-178B, Level A und andere sicherheitskritische Standards).

SCJ entfernt beispielsweise den Heap, der in RTSJ noch vorhanden ist, und definiert außerdem drei Konformitätsstufen, denen sowohl die Anwendung als auch VM Implementierung entsprechen können. Die Konformitätsstufen werden definiert, um die Zertifizierung verschiedener komplexer Komponenten zu vereinfachen anwendungen.

Ressourcen :

4
Aleš

Jedes Softwareprodukt kann den DO-178b-Zertifizierungsprozess mit einem beliebigen Tool bestehen. Die Frage ist jedoch, wie schwierig dies wäre. Wenn der Compiler nicht zertifiziert ist, müssen Sie möglicherweise nachweisen, dass Ihr Code auf Assembly-Ebene nachvollziehbar ist. Daher ist es hilfreich, dass Ihr Compiler zertifiziert ist. Wir haben C in unseren Projekten verwendet, mussten dies jedoch auf Assembly-Ebene überprüfen und einen Codestandard verwenden, der das Ausschalten des Optimierers, die eingeschränkte Stapelverwendung, die eingeschränkte Verwendung von Interrupts, transparente zertifizierbare Bibliotheken usw. umfasste PSAC-Plan sieht erreichbarer aus.

Wenn die Anwendungen größer werden, wird der Assembler-Code weniger brauchbar. Der ARM Prozessor lädt nur C++ ein, aber wenn Sie Unternehmen wie Kiel fragen, ob ihr Tool zertifiziert ist, werden sie mit einem "huh?" Zurückkehren Versuchen Sie, ein LabView-Testprogramm zu verifizieren.

4
Randy Hoffman

Eine Sprache, die vorsichtige Muster auferlegt, kann hilfreich sein, aber Sie können vorsichtige Muster mit jeder Sprache auferlegen, auch mit Assembler. Jede Annahme über jeden Wert benötigt Code, der die Annahme testet. Testen Sie den Divisor beispielsweise immer auf Null, bevor Sie dividieren.

Je mehr Sie auf wiederverwendbare Komponenten vertrauen können, desto einfacher gestaltet sich die Aufgabe. Wiederverwendbare Komponenten sind jedoch nur selten für den kritischen Einsatz zertifiziert und führen Sie nicht durch gesetzliche Sicherheitsverfahren. Sie sollten einen winzigen Betriebssystemkernel verwenden und dann winzige Module erstellen, die mit zufälliger Eingabe Unit-getestet werden. Eine Sprache wie Eiffel mag helfen, aber es gibt keine Silberkugel.

4
dongilmore

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

3
TraumaPony