sobre - ¿Cómo es Ada un lenguaje ''crítico para la seguridad''?
american with disabilities act definition (5)
Intenté googlear y leí algunos fragmentos en línea. ¿Por qué Ada es un lenguaje "crítico para la seguridad"? Algunas cosas que noto son
- Sin punteros
- Especifique un rango (este tipo es un entero pero solo puede ser 1-12)
- Indique explícitamente si un parámetro de función está fuera o dentro / fuera
- Bucles basados en rango (para evitar errores de límite o verificación de límite)
El resto de la sintaxis no entendí o no entendí cómo ayuda a ser "crítico para la seguridad". Estos son algunos puntos pero no veo el panorama completo. ¿Tiene un diseño por contrato que no estoy viendo? ¿Tiene reglas que dificultan la compilación del código (y si es así, cuáles son algunas)? ¿Por qué es un lenguaje "crítico para la seguridad"?
Ada tiene un soporte superior para http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-1-3-4.html tiempo real. Esto permite al programador implementar un mayor grado de determinismo en lugar de preocuparse por los detalles técnicos del lenguaje de programación en sí. Si bien muchas de las funciones de tiempo de ejecución admitidas por Ada se pueden lograr en C con una comprensión profunda de las cosas, Ada logra la mayoría de las funciones en tiempo real muy bien ya que está estandarizada. Ada incluso tiene un perfil de Ravenscar http://en.wikipedia.org/wiki/Ravenscar_profile y SPARK un lenguaje de computadora donde "un funcionamiento altamente confiable es esencial" se basa en un subconjunto de Ada 83 y 95 http://en.wikipedia.org/wiki/SPARK_%28programming_language%29 . Supongo que SPARK no tiene una versión para las versiones posteriores de Ada b / c; es demasiado pronto para saber qué tan seguras son realmente las versiones más nuevas. También se menciona en el último artículo que Ada se puede optimizar para velocidades que compiten con C, lo que sería importante para las aplicaciones en tiempo real que dependían de un control preciso durante eventos que cambian rápidamente. Hay muchas características estándar incorporadas para el control en tiempo real que obviamente son importantes para un lenguaje "crítico para la seguridad".
AdaCore tiene una buena presentación de varias características de seguridad de Ada 2005 aquí:
http://www.adacore.com/knowledge/technical-papers/safe-secure/
El gobierno y la industria de los EE. UU. También realizaron estudios sobre la confiabilidad del programa hace mucho tiempo que comparaban los idiomas. No pude encontrar uno muy rápidamente, ya que todos los sitios son antiguos (!), Pero aquí hay una cita del sitio web de DDCI: "En los estudios realizados durante la década de los ochenta, Ada superó sistemáticamente los lenguajes de programación establecidos como Pascal, Fortran y C. En los noventa "Ada continúa superando a C ++ en las evaluaciones de rendimiento que miden la capacidad, eficiencia, mantenimiento, riesgo y costo del ciclo de vida".
Enumera las razones por las que lo usaron en el proyecto Commanche en el enlace de abajo. Añadiré que las implementaciones de la plataforma han existido durante mucho tiempo y se han mantenido estables. Como dijo una fuente en un artículo, el mantenimiento es donde entra la mayoría de los costos. Hemos visto a los contendientes modernos .NET y Java cambiar como locos. La estabilidad a largo plazo de Ada es mejor para las aplicaciones críticas para la seguridad que a menudo se presentan durante largos períodos (a veces décadas).
http://www.ddci.com/displayNews.php?fn=programs_rah66.php
Otro beneficio es que Ada fue diseñado para el desarrollo en varios idiomas. Sigo viendo en las noticias que la gente habla de cómo .NET y JVM son innovadores porque le permiten mezclar las "herramientas adecuadas para el trabajo" en un solo sistema. Ada tuvo esa habilidad durante mucho tiempo. Es común que las aplicaciones sean una mezcla de Ada, C, C ++, ensamblador, etc. (MULTOS CA viene a la mente). Y aún funcionan bien.
Tampoco ha sido estático. Siguen actualizando el idioma, más recientemente en 2012. Su portabilidad permitió que se ejecutara tanto en JVM como en .NET también para las personas que desean las bibliotecas o tienen un código existente en ellas. También hay herramientas de desarrollo de Ada y tiempos de ejecución robustos para muchos sistemas operativos y RTOS de IBM, Aonix, AdaCore y Green Hills.
Último beneficio: si se compila, funcionará. Generalmente.
Bueno, esto es bastante simple. La razón por la que hay una gran cantidad de Adta Sytax que no parece tener nada que ver con hacer que el lenguaje sea "crítico para la seguridad" (lo que sea que signifique para un idioma) es que no era el objetivo de diseño de Ada. Fue diseñado para ser un lenguaje de programación compilado de propósito general, con la capacidad suficiente para que el Departamento de Defensa de los EE. UU. Pueda deshacerse de todos sus pequeños lenguajes de un solo uso que tiene que admitir en todas partes.
El hecho de que el resultado final sea un lenguaje que es bastante útil para aplicaciones críticas para la seguridad fue solo un feliz efecto secundario del hecho de que el lenguaje estaba muy bien diseñado con aplicaciones militares (donde las vidas a menudo se basan en la confiabilidad del software) en mente.
Sorprendentemente, pocos otros idiomas modernos tenían soporte para construir software confiable como objetivo de diseño. La mayoría parece estar cocinada por un hacker "genio" solitario, cuyo objetivo principal es la capacidad de facilitar el arranque de código rápidamente, tal vez de alguna manera nueva que el hacker favorece.
Sé que esto es tarde, pero es un ejemplo que encontré recientemente. Escribí la siguiente función de C ++ que funcionó bien en -O0
:
size_t get_index(const Monomial & t, const Monomial & u) {
get_index(t, u.log()); // forgot to type "return" first...
}
En realidad, esto se compila, y si bien puede emitir una advertencia si tiene la suerte de tener un compilador decente, no es probable que lo vea cuando se trata de uno de los muchos programas que se compilan. Milagrosamente, funcionó bien cuando lo compilé con -O0
. Pero cuando lo compilé en -O3
se estrelló cada vez, y por mi vida no pude averiguar por qué, porque no vi la advertencia (si es que apareció). Imagínese depurando eso cuando piense que imagina un return
allí simplemente porque conoce su intención.
De la misma manera, cuando estaba aprendiendo, frecuentemente, CI cometía este error:
int a;
scanf("%d", a); /* left out & before the a */
El uso de int
para punteros y viceversa se considera una práctica de programación normal en C, tanto que los compiladores hace 25 años ni siquiera se molestaron en emitir una advertencia. Heck, esa era una característica de C, no un error . (Vea, por ejemplo, Brian Kernaghan en "¿Por qué Pascal no es mi idioma favorito?") Y, por supuesto, en aquel entonces, los sistemas operativos de computadoras en casa no tenían protección de memoria; si tuvo suerte, la computadora no estaba escribiendo en el disco duro cuando se reinició.
Este tipo de errores ni siquiera se compilarán en Ada. Las funciones tienen que devolver un valor, y no puede usar accidentalmente un Integer
en lugar de un access Integer
(es decir, un puntero a entero).
¡Y eso es sólo el comienzo!
Todos estos son buenos para aplicaciones críticas para la seguridad; pero considere también la capacidad de asignar un diseño (hasta los bits) y la capacidad de [opcionalmente] especificar que tal registro SOLAMENTE esté en una ubicación determinada (útil para cosas como asignaciones de memoria de video).
Tenga en cuenta que muchas aplicaciones críticas para la seguridad también carecen de interfaces estándar (en los sentidos, tanto de interfaces de "amplia difusión" como de comparabilidad hacia adelante); Ejemplo: reactores nucleares, motores de cohetes (la ingeniería misma difiere de generación a generación *), modelos de aeronaves.
La próxima norma Ada 2012 TIENE contratos reales, en forma de condiciones previas y posteriores; Ejemplo (tomado de http://www2.adacore.com/wp-content/uploads/2006/03/Ada2012_Rational_Introducion.pdf ):
generic
type Item is private;
package Stacks is
type Stack is private;
function Is_Empty(S: Stack) return Boolean;
function Is_Full(S: Stack) return Boolean;
procedure Push(S: in out Stack; X: in Item)
with
Pre => not Is_Full(S),
Post => not Is_Empty(S);
procedure Pop(S: in out Stack; X: out Item)
with
Pre => not Is_Empty(S),
Post => not Is_Full(S);
Stack_Error: exception;
private
-- Private portion.
end Stacks;
Además, otra cosa que se pasa por alto, es la posibilidad de excluir Null
de sus tipos de puntero / Access
; esto es útil porque puede a) especificar esa exclusión en los parámetros de su subprograma, yb) simplificar su algoritmo [ya que no tiene que verificar el valor nulo en cada instancia de uso], yc) permitir su excepción manejador maneja la circunstancia excepcional (supongo) de un Null
.
* The Arianne 5 disaster occurred precisely because the management disregarded this fact and had the programmers use the incorrect specifications: that of the Arianne 4.