Ada如何成为“安全关键”语言?

时间:2011-10-18 23:13:28

标签: ada

我尝试使用Google搜索并在线阅读一些代码段。为什么Ada是一种“安全关键”语言?我注意到的一些事情是

  • 无指针
  • 指定范围(此类型为整数但只能为1-12)
  • 明确说明函数参数是否为out或in / out
  • 基于范围的循环(避免绑定错误或绑定检查)

其余的语法我要么不理解,要么没有看到它如何帮助它成为'安全关键'。这些是一些观点,但我看不出大局。它是否具有我没有看到的合同设计?它是否有规则使代码编译更加困难(如果有的话,那么它们是什么?)为什么它是一种“安全关键”语言?

5 个答案:

答案 0 :(得分:15)

嗯,这很简单。之所以有很多Ada sytax似乎与使语言“安全至关重要”(无论对语言意味着什么)有什么关系,这不是Ada的设计目标。它被设计成一个通用的编译系统的编程语言,足以使美国国防部能够摆脱它必须支持的所有小的一次性语言。

最终结果是一种对安全关键应用程序非常有用的语言这一事实​​只是一个令人愉快的副作用,因为语言设计得很好与军事应用程序(其中生活通常都会考虑到软件的可靠性。

令人惊讶的是,很少有其他现代语言支持构建可靠的软件作为设计目标。大多数似乎是由一个孤独的“天才”黑客和主人制作的目标是能够以一种黑客偏爱的新方式快速推出大量代码。

答案 1 :(得分:13)

所有这些都有利于安全关键应用;但也要考虑分配布局(下至位)的能力以及[可选]指定此类记录只能位于某个位置的能力(对于视频内存映射等内容非常有用)。

考虑到许多安全关键应用程序也没有标准(在“广泛传播”和前向可比性)接口中;例如:核反应堆,火箭发动机(工程本身不同代*),飞机模型。

即将到来的Ada 2012标准DOES具有实际合同,以前后条件的形式;示例(取自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;

此外,另一件可以掩盖的事情是能够从Null /指针类型中排除Access;这很有用,因为你可以a)在你的子程序参数中指定排除,和b)简化你的算法[因为你不必在每个使用实例检查null],以及c)让你的例外处理程序处理(我假设)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.

答案 2 :(得分:9)

AdaCore在这里很好地介绍了Ada 2005的各种安全功能:

http://www.adacore.com/knowledge/technical-papers/safe-secure/

美国政府和行业很久以前就对程序可靠性进行了研究,比较了语言。我很快找不到一个,因为这些网站都很旧(!)但这里引用了DDCI的网站:“在八十年代进行的研究中,Ada一直表现优于Pascal,Fortran和C等既定的编程语言。九十年代,Ada在性能评估方面继续超越C ++,测量能力,效率,维护,风险和生命周期成本。“

列出他们在下面的链接中使用Commanche项目的原因。我将补充说,平台实施已经存在了很长时间并保持稳定。就像文章中的消息来源所说,维护是大部分成本的来源。我们已经看到现代竞争者.NET和Java变得疯狂。 Ada的长期稳定性对于安全性至关重要的应用程序更好,这些应用程序通常会长期(有时几十年)进行部署。

http://www.ddci.com/displayNews.php?fn=programs_rah66.php

另一个好处是Ada专为跨语言开发而设计。我一直在新闻中看到人们谈论.NET和JVM是如何创新的b / c他们让你把“正确的工具”混合到一个系统中。 Ada拥有时间的能力。应用程序混合使用Ada,C,C ++,汇编程序等是很常见的。(想到MULTOS CA)。它们仍能正常运行。

它也不是一成不变的。他们不断更新语言,最近一次是在2012年。它的可移植性允许它在JVM和.NET上运行,对于那些想要这些库的人来说,或者拥有大量现有代码。还有来自IBM,Aonix,AdaCore和Green Hills的许多操作系统和RTOS的Ada开发工具和强大的运行时。

最后的好处:如果它会编译,它将起作用。通常。

答案 3 :(得分:3)

我知道这已经很晚了,但这是我最近遇到的一个例子。我编写了以下C ++函数,该函数在-O0中运行良好:

size_t get_index(const Monomial & t, const Monomial & u) {
    get_index(t, u.log()); // forgot to type "return" first...
}

这实际上是编译的,虽然如果你有幸拥有一个像样的编译器它可能会发出警告,但是当你编译很多程序时,你不太可能看到它。奇迹般地,当我使用-O0编译它时它运行得很好。但是当我在-O3编译时,它每次都会崩溃,而对于我的生活,我无法弄明白为什么,因为我没有看到警告(如果它甚至出现)。想象一下当您认为想象return只是因为您了解自己的意图时,调试它。

同样,回到我学习C的时候,我经常犯这个错误:

int a;
scanf("%d", a); /* left out & before the a */

使用int作为指针,反之亦然被认为是C语言中的常规编程实践,以至于25年前的编译器甚至懒得发出警告。哎呀,那是C的功能,而不是 bug 。 (例如,请参阅Brian Kernaghan的“为什么Pascal不是我最喜欢的语言。”)当然,当时的家用电脑操作系统没有内存保护功能。如果你很幸运,计算机在重置时没有写入硬盘。

这些错误甚至不会在Ada中编译。函数来返回一个值,不能意外地使用Integer代替access Integer(即指向整数的指针)。< / p>

这只是一个开始!

答案 4 :(得分:2)

Ada对实时http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-1-3-4.html有更好的支持。这允许程序员实现更大程度的确定性,而不是担心编程语言本身的技术细节。虽然Ada支持的许多运行时功能都可以通过对事物的深入理解在C中实现,但Ada实现了大多数实时功能,因为它是标准化的。 Ada甚至拥有Ravenscar简介http://en.wikipedia.org/wiki/Ravenscar_profile而SPARK则是一种计算机语言,其中“高度可靠的操作至关重要”基于Ada 83和95 http://en.wikipedia.org/wiki/SPARK_%28programming_language%29的子集。我的猜测是SPARK没有适用于以后的Ada版本的版本b / c现在判断新版本的安全性还为时尚早。在后一篇文章中还提到,Ada可以针对与C相媲美的速度进行优化,这对于在快速变化的事件期间依赖精确控制的实时应用程序非常重要。实时控制有许多内置的标准功能,这对于“安全关键”语言显然很重要。