机载系统有“DO-178B”A级和B级认证。它是否禁止使用优化编译器?
E.g。一些编译器会重新排序指令以获得更高的性能。 DO-178B lev.A或lev.B是否禁止重新排序?
大多数现代CPU都在硬件中内置了这种重新排序。它们是否允许在DO-178B lev.A软件/硬件系统中使用?
答案 0 :(得分:11)
首先,并且批判性地:对于这类问题,如果答案很重要,您需要从有能力提供该问题的人那里获得正式的专业意见,或者与您的认证机构讨论。不应该依赖你在这里得到的任何答复。
话虽如此,我会假设你从好奇的角度提出要求并且不会以任何有意义的方式依赖答案,我将试图以这种方式回答。我不是专业人士,这不是专业建议。
我可以通过快速搜索在线找到的最详尽的文档是FAA关于相关主题的指南文件:http://www.faa.gov/aircraft/air_cert/design_approvals/air_software/cast/cast_papers/media/cast-12.pdf。本文描述了必须对生成的目标代码而不是源代码进行验证的条件。特别是,它提供了许多即使在非优化代码中也会出现的例子 - 自动变量初始化和异常处理只是一些例子。关于编译器优化,它注意到:
编译器优化是DO-178B / ED-12B第4.4.2a节所述的另一个领域。这涉及分析确定优化特征不会损害测试用例展示基于需求的测试和与软件级别一致的结构覆盖的能力。这是与第4.4.2b节讨论的可追溯性和其他验证问题不同的问题。这超出了本文的范围。
我没有DO-178B的副本,方便阅读第4.4.2a节,但我注意到(a)有处理其他情况的程序,其中目标代码与一个源代码不对应一对一的方式,(b)这强烈暗示讨论编译器优化而不是彻底禁止。
从该论文的一些讨论中可以清楚地看出,“我们无法在源代码和目标代码之间跟踪事物”的答案是以某种方式验证目标代码 - 换句话说除了禁止这样的事情之外,还有一个解决方案。
因此,我得出结论,至少必须允许一些编译器优化。
特别是,您所描述的那种重新排序是非常可追溯的,而且我几乎可以肯定它是允许的。
答案 1 :(得分:6)
DO-178B不是绝对的,可以解释。如果您关闭优化,则没有任何问题,也无需解释。通过坚持最明显的解释,您可以避免以后向认证机构出售您的解释,并打开自己的问题来解决您的工作方式。
当您优化代码时,很难完成A级所需的源指令可追溯性。此外,如果您使用Do-178B,那么额外的5%的软件并不是您最关心的问题。完成所有必需的认证步骤的难易程度应该是您首要关注的问题,因为这将是您所有时间的消耗。
你问题的硬件部分很有趣。对于软件优化代码不仅仅是重新排序,它也会被更改。但是对于硬件而言,代码不会被改变以仅获得更高的执行顺序速度。我不得不四处询问有关这方面的想法的更多信息。
答案 2 :(得分:3)
我对DO-178B只有肤浅的了解(我不是每天都在使用它,但我为那些做过的人建立了工具。)
该标准非常重视可追溯性。高级需求被拒绝到低级需求,这些需求由源代码实现,源代码由编译器编译。在每个步骤中,必须能够证明在上一步骤产生的规范方面做了什么。
对于编译器,这意味着必须能够读取程序集并将一条特定指令跟踪到导致生成此指令的源代码语句。
所以,简而言之,是的,我认为这会禁止大多数优化。
关于运行该软件的硬件,它的验证方式不同(但我认为同样严格)。相关标准是DO-254,我对此一无所知。
答案 3 :(得分:2)
通过优化,您需要在对象汇编语言级别验证生成的代码。嵌入式实时多任务处理的编译器套件和库已经在其他项目中得到验证,为您提供了可以再次验证的舒适度 - 但您仍需要验证应用程序中使用的代码。
答案 4 :(得分:0)
为避免延迟并不得不说明问题,只需关闭优化和缓存。这使代码具有确定性。如果可能的话,也尽量不要使用GCC,而要使用合格的编译器,例如IAR或DDCI或Irvine编译器等。不用尝试用花式锤子敲打螺丝,而是要使用一个适合螺丝的螺丝刀。因为当那架飞机坠毁时,机上有200人,有母亲,父亲和孩子,他们发现编译器重新排序了代码,并且导致了失败,所以您希望只使用合适的螺丝刀。