24小(xiǎo)时联系電(diàn)话:18217114652、13661815404

中文(wén)

您当前的位置:
首页>
電(diàn)子资讯>
技术专题>
基于标准的开发实践

技术专题

基于标准的开发实践


整个行业都围绕着以功能(néng)安全性,安全性和编码标准(例如IEC 61508ISO 26262IEC 62304MISRA CCWE)為(wèi)支持的验证和确认实践而发展。当然,并非所有(yǒu)人都有(yǒu)义務(wù)遵循这些标准所倡导的正式流程和方法,尤其是在其软件不需要满足这些标准的严格要求的情况下。但是标准支持最佳实践,因為(wèi)经验表明,它们代表了获得高质量,可(kě)靠和强大的软件的最有(yǒu)效方法。

遵循这些标准的最佳实践开发技术可(kě)帮助确保一开始就不会在代码中引入错误,从而减少了对大量调试活动的需求,这些活动可(kě)能(néng)会缩短上市时间并增加成本。当然,并非所有(yǒu)开发人员都拥有(yǒu)在航空航天,汽車(chē)或医疗设备行业中看到的应用(yòng)程序所能(néng)承受的时间和预算。但是,无论关键性是否强制使用(yòng)它们,他(tā)们部署的技术对于任何开发团队而言都具有(yǒu)巨大的潜在利益。

错误类型和解决方法

在软件中可(kě)以找到两种关键类型的错误,并使用(yòng)防止错误引入的工具进行了处理(lǐ):

编码错误。一个示例是尝试访问数组范围之外的代码。可(kě)以通过执行静态分(fēn)析来检测这些类型的问题。

应用(yòng)程序错误。只有(yǒu)通过确切了解应用(yòng)程序应该做什么才能(néng)检测到这些,这意味着需要进行测试。

编码错误和代码检查

静态分(fēn)析是检测编码错误的有(yǒu)效技术,尤其是从项目开始部署时。一旦分(fēn)析了代码,就可(kě)以查看不同类型的结果。在代码审查中,将根据诸如MISRA C2012之类的编码标准来检查代码,这是我们在本文(wén)中重点介绍的内容。

理(lǐ)想情况下,所有(yǒu)嵌入式项目都应使用(yòng)安全语言(例如Ada)。Ada具有(yǒu)许多(duō)特性,可(kě)以强制执行思考过程,从而自然地减少错误(例如,严格键入)。不幸的是,很(hěn)难找到具有(yǒu)Ada知识和经验的程序员,因此大多(duō)数公司都使用(yòng)C/C ++。但是,即使是经验丰富的开发人员,这些语言也会带来陷阱。幸运的是,通过执行代码审查,可(kě)以避免大多(duō)数这些潜在的陷阱。

避免代码缺陷的最佳方法是避免将其放置在此处。这听起来很(hěn)明显,但这正是编码标准所做的。在CC ++世界中,大约80%的软件缺陷是由错误使用(yòng)大约20%的语言引起的。如果限制使用(yòng)该语言以避免该语言的已知部分(fēn)出现问题,则可(kě)以避免出现缺陷,从而大大提高软件质量。

C / C ++编程语言与语言相关的故障的根本原因是未定义的行為(wèi),实现定义的行為(wèi)和未指定的行為(wèi)。这些行為(wèi)导致软件错误和安全问题。

作為(wèi)实现定义的行為(wèi)的示例,请考虑当有(yǒu)符号整数右移时的高阶位的传播。结果是0x40000000还是0xC0000000

 

某些C和C ++构造的行為(wèi)取决于所使用(yòng)的编译器

答(dá)案取决于您使用(yòng)的是哪个编译器(图1)。可(kě)能(néng)是。函数参数的求值顺序未在C语言中指定。在图2所示的代码中其中rollDice()函数仅从持有(yǒu)值“ 1234”的循环缓冲區(qū)中读取下一个值),期望的返回值為(wèi)1234。但是,没有(yǒu)為(wèi)此,至少一个编译器将生成返回值3412的代码。

 

图2:某些C和C ++构造的行為(wèi)未由语言指定

C / C ++语言存在许多(duō)类似的陷阱,但是通过使用(yòng)编码标准,可(kě)以避免这些未定义,未指定和实现定义的行為(wèi)。同样,使用(yòng)诸如gotomalloc之类的构造会导致缺陷,因此可(kě)以使用(yòng)编码标准来防止使用(yòng)这些构造。混合有(yǒu)符号和无符号值时会发生许多(duō)问题,这在大多(duō)数情况下不会产生问题,但是有(yǒu)时可(kě)能(néng)会出现极端情况,即有(yǒu)符号的值溢出并变為(wèi)负数。

编码标准还可(kě)以检查代码是否以特定样式编写。例如,验证未使用(yòng)制表符,缩进是特定大小(xiǎo)还是括号位于特定位置。这很(hěn)重要,因為(wèi)将需要进行一些手动代码审查,并且在其他(tā)选项卡字符大小(xiǎo)不同的编辑器中查看代码时,奇怪的布局分(fēn)散了审查者的注意力,使他(tā)们无法集中精力审查代码。

一些开发人员对编写聪明的代码感到内gui,这些代码可(kě)能(néng)是高效且紧凑的,但也可(kě)能(néng)是晦涩复杂的,这使得其他(tā)人难以理(lǐ)解。最好保持简单,让编译器负责制作高效的二进制文(wén)件。再次,使用(yòng)编码标准可(kě)以帮助防止开发人员创建未记录且过于复杂的代码。

最著名的编程标准可(kě)能(néng)是MISRA标准,该标准于1998年首次发布给汽車(chē)行业。这些标准的普及反映在提供某种级别的MISRA检查的嵌入式编译器中。MISRA的最新(xīn)版本是MISRA C2012,其页数几乎是其前身的两倍。这些附加文(wén)档中的大多(duō)数包含有(yǒu)关每个规则為(wèi)何存在的有(yǒu)用(yòng)解释,以及该规则的各种例外的详细信息。MISRA有(yǒu)几个准则,并且在适用(yòng)时,它们包含对标准或未定义,未指定和实现定义的行為(wèi)的引用(yòng)。这样的一个例子可(kě)以在图3中看到。

 

图3:MISRA C引用(yòng)了未定义,未指定和实现定义的行為(wèi)

MISRA的大多(duō)数指南都是可(kě)判定的,这意味着工具应该能(néng)够识别是否存在违规行為(wèi)。但是,一些准则是不确定的,这意味着工具并非总是可(kě)能(néng)推断出是否存在违规行為(wèi)。例如,将未初始化的变量作為(wèi)输出参数传递给应该对其进行初始化的系统函数时。但是,除非静态分(fēn)析可(kě)以访问系统功能(néng)的源代码,否则它将无法在该功能(néng)初始化之前就知道该功能(néng)是否使用(yòng)了该变量。如果使用(yòng)简单的MISRA检查器,则它可(kě)能(néng)不会报告此违规,可(kě)能(néng)导致假阴性。或者,如果不确定MISRA检查器,则它可(kě)以报告违规情况,可(kě)能(néng)导致假阳性。什么是最好的?不知道可(kě)能(néng)有(yǒu)问题吗?还是确切地知道在哪里花(huā)费时间来确保绝对没有(yǒu)问题?当然,假阳性比假阴性更可(kě)取。

20164月,MISRA委员会发布了对MISRA C2012的修订,其中增加了14条准则,以帮助确保MISRA不仅适用(yòng)于安全性至关重要的软件,还适用(yòng)于安全性至关重要的软件。这些准则之一就是指令4.14,如图4所示,该准则有(yǒu)助于防止由于未定义行為(wèi)引起的陷阱。


图4:MISRA和安全注意事项

应用(yòng)程序错误和需求测试

应用(yòng)程序错误只能(néng)通过测试产品是否达到了预期功能(néng)才能(néng)找到,这意味着有(yǒu)要求。避免应用(yòng)程序错误既需要设计正确的产品,又(yòu)需要设计正确的产品。

设计正确的产品意味着预先建立需求,并确保需求和源代码之间的双向可(kě)追溯性,以便已实现每个需求,并且每个软件功能(néng)都可(kě)以追溯到需求。任何缺少的或不必要的功能(néng)(不符合要求)也是应用(yòng)程序错误。设计产品权利是确认开发的系统代码满足项目要求的过程,可(kě)以通过执行基于需求的测试来实现。

5显示了双向可(kě)追溯性的示例。在这个简单的示例中,选择了一个功能(néng),并突出了从功能(néng)到低层需求,然后是高层需求,最后是系统层需求的上游可(kě)追溯性。

 

图5:双向可(kě)追溯性,已选择功能(néng)

在图6中,选择了一个高级需求,并且高亮显示了对系统级别需求的上游可(kě)追溯性和对低级别需求以及源代码功能(néng)的下游可(kě)追溯性。

 

图6:双向可(kě)追溯性,已选择要求

这种可(kě)视化可(kě)追溯性的能(néng)力可(kě)以导致在生命周期的早期发现可(kě)追溯性问题(应用(yòng)程序错误)。

测试代码功能(néng)需要了解它应该做什么,这意味着具有(yǒu)低级要求来陈述每个功能(néng)的作用(yòng)。图7显示了一个低级别需求的示例,在这种情况下,它完整地描述了一个功能(néng)。


图7:低级别需求示例

测试用(yòng)例源自表1中所示的低级需求。


表1:来自低级需求的测试用(yòng)例

然后使用(yòng)单元测试工具在主机或目标上执行这些测试用(yòng)例,以确保代码的行為(wèi)符合要求。8显示所有(yǒu)测试用(yòng)例均已回归并通过。

 

图8:执行单元测试

测试用(yòng)例运行后,应测量结构覆盖范围,以确保所有(yǒu)代码都已执行。如果覆盖率不是100%,则可(kě)能(néng)需要更多(duō)的测试用(yòng)例,或者有(yǒu)多(duō)余的代码应删除。

请输入搜索关键字

确定