【问题标题】:Safe c++ in mission critical realtime apps关键任务实时应用程序中的安全 C++
【发布时间】:2010-08-12 12:41:49
【问题描述】:

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

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

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

所以,我的问题:

1) 是否有任何现有的库/项目利用这种想法? (嵌入式 c++ 显然不是想要的那种)?

2) 这到底是不是个好主意?或者它可能仅对另一种假设语言的原型有用?还是完全无法使用?

3) 也欢迎对此问题的任何其他想法(或链接)

对不起,如果这个问题实际上不是一个问题、离题、重复等, 但我还没有找到更合适的地方问它

【问题讨论】:

  • 只使用 Ada 而不是将 C++ 转换为 Ada 可能会更快。

标签: c++ embedded real-time


【解决方案1】:

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

【讨论】:

  • 感谢您的参考,如果真的可以自定义 Lint,这是一个有趣的可能性。
【解决方案2】:

我们在关键任务实时应用程序中使用 C++,尽管我认为我们很容易(理论上)因为我们只需要提供与客户使用的硬件一样好的实时保证。因此,足够的分析让我们在没有 mlockall() 或堆栈预加载或任何其他 RT 传统的情况下度过难关。至于语言本身,我认为在 21 世纪的硬件条件下,日常的现代 C++ 编码实践(不鼓励 C 概念的那些)足以编写可在 RT 上下文中使用的健壮应用程序。

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

【讨论】:

  • 也许你是对的.. 最好强调不存在的功能,例如分布式/多线程同步和内存模型。 + -/ * ...的任何重载都不能保证坏程序员不会编写错误的程序:)可能是...
  • @user396672:我们曾经有一些这样的特殊库,在 1992 年 C++ 还不成熟时它们确实有意义,但在过去的几十年里,它们变得无法维护,而标准库和通用库如boost变得更有效率,也更容易理解。但是,是的,我们的优先级继承消息传递库是我们自己的。
【解决方案3】:

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

一些观察:

  • 对所有代码进行同行评审(可能有多个评审者)。这将大大提高质量而不需要大量运行时检查。
  • 务必使用诊断工具和非仅发布断言。
  • 务必使用模拟系统在非嵌入式硬件上进行测试。
  • C++ 是专门设计的,出于性能原因没有边界检查之类的东西。

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

有人指出,如果你想要 Ada,就用 Ada。

【讨论】:

  • 智能指针,不幸的是,有开销。例如,shared_ptr 使用一些中间对象,实际上是指我们打算指向的对象。 RAII,你是对的,几乎没有开销。谢谢你的回答,我真的不确定正式限制的必要性。我问了这个问题,因为我不确定:)
  • @user396672 这就是为什么 Stroustrup 更喜欢 unique_ptr 而不是 shared_ptr:www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2011-05-10
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多