如果归结为系统设计人员如何在架构级别处理系统安全,我会说很多。
三倍
例如,如果采用的方法是与受信任的选民进行三次冗余,那么系统试验/测试将是批准实施的主要步骤。假设一式三份的开发团队之一选择使用 Boost。如果系统作为一个整体通过了它的所有测试向量,那么人们可能会争辩说不需要通过 Boost 本身来寻找实现错误。显然,如果所有三个一式三份都选择使用 Boost,那么这将引起关注,因为测试向量的范围变得难以管理。
三重法是处理使用软件资源(如编译器、库和程序员)问题的标准方法,所有这些都有出错的风险。Boost 只是其中之一。有人可能会争辩说,Boost 共享指针显然是一种降低程序员错误风险的方法。这一轮最有可能对整个系统有益。
重要,但不是安全关键
有趣的地方是没有使用三倍法,而现在正处于真正必须信任事物的领域。有趣的是,许多系统似乎绕过这个问题的方式是说最终有一个人在控制,他在监督并能够在系统错误的情况下进行干预。
例如,汽车行业有一套称为 MISRA 的编程规则。ABS 系统的软件应该被写入这个规则集,并且开发工具应该被设置为在源代码上强制执行这些规则。这个想法是,这会将未检测到的错误的风险降低到可接受的水平。而且因为最终会有一个司机驾驶汽车,所以他们总是可以自己进行踏频制动。因此,汽车行业避免了必须三次实施 ABS。
他们正在将同样的理念扩展到更复杂的汽车系统,如自适应巡航控制和自动驾驶汽车。我个人认为这样的延伸对于自动驾驶汽车来说是不合理的。相关立法明确规定,如果此类车辆发生碰撞事故(即您仍在“驾驶”它)是“驾驶员”的过错,但光鲜的广告不会详述这一重要方面。
在医疗器械领域也是如此。无论如何,应该有护士或监视病人的人,所以偶尔的小插曲是由监督覆盖的。无论如何,整个事情都很糟糕;虽然医疗设备的软件可能已经过编写测试和批准,但这些软件通常在嵌入式 Windows XP 上运行。他们都联网并最终感染了计算机病毒等。FDA 不会让你有一个自动更新系统,只有设备供应商可以更新它,当然他们不可能希望跟上. 因此,您最终会得到一个编写良好且经过良好测试的优质医疗软件,该软件运行在操作系统安装之上,世界上所有的黑客都在它里面跑来跑去,天知道会发生什么。
因此,如果符合 MISRA 的工具链提供 Boost 作为该工具链的一部分,那么我不明白为什么这与提供标准 C 库的工具链有任何不同。如果工具链供应商正在对其进行认证,那么与其他任何情况都没有什么不同。
这种方法有缺点。根据我的经验,我遇到了一个广泛使用的兼容 MISRA 的工具链,当所有优化都打开时,它的编译器会生成垃圾目标代码。我实际上能够在反汇编中验证这一点。然后我查看了工具链的标准 C 库的源代码,它本身显然没有写入 MISRA 规则集,而且它包含明显的可怕错误。
然而,只要您在项目设置中勾选 MISRA 复选框,使用此工具链构建、测试和销售汽车 ABS 系统就没有监管障碍。将 Boost 添加到该工具链几乎不会让事情变得更糟。
安全关键不重复
最后一种方法是没有重复,也没有人工监督。这真的很难,因为您需要正式证明工具链、操作系统、驱动程序、芯片等的每个组件的正确性。AFAIK 从来没有为真正的安全关键系统(如核反应堆、飞行控制航空电子设备或其他)做过如果系统出错,确实会杀死人。
据我所知,唯一接近的就是 Greenhill 的编译器套件和他们的 INTEGRITY 操作系统。他们可以为您(收取高额费用)为操作系统的每一行、所有库和编译器等所有内容提供正式的测试和验证证据。如果有人要尝试一个真正的安全关键系统,而不会重复,那将是一个起点。
我认为他们还没有完成 C++11,尽管我已经将 Boost 添加到他们的工具链中并且它工作得很好(它不在我急于添加的安全关键系统中)。
结论
当然,如果像 Greenhills 这样在可靠且经过全面测试的工具链方面享有当之无愧和良好声誉的公司提供 Boost,那么我认为可以在受监管的系统中使用它。但是我怀疑整个 Boost 是否会以这种方式提供。他们更有可能遵循编译器标准。
我也知道 GCC 过去已经通过了正式的编译器验证测试,以便可以在 Stuff That Matters 中使用。我希望这会在不久之后重复出现,因为最近出现了 Boost 方面的问题。