关键任务实时应用程序中的安全c ++

时间:2010-08-12 12:41:49

标签: c++ embedded real-time

我想听听各种意见如何在关键任务实时应用程序中安全地使用c ++。

更准确地说,可能可以创建一些宏/模板/类库来进行安全数据操作(密封溢出,zerodivides生成无穷大值或仅对特殊的“非零”数据类型进行除法),带有绑定检查的数组和foreach循环,安全的智能指针(例如类似于boost shared_ptr)甚至是安全的多线程/分布式模型(消息传递和轻量级进程,如在Erlang语言中定义的那些)。

然后我们禁止一些危险的c / c ++构造,如原始指针,一些原始类型,本机“new”运算符和本机c / c ++数组(对于应用程序员,当然不是对于库编写者)。理想情况下,我们应该创建一个特殊的预处理器/检查器,至少我们必须有一些正式的检查程序,可以使用某些工具或某些人手动应用于源。

所以,我的问题:

1)是否存在利用这种想法的现有图书馆/项目? (嵌入式c ++显然不是理想的那种)?

2)这根本不是一个好主意吗?或者它可能仅用于原型化另一种时髦的语言?或者它完全无法使用?

3)关于此事的任何其他想法(或链接)也欢迎

很抱歉,如果这个问题实际上不是问题,非正式,重复等, 但我找不到更合适的地方来问它

3 个答案:

答案 0 :(得分:9)

有关如何为关键任务实时应用程序编写C ++的良好规则,请查看Joint Strike Fighter coding standards。许多规则都基于MISRA C coding standards,我认为这是专有的。 PC-Lint是一个C ++代码检查器,其规则集与您想要的一样(包括MISRA规则)。我相信你也可以自定义你自己的规则。

答案 1 :(得分:2)

我们在任务关键型实时应用程序中使用C ++,虽然我认为我们很容易(理论上)因为我们必须提供与客户使用的硬件一样好的实时保证。因此,足够的分析可以让我们在没有mlockall()或堆栈预加载或任何其他RT传统的情况下完成。至于语言本身,我认为每天的现代C ++编码实践(阻止C概念的实践)完全足以编写可以在RT环境中使用的健壮应用程序,给定21世纪的硬件。

单元测试和质量保证应该是工作的重点,而不是复制现有语言功能的内部库。

答案 2 :(得分:2)

如果您正在用C ++编写关键的高性能实时S / W,那么您可能需要每微秒才能从硬件中获得。因此,我不一定建议实现所有额外的检查,例如你提到的检查,至少是对程序执行有开销影响的检查。显然,您可以屏蔽浮点异常,以防止从程序崩溃中除以零。

一些观察结果:

  • 同行评审所有代码(可能是多个评论者)。这将大大提高质量,而无需进行大量的运行时检查。
  • DO使用诊断工具和非释放断言。
  • 使用仿真系统在非嵌入式硬件上进行测试。
  • C ++是专门设计的,没有像边界一样检查性能的原因。

一般情况下,我不建议任意限制语言,尽管使用RAII和智能指针应该具有最小的开销并且提供了很好的好处。

其他人指出,如果你想要Ada,只需使用Ada。