一个新的 的 Java的安全关键标准 强> 目前正在开发中 - JSR 302:安全关键Java技术 。
该 的 安全关键Java 强> (SCJ)基于RTSJ的子集。目标是建立一个适合开发和分析安全关键认证(DO-178B,A级和其他安全关键标准)的安全关键程序的框架。
例如,SCJ删除仍然存在于RTSJ中的堆,它还定义了应用程序和VM实现可能符合的3个合规级别,合规级别被定义为简化各种复杂应用程序的认证。
的 资源 强> :
实时环境通常具有“安全关键”要求。对于那种事情,你可以看一下 VxWorks的 ,一种流行的实时操作系统。它目前在许多不同的领域使用,如波音飞机,宝马iDrive内部,RAID控制器和各种航天器。 ( 看看这个 。)
VxWorks平台的开发可以通过其中的几个工具完成 日食 , 工作台 , 得分了 , 和别的。支持C,C ++,Ada和Fortran(是的,Fortran)以及其他一些。
强加模式的语言可能会有所帮助,但您可以使用任何语言(甚至汇编程序)强加细致的模式。关于每个值的每个假设都需要用于测试假设的代码。例如,在除法之前始终将除数测试为零。
您可以信任的可重用组件越多,任务就越容易,但可重用组件很少被认证用于关键用途,并且无法帮助您完成监管安全流程。您应该使用一个微小的操作系统内核,然后构建使用随机输入进行单元测试的微型模块。像埃菲尔这样的语言可能有所帮助,但没有银弹。
如果它比其他一切安全的话,我会选择haskell。我建议使用haskell,因为它具有非常严格的静态类型检查,并且它促进了编程,在这种编程中,您可以非常容易地测试它们。
但后来我不太关心语言。通过让您的项目整体处于有条件状态并且没有最后期限的工作,您可以获得更高的安全性而不会影响太多。总体而言,所有基本项目管理都已到位。我可能会专注于广泛的测试,以确保一切都像它应该的那样,测试涵盖所有角落案例+更多。
任何软件产品都可以使用任何工具通过DO-178b认证流程,但问题是它有多难。如果编译器未经过认证,您可能需要证明您的代码在程序集级别是可跟踪的。因此,对您的编译器进行认证很有帮助。我们在项目中使用了C,但是必须在汇编级别进行验证并使用代码标准,包括关闭优化器,有限的堆栈使用,有限的中断使用,透明的可认证库等.ADA不是小精灵尘埃,但它使得PSAC计划看起来更容易实现。
随着应用程序变得越来越大,汇编代码变得不那么可行。 ARM处理器只是邀请C ++,但如果你问像Kiel这样的公司,他们的工具是经过认证的,那么他们会以“嗯?”回来。不要忘记,验证工具也需要经过认证。尝试验证LabView测试程序。
这里有一些我尚未见过的工具的更新,我最近一直在玩这些相当不错的工具。
LLVM编译器基础结构 ,主页上的简短介绍(包括C和C ++的前端。正在开发Java,Scheme和其他语言的前端);
编译器基础结构--LLVM也是源代码的集合 实现语言和 编制策略。首要的 LLVM基础结构的组件 是一个基于GCC的C& C ++前端,a 链接时优化框架 越来越多的全球和 过程间分析和 转换,静态后端 X86,X86-64,PowerPC 32/64,ARM, 拇指,IA-64,Alpha,SPARC,MIPS和 CellSPU架构,后端 它发出便携式C代码,和 适用于X86,X86-64的即时编译器, PowerPC 32/64处理器,以及 MSIL的发射器。
VCC ;
VCC是一种证明正确性的工具 注释并发C程序或 发现问题。 VCC扩展了C. 通过合同特征设计,如 前后条件以及类型 不变量。带注释的程序是 使用转换为逻辑公式 Boogie工具,将它们传递给 一个自动SMT求解器Z3来检查 他们的有效性
VCC使用最近发布的 通用编译器基础结构 。
这两个工具,LLVM或VCC都是为支持多种语言和体系结构而设计的,我确实认为它们是通过合同和其他形式验证实践进行编码的。
WPF (不是MS框架:),如果您正在尝试评估程序验证空间中的一些最新研究和工具,那么这是一个很好的起点。
WG23 是主要的资源,但对于相当当前和具体 关键系统开发语言细节 。它们涵盖了Ada,C,C ++,Java,C#,Scripting等所有内容......并且至少提供了一套体面的参考和指导,以指导更新有关语言特定缺陷和漏洞的信息。
首先,安全关键软件遵循您在经典机械和电气工程领域中看到的相同原理。冗余,容错和故障安全。
顺便说一句,正如之前的海报所暗示的那样(并且由于某种原因被低估),能够实现这一目标的最重要因素是让您的团队对所发生的一切有深刻的了解。毫无疑问,良好的软件设计是关键。但它也意味着一种可访问,成熟且得到良好支持的语言,其中有许多公共知识和经验丰富的开发人员可用。
许多海报已经评论说,操作系统是这方面的关键因素,这一点非常正确,因为它必须是确定性的(参见QNX或VxWorks)。这排除了大多数为您幕后操作的解释语言。
ADA是一种可能性,但是那里的工具和支持较少,更重要的是,人们并不那么容易获得。
只有在严格执行子集时才有可能使用C ++。在这方面它是魔鬼的工具,承诺让我们的生活更轻松,但往往做得太多,
C是理想的。它非常成熟,快速,拥有多样化的工具和支持,许多经验丰富的开发人员在那里,跨平台,而且极其灵活,可以靠近硬件工作。
我开发了从smalltalk到ruby的所有东西,欣赏并享受高级语言提供的一切。但是,当我正在进行关键系统开发时,我会咬紧牙关并坚持使用C.根据我的经验(防御和许多II级和III级医疗设备),更少。
我不知道我用的语言是什么,但我知道我不会用什么语言:
关于JAVA支持的说明。该软件产品可能包含对JAVA中编写的程序的支持。 JAVA技术不是容错的,并非设计,制造或有意使用或转售为危险环境中的在线控制设备,需要无故障安全性能,如核设施,飞机导航或通信系统的运行,空气交通控制,直接生命支持机器或武器系统,其中JAVA技术的失败可能导致死亡,人身伤害或严重的物理或环境损害。
既然你没有提供平台,我就不得不说C / C ++。在大多数实时平台上,无论如何,您的选项相对有限。
C倾向于让你自己在脚下射击的缺点被验证代码的工具数量以及代码的稳定性和直接映射到平台的硬件功能所抵消。此外,对于任何关键的事情,您将无法依赖尚未经过广泛审查的第三方软件 - 这包括大多数库 - 甚至包括硬件供应商提供的许多库。
由于一切都是您的责任,因此您需要稳定的编译器,可预测的行为以及与硬件的紧密映射。
操作系统比语言更重要。使用实时内核,如VxWorks或QNX。我们研究了控制工业机器人的问题,并决定选择VxWorks。我们使用C进行实际的机器人控制。
对于真正关键的软件,例如飞机自动着陆系统,您需要独立运行多个处理器来交叉检查结果。
HAL / S用于航天飞机。
我相信 阿达 在一些安全和/或关键任务的政府项目中仍在使用。我从来没有使用过该语言,但它和我一起在“学习”列表中,还有埃菲尔。 Eiffel提供Design By Contract,旨在提高可靠性和安全性。
有很多很好的参考资料 http://www.dwheeler.com (“高保证软件”)。
对于汽车用品,请参阅MISRA C标准。 C但你不能使用两个以上的指针级别,以及其他类似的东西。
adahome.com有关于Ada的好消息。我喜欢这个C ++到Ada教程: http://adahome.com/Ammo/cpp2ada.html
对于硬实时,Tom Hawkins做了一些有趣的Haskell。请参阅:ImProve(语言包含用于检查验证条件的SMT求解器)和Atom(用于硬实时并发编程的EDSL,无需使用实际线程或任务)。