代码静态分析-应用于手写代码和自动生成的代码
.jpg)
简介
• 航空航天和国防工业
• qac/qac++自2001年起被广泛应用,该工具在分析手写代码方面,能够大大提高开发效率
• 使用基于misra的编码规范(在misra的基础上添加公司特定的编码规范)
• 借助rhapsody进行代码的自动生成是一项具有战略意义、非常重要的工作,而将qac/qac++与rhapsody集成,则提供了一个自动测试生成代码质量的更为高效、实用的方法。
代码的静态分析,不应仅仅局限于在手写代码中查找出现的问提。prqa公司曾与selex es公司合作,将ibm rational系列产品中的rhapsody与qac++集成,使用qac++分析rhapsody中通过模型自动生成的代码,从而形成了一套c++代码分析的集成凯发娱乐登录的解决方案。该凯发娱乐登录的解决方案不仅提高了代码质量,缩短了软件开发周期,也增强了软件开发流程的鲁棒性。
手写代码
finmeccanica集团下的 selex es公司,自2001年起一直采用prqa公司提供的代码静态分析凯发娱乐登录的解决方案。最初,在英国巴斯尔登使用静态分析工具qac;四年后,selex es公司着眼于查找现有工具链中的不足,寻求提高产量的方法,对公司的工具链进行了再评估。经过对市场上代码分析工具的严格评审,selex es公司对代码分析工具提出了下述要求:
• 能够识别错误代码和不安全语言的使用
• 编码规范的兼容性(可基于misra扩展编码规范)
• 确保工具的误报率较低
• 提供编程风格的指导(如:命名规则和代码布局等,使代码易于被其他人复用)
• “测试影像” (工具应使开发人员的代码问题相互可见,且能够共享代码问题的凯发娱乐登录的解决方案 )
• 度量报告(提供提高代码质量的建议与反馈)
编程实践和编码规范
selex es公司在意识到编码规范对辅助生成鲁棒性代码能起到重要作用之后,在misra的基础上添加了公司特定的一些编程要求,形成了一套应用于selex es公司的编码规范。虽然misra主要面向汽车行业,但这套规则集是世界上一批优秀编程专家的工作结晶,除了一些应用于汽车行业的特殊规则和安全性方面的规则之外, misra可广泛应用于许多其他行业。对于selex es公司而言,misra与行业特定的编码规范相结合是一个理想的编码规范应用起点。
此外,selex es公司同样也意识到软件开发过程中的不同阶段与不同的角色相关,如下表所述:
而本次软件评测的结果是什么呢?2007年,selex es公司决定在全公司范围内全面采用qac和qac++。随后,这两个工具也被推广到爱丁堡、卢顿以及意大利其他selex es的分公司。负责传感器数据处理凯发娱乐登录的解决方案的软件开发负责人伊恩·安德森表示:“采用qac、qac++是一个轻松的决定,这两个工具在我们的开发团队中已经被广泛采用,并且证实这两个工具分析手写代码非常高效、自动化。”
在随后的几年中,selex es公司代码审查人员的工作重点有了明显的改变,他们不再需要进行详细的代码走查,可以专注于检查代码功能与设计是否一致。之前的人工代码审查,需要严重依赖代码审查人员经验和个人能力;而使用工具分析之后的检查结果可以更加一致与高效。此外,selex es公司还发现,在完成静态测试之后,代码的动态测试变得更快也更容易了。因为qac、qac++不仅提高了代码质量,也在单元测试之前检测出了很多代码问题,大大减少代码的返工。此外,完成静态分析之后的代码风格上保持一致,并更易于维护了。
阶段 | 目的 | 人员 |
设计 & 实现 | 提供持续的完整性检查;帮助经验不足的工程师;减少缺陷 | 开发人员 |
测试 | 在动态测试之前,对生成的代码进行自动化检测 | 测试人员 |
审核 | 需要关闭工作产品(软件变更请求) | 设计人员 |
发布 | 需要添加版本基线 | 质量人员 |
模型驱动的开发
基于ibm rational rhapsody进行模型驱动的代码设计,是selex es公司其中一项重要的战略计划。该方法不仅可以加快整体的开发进度,还可以在不同项目中重用这些自动生成的代码。
selex es公司发现,根据uml模型自动生成的代码在项目中占60% - 80%左右,剩余的20% - 40%的代码依然需要人工编写(通常使用c++编写),而这两种代码通常会在同一个代码库中相互穿插,手写代码与自动生成的代码相互结合。
模型生成的代码和自动生成的代码之间的关系见图1a与1b。
图 1a: 模型中的状态图
图 1b: 根据模型生成的状态机代码
rhapsody模型生成的代码具有广泛的行业应用,再加上15年来rhapsody在40多个项目中的应用,增强了selex es公司对rhapsody生成鲁棒壮性代码的信心。
最初,手写代码的检测确实能够提供独立的验证,但这种方式在可扩展性、速度、分析的一致性和整体资源配置方面会出现重要的问题。qac、qac++为selex es公司的手写代码提供了高效的代码测试凯发娱乐登录的解决方案。而面临的挑战是如何讲rhapsody的环境充分利用起来,问题的症结在于如何区分手写代码和自动生成的代码。
a)从uml模型中自动生成的代码:
对于这类代码,selex es公司采取的方法是“面向对象”,将测试重点放在功能性测试和基于需求或者基于设计的覆盖度测试上。使用这类测试方法有以下三点的考虑:由于模型转换和代码生成过程中固有的局限性,模型生成的代码在语言使用的限制上更为严格。此外,自动生成的代码在过去的现场实施中已经被广泛证实,因此增强使用信心。最后,模型生成的代码不能被开发人员所更改,只能通过修改模型而改变。
b)从手写代码衍生出来的自动生成代码模型能被开发人员可控:
过渡代码多为手写代码,这些代码与rhapsody根据模型生成的代码相互结合。而那些可通过rhapsody gui控制的函数原型代码则为程序员可通过模型修改控制的代码段。不论是手写代码还是自动生成的代码,都应被充分检查,以确保这些代码能与编程实践和编码规范兼容。由于开发人员需要负责修改这些代码,因此将代码分析与软件开发流程无缝融合是至关重要的。
rhapsody 与 qac/qac++
为了能够使rhapsody与qac、qac++成功集成,prqa公司与selex es公司联合确定了许多关键要素:
• 使开发人员意识到,他们的职责范围是识别和集中注意力到代码中,不论是手写代码还是自动生成的代码都属于代码(例如函数的参数类型)。这意味着,即使是根据模型自动生成的代码,程序员也必须能够在代码中识别并抑制任何出现错误。
• 使qac、qac++的代码分析能够与基于rhapsody的软件开发流程无缝衔接,具体体现在如下几方面:
♦ 能够使用完整的qac、qac++功能;
♦ 在rhapsody ide中能够轻松调用静态分析功能;
♦ 能够高效的聚焦和分析每一次有变化的代码。
这项工作建立了qac、qac++与rhapsody的集成,这种模式后续也推广到了所有selex es公司的rhapsody项目。
在技术层面的集成工作
selex es公司使用的编译器为microsoft的msvc++,使用支持gnu和diab编译器的wind river vxworks的实时操作系统。本次集成工作能够很好地应用到开发平台中。selex es公司将rhapsody作为ide使用,直接将代码插入到rhapsody中,代码作为模型文件的一部分进行存储和配置,因此在工程中没有包含手写代码的源文件。这种模式下开发的工程师只结合模型进行开发,所生成的c++文件作为模型的一部分执行,类似于目标代码。selex es公司采取的开发模式是模型导向的,模型是需要存储的内容,所有项目中的代码都通过模型生成。
在rhapsody中创建模型之后,集成直接在rhapsody中进行,可创建一个包含rhapsody生成的c++文件的qac++工程,并包含分析所需的配置文件。qac++的界面将自动启动,加载完成待分析的工程。此时,开发人员可选择需要分析的文件,分析结果为qac++检测出的代码中的问题。
在qac++中有1300多个检测点,按照misra编码规范的要求进行排列(如果不使用misra,这些规则按照不同的严重程度分成9个级别)
完成分析之后,这些问题将在消息浏览器中显示,按照严重程度进行分组,便于从不太重要的问题(如代码布局问题)中区分出相对重要的代码问题(如未定义的行为)。这些问题可通过文件、消息或者分组的形式在导航窗口中查看,检测出的问题穿插在代码中,每一个问题都有对应的html格式的解释性说明。
对于模型代码中出现的问题,默认情况下会被抑制,但也可选择性的设置成可见。经过代码检测之后,开发人员可以重新修改他们的代码,插入到rhapsody的ide中解决问题,接着通过rhapsody重新生成代码,在qac++中重新分析,得到非常快速的验证,确认是否之前的问题被修复了,且没有产生新的问题。
总结
十多年来,selex es公司成功使用qac、qac++自动化分析手写代码。
在确定基于模型设计代码的决策后,selex es公司非常希望qac、qac++能够在rhapsody环境中继续保证代码质量。而将qac、qac++与rhapsody集成的解决方法使selex es公司认识到手写代码和根据uml模型自动生成的代码需要相互兼容。因此,prqa公司为selex es公司提供了这样的集成凯发娱乐登录的解决方案:
• 使开发人员能够识别并专注于他们自己编写的代码段上,可直接编辑这些代码;
• 使qac、qac++能与基于rhapsody的软件开发流程无缝配合。
伊恩·安德森表示,“使用rhapsody自动生成代码是一个关键的、具有战略意义的决策,qac和qac++已经在我们的开发团队中被广泛采用,并且证实这两款工具可高效的用于分析手写代。”