近年来,国内电子公司和芯片设计企业大举进攻汽车、医疗和工业等高可靠应用(mission-critical)领域,为自己找到了摆脱红海的新领域。但是高可靠应用多数都需要功能安全认证,在许多行业在诸如汽车、航空电子、医疗和工业控制等行业,是很常见甚至是必须的工作。这些认证通过必要的流程和测试来填写功能安全清单,一直以来都是一个非常困难的事情,但有一些方法可以加快您的认证。
虽然可以对研发过程进行大量的微调以加快您的认证,但一切现代电子信息系统都从软件即代码质量开始。但如何能够确保代码质量呢?幸运的是,使用一些简单的方法,可以几乎立即提升您的代码质量,并尽可能地减少痛苦。
从标准中获得帮助
作为一家产品被全球近五万家企业/机构采用的嵌入式开发工具提供商,IAR的研发工程师评估在C99中,代码规范中有大约190种模棱两可之处。也就是在C99中,有190种不同的合乎句法的C结构,在C语言规范中没有明确说明。实际上,进入C18,情况会变得有一点糟糕,在C++中,情况会更加糟糕,这里需要引入多继承和虚拟继承的概念。当然,编译器必须把您的源代码变成具体的代码,所以它必须对代码的含义选择一种解释,然后用它来运行。
这在实践中意味着,您可以得到不同的编译器,它们对源代码有不同的解释。在一个高可靠的系统中,这是一个如同噩梦般的场景;特别是由于许多公司为了追求尽快通过功能安全认证,为了方便测试在多个平台上交叉编译他们的代码。可以想象,这对您获得认证的时间会有多么非常糟糕的影响,因为您不得不围绕所有这些情况进行测试,以证明代码的可重复性和可靠性。
怎样才能破解这个难题呢?简短的答案是,避免模棱两可的情况出现在您的代码中。但如何做到这一点呢?使用像MISRA这样的编码标准可以快速解决这个难题,因为这些标准就是为了让您避免掉入代码中那些常见类型的陷阱。这些标准还倡导编码要安全可靠,以减少您代码中的漏洞数量。但是,怎样才能确保我们遵循这些标准呢?幸运的是,功能安全标准提供了一种方法。
标准需要代码分析
几乎每一个功能安全标准都需要您对您的代码进行静态分析,并且强烈建议您对您的代码进行运时(或动态)分析。这些标准中影响最广的是IEC 61508,涵盖了一般与安全相关的系统。在该标准的C.4.2这一节中,对于安全完整性等级(SIL)1以上的产品,不建议使用没有消除模棱两可和危险行为的编码标准的C语言。
换句话说,如果您想为您的产品获得SIL 2-4等级的认证,您必须使用静态分析来让您的代码更加稳固。这是为什么呢?这些静态分析工具可以迫使开发者实施诸如MISRA的编码标准。此外,静态和运时分析可以帮助您提高代码质量,快速指出您何时的编码行为是有风险的,特别是存在上述编码标准中模棱两可的情况。
然而,当您使用这类自动化工具时,也会对您的认证时间线产生巨大影响。许多组织使用难以配置、难用的代码分析工具,这些工具在构建服务器上运行,作为每日构建的一部分。这对您的帮助并不是很大,因为个体开发者并没有得到即时的反馈,他们并不知道自己刚刚写的代码有什么问题。此外,有时这些工具发出的警告信息是难以理解的,开发者们要弄清楚是什么意思,以及怎样修正代码才能让警告消失,这浪费了他们的时间。
换句话说,安全性认证不是要突出项目的优点(高性能),而是要尽量找出项目的弱点(漏洞),所以要尽可能地选用被最大量开发人员群体验证过的开发工具,或者是“见多识广”的开发工具系统。全球有超过15万开发人员在使用IAR提供的IAR Embedded Workbench开发工具来完成其各种嵌入式项目,通过与其中许多“高手”开发人员沟通发现:如果您能在开发过程中进行代码分析--在正式构建之前--那么漏洞就像是从来没有过一样。您项目的漏洞会比较低,这正是认证机构想要的,因为这意味着您有一个非常成熟的开发组织。
让代码分析成为日常工作流程的一部分
IAR的工程师们见过许多来自各行各业的公司,我们注意到的是,配置起来越容易使用的代码分析工具越简单,开发人员就更有可能使用它们,这样能够帮助开发人员更快完成项目实现产品上市。让这些自动化工具成为开发者工具箱的一部分,意味着您可以在编写应用程序时检查和改进代码质量,同时可以在“区域”内了解这部分代码要做什么以及它如何与系统中的其他模块进行交互。为了有效地做到这一点,这些工具必须被整合到日常工作流程中。
在浏览其他人对整合代码分析的看法时,IAR的工程师发现谷歌在ACM出版物上发表了一篇文章,探讨了代码分析的优点。虽然文章对他们的整个代码库,包括C、C++和Java进行了全面的考察,但他们的结果非常明确:
“在开发过程的早期就能发现编译器错误,并且能够整合到开发人员的工作流程中。我们发现扩大编译器的检查集对提高Google的代码质量是有效的。”
作者说,将静态分析检查整合到编译器工作流程中,并使其作为错误出现,极大地提高了对工具调查结果的关注度,这意味着他们的代码质量最后会很高。再往下看,他们谈到了一项调查,这项调查面向最近遇到编译器错误以及已经收到修复同一问题补丁的开发者:
“谷歌开发者认为,在编译时标记的问题(与已提交的代码补丁不同)能捕捉到更严重的漏洞;例如,编译过程中标记的问题里面有74%被调查参与者认为是‘真正的问题’,相比之下,在已提交的代码中发现的问题只有21%。”
文章还谈到了将代码分析作为工作流程一部分的重要性,指出当他们通过静态分析工具自动运行提交的代码并邀请工程师查看分析仪表板时,很少有工程师跟进到底。在编译过程中的即时反馈让静态分析使用起来更简单,也更难被忽视。因此,他们选择在每个人的工作流程中默认加入静态分析。谷歌团队认为,代码分析工具要想取得成功,一定要让开发人员感觉到他们用了这些工具,并从中受益,并且很享受用这些工具。
但是,在工作流程中加入代码分析,您期望看到什么样的结果呢?有一件事情是可以期望实现的,那就是提高应用程序的整体安全性,因为高质量代码可以消除漏洞去利用诸如缓冲区溢出和非法指针等机会,如该文所述。虽然这本身就是使用代码分析的一个很好的理由,但有时很难说服人们相信“一针不补,十针难缝”这句格言,您需要更显著的结果来说服开发者和管理层,让他们信服代码分析的好处。
Stefan Wagner等人的一篇论文使用经验数据来计算代码分析工具与传统测试在不同代码库上的优势。他们的结果很有说服力:在769个被识别到的漏洞中,76%是被代码分析工具发现,只有4%是在传统测试中发现,其余20%在代码审查中发现。如果能在开始测试前就消除75%的漏洞,那么能多快地实现软件的平均故障间隔时间(MTTF)目标?答案是“非常快”。仅仅是看测试节省下来的时间和金钱,即可发现对代码分析工具的投资就是值得的,更不用说缩短产品上市周期省下的时间。这些都是功能安全认证机构喜欢看到的流程类型,因为它极大地降低了最终产品仍然含有漏洞的风险。
高质量的代码让您在通往功能安全的道路上快速前进
加快功能安全认证之路的关键是提高代码质量。提高代码质量,可以降低您的产品漏洞率,这意味着可以更快地达到软件发布标准,让您的开发组织在功能安全认证机构看来非常成熟。虽然您永远不可能确切地知道一个应用程序中还有多少漏洞,但尽早地多使用代码分析工具可以减少漏洞的数量。