170 votes

Quelles langues sont utilisées pour les logiciels critiques pour la sécurité ?

Je fais des recherches sur le développement de logiciels critiques pour la sécurité, et en particulier sur les effets du choix du langage de programmation sur un tel développement.

Veuillez expliquer en détail quelles langues sont couramment utilisées et pourquoi.

410voto

Ada et SPARK (qui est un Ada dialecte avec quelques crochets pour statique de vérification) sont utilisés dans l'aéronautique, des cercles pour la construction de haute fiabilité des logiciels tels que les systèmes avioniques. Il y a quelque chose d'un écosystème de code de vérification de l'outillage pour ces langues, bien que cette technologie existe aussi pour les plus traditionnels des langues.

Erlang a été conçu à partir du sol pour l'écriture à haute fiabilité code des télécommunications. Il est conçu pour faciliter la séparation de préoccupations pour le recouvrement d'erreur (c'est à dire le sous-système de génération de l'erreur est différente de la sous-système qui gère l'erreur). Il peut également être soumis à des preuves formelles, bien que cette fonctionnalité n'a pas vraiment déplacé loin du milieu de la recherche.

Les langages fonctionnels comme Haskell peut être soumis à des preuves formelles par des systèmes automatisés en raison de la nature déclarative de la langue. Ce code permet à des effets secondaires à être contenues dans monadique fonctions. Pour une exactitude formelle, la preuve le reste du code ne peut être assumé de ne rien faire, mais ce qui est spécifié.

Cependant, ces langues sont des ordures et la collecte des ordures est transparent pour le code, il ne peut donc pas être motivé à propos de cette manière. Les ordures collectées langues ne sont normalement pas suffisamment prévisible pour des applications temps-réel dur, bien qu'il y est un organisme de recherche en cours dans le temps délimité différentiels ramasseurs d'ordures.

Eiffel et ses descendants ont un support intégré pour une technique appelée la Conception Par Contrat qui fournit un solide mécanisme d'exécution pour l'intégration des pré - et post - vérifie les invariants. Alors que Eiffel n'a jamais vraiment pris, le développement de haute fiabilité logiciel a tendance à se composent de tirer des chèques et des gestionnaires pour des modes de défaillance, avant de avant de en train d'écrire la fonctionnalité.

Bien que le C et le C++ n'ont pas été spécifiquement conçus pour ce type d'application, ils sont largement utilisés pour les systèmes embarqués et logiciels critiques, pour plusieurs raisons. Les principales propriétés de la note de contrôle sur la gestion de la mémoire (ce qui permet de vous éviter d'avoir à collecter les ordures, par exemple), simple, bien débuggé d'exécution de base des bibliothèques et de la maturité de l'outil de support. Beaucoup de intégré à l'outil de développement des chaînes en usage aujourd'hui ont d'abord été développés dans les années 1980 et 1990, lorsqu'il s'agissait de la technologie actuelle et à venir de la culture Unix qui a été répandue à l'époque, de sorte que ces outils restent populaires pour ce genre de travail.

Alors que manuel de gestion de la mémoire code doit être soigneusement vérifié pour éviter des erreurs, il autorise un certain degré de contrôle sur l'application des temps de réponse qui n'est pas disponible avec les langues qui dépendent de la collecte des ordures. Le coeur des bibliothèques des langages C et C++ sont relativement simples, mature et bien entendu, de sorte qu'ils sont parmi les plus stables des plates-formes disponibles. La plupart, si pas tous les outils d'analyse statique utilisé pour Ada également soutenir le C et le C++, et il existe de nombreux autres outils disponibles pour les C de. Il y a également plusieurs largement utilisé C/C++ en fonction de l'outil de chaînes; la plupart des chaînes d'outils utilisés pour Ada viennent également dans des versions qui prennent en charge C et/ou C++.

Méthodes formelles telles que la Sémantique Axiomatique (PDF), Z Notation ou de Communiquer des Processus Séquentiels permettent au programme de la logique mathématiquement vérifié, et sont souvent utilisés dans la conception de la sécurité des logiciels critiques où l'application est assez simple à appliquer (généralement intégrés des systèmes de contrôle). Par exemple, un de mes anciens professeurs n'formelle de la preuve de correction d'un système de signalisation pour les chemins de fer allemands réseau.

Le principal inconvénient des méthodes formelles est leur tendance à croître de façon exponentielle dans la complexité du système sous-jacent d'être prouvé. Cela signifie qu'il existe un risque important d'erreurs dans la preuve, de sorte qu'ils sont pratiquement limitées à assez simples applications. Les méthodes formelles sont très largement utilisés pour la vérification du matériel, l'exactitude matérielle des bugs sont très coûteuses à réparer, en particulier sur des produits de masse. Depuis le Pentium FDIV bug, méthodes formelles ont gagné beaucoup d'attention, et ont été utilisés pour vérifier l'exactitude de la FPU sur tous les processeurs Intel depuis le Pentium Pro.

De nombreuses autres langues ont été utilisées pour développer très fiable logiciel. Beaucoup de recherches ont été faites sur le sujet. On peut raisonnablement faire valoir que la méthodologie est plus important que la plate-forme même si il y a des principes tels que la simplicité et la sélection et le contrôle des dépendances qui pourrait empêcher l'utilisation de certaines plates-formes.

Comme plusieurs autres l'ont mentionné, certains O/S plates-formes ont des caractéristiques afin de promouvoir la fiabilité et les comportements prévisibles, telles que les timers de chiens de garde et de la garantie interruption de temps de réponse. La simplicité est également un grand facteur de fiabilité, et de nombreux RT systèmes sont volontairement très simple et compact. QNX (le seul O/S, que je connais bien, ayant déjà travaillé avec un béton système basé sur lui) est très petite, et tient sur une seule disquette. Pour des raisons similaires, les gens qui font OpenBSD - qui est connu pour sa sécurité robuste et approfondie de l'audit de code - aussi sortir de leur façon de garder un système simple.

EDIT: Cette publication a quelques liens vers de bons articles à propos de la sécurité des logiciels critiques, notamment Ici et Ici. Accessoires de S. Lott et Adam Davis pour la source. L'histoire de la THERAC-25 est un peu un classique dans ce domaine.

51voto

Andrew Medico Points 11338

Pour C ++, la norme de codage C ++ de l'avion de combat interarmées (F-35) est une bonne lecture:

http://www.research.att.com/~bs/JSF-AV-rules.pdf

24voto

Thomas Owens Points 45042

Je crois qu'Ada est encore utilisé dans certains projets gouvernementaux qui sont essentiels à la sécurité et / ou à la mission. Je n'ai jamais utilisé la langue, mais c'est sur ma liste de "apprendre", avec Eiffel. Eiffel propose Design By Contract, censé améliorer la fiabilité et la sécurité.

17voto

Shaun Points 121

Tout d'abord, la sécurité des logiciels critiques adhère aux mêmes principes que vous pouvez voir dans la classique d'ingénierie mécanique et électrique des champs. La redondance, la tolérance aux pannes et de l'échec de la sécurité.

En aparté, et comme le commentaire précédent fait allusion (et c'était pour une raison quelconque le bas-voté), le facteur le plus important d'être en mesure d'y parvenir est de votre équipe à avoir une solide compréhension de tout ce qui se passe. Il va sans dire qu'un bon logiciel de conception de votre part est la clé. Mais il implique aussi une langue qui leur est accessible, mature, bien pris en charge, pour lesquels il y a beaucoup commun de connaissances et de développeurs expérimentés disponibles.

De nombreuses affiches ont déjà remarqué que le système d'exploitation est un élément clé à cet égard, ce qui est très vrai plus, car il doit être déterministe (voir QNX ou VxWorks). Cela exclut la plupart des langages interprétés que de faire les choses dans les coulisses pour vous.

ADA est une possibilité, mais il y a moins d'outils et de soutien, et plus important encore, la stellaire des gens ne sont pas aussi facilement disponibles.

C++ est une possibilité, mais seulement si vous appliquer strictement un sous-ensemble. À cet égard, il est l'instrument du diable, en promettant de rendre notre vie plus facile, mais souvent d'en faire trop

C est l'idéal. Il est très mature, rapide, possède un ensemble varié d'outils et de soutien, beaucoup de développeurs expérimentés là-bas, de la croix-plate-forme, et extrêmement flexible, permet de travailler à proximité du matériel.

J'ai développé dans tout, de la causerie de ruby et de l'apprécier et de profiter de tout ce que la hausse de la langues ont à offrir. Mais quand je fais des systèmes critiques de développement, j'mordre la balle et bâton avec C. Dans mon expérience (de la défense et beaucoup de classe II et III des dispositifs médicaux) moins est plus.

13voto

Cheery Points 6696

Je prendrais haskell si c'est la sécurité sur tout le reste. Je propose haskell, car il a très rigide vérifier le type statique et il favorise la programmation où vous construire des pièces d'une manière telle qu'ils sont très faciles à tester.

Mais ensuite, je ne se soucient pas de la langue de beaucoup. Vous pouvez obtenir beaucoup plus de la sécurité sans pour autant compromettre en ayant votre projet dans l'ensemble de l'état et le fonctionnement sans délais. Dans l'ensemble, en ayant tous la base de gestion de projet en place. J'avais peut-être se concentrer sur des tests approfondis pour s'assurer que tout fonctionne comme elle le devrait, les tests de couvrir tous les cas de coin + plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X