使用 IBM Rational Software Analyzer 进行静态分析,第 1 部分: 入门指南

如何以及为什么代码的静态分析会节省您和您的客户的时间和金钱

这是专门论述 IBM® Rational® Software Analyzer,以及它在 Rational® Application Developer 和 Rational® Software Architect 中相关的静态分析能力的四部分系列文章中的第一篇。本文专注于用高层次的、一般概念的静态分析。本系列中的其他文章专注于使用并扩展 Analyzer 的一些特性,如果您想完全了解该软件所提供的特性的话,这些文章将帮助您更快地了解中级和高级的特性。

Steve Gutz, 软件经理, IBM

Steve GutzSteve Gutz 是负责 IBM Rational 代码分析工具的开发经理。除了构架并管理 IBM 的商业产品以外,Steve 过去还致力于 Eclipse Test and Performance Tools project(TPTP),专注于基本的代码审查工具的实现和集成中的改进。在 2002 年加入 IBM 渥太华实验室之前,他在许多公共和私有的公司中担任高级管理和执行职位,包括两个他自己的成功创业。他还写过两本书和许多文章,并且经常在会议上演讲。



2008 年 8 月 25 日

作为技术行业的人,我们通常认为自己是顶尖的开发人员,而多半是这样的。然而,不论我们受到的教育有多好或者多有经验,且尽管我们的意图是最好的,但我们还继续书写着含有缺陷的代码。大多数软件应用程序如此复杂,以至于理解需求并书写源代码来处理它们已经成为如此的难事,无论您多么小心,想要创建完全没有缺陷(我们称之为 bug)的系统事实际上是不可能的。

想想您组织中几乎所有的关键任务的应用程序,您会发现它们都是由上百个类和许多成千上万的代码构成的。为了便于理解并实现这样复杂的系统,在这个行业中,我们已经设计了新的技术,例如敏捷的开发过程。但即使利用短期的开发迭代和同行代码审查,但仍有大量缺陷隐藏在卖给客户的软件中。虽然他们是正确方向中的一个步骤,但是我们目前的过程是不够的。我们越来越需要自动化分析工具的辅助。

我们已经用了十几年动态分析工具。每个人都用运行时调试器调试过代码,或者用代码分析工具找过执行热点。但在开发周期中,我们使用这些工具的时间太晚了,以致于不能节省成本。找到问题的最佳时间是,当源代码被书写时审查它。有了静态分析工具的帮助,许多繁重的工作可以自动地被处理了。但是,要记住,静态分析只是另一个提高代码质量的工具,它不可以完全替代手工的代码审查。

本文将向您介绍 IBM® Rational® Software Analyzer 静态分析工具。本文的目的是逐渐地让您适应自动的代码分析,并且介绍一些为您的软件开发过程带来的好处。Rational Software Analyzer 是用来促使并简化代码质量中的自动改进的过程。它最初是 API 和用户接口,用于创建并将静态分析工具整合到其他的 Rational 产品,例如 Rational® Application Developer 和 Rational® Software Architect 中,但已经演进为完整独立的产品了。Analyzer 能让开发人员很容易地访问日常开发过程中的功能,例如自动的代码审查和结构分析。

“静态分析”指的是什么意思

静态分析因人而异。如果您纵观所有产品,那么您将发现许多公司声称提供静态分析工具。市场支持如此多的公司是因为静态分析的概念是很广的。许多公司只专注于 C++ 代码审查,而其他公司只提供 Java 程序设计语言的软件量度。一些工具就 Web 应用程序的安全问题分析代码,而其他的为相关性问题扫描代码。因而,静态分析是需要澄清的多样的且令人混乱的概念。

那么什么是静态分析?静态分析是研究没在变化的东西。但是,在软件术语中,该定义可以精炼为研究当前没有运行的源代码或二进制码。您已经知道了需要调试器或分析工具来分析运行的代码,但您还可以在不运行程序的情况下,从代码中了解很多。

举例来说,如果您简单地对所有源文件执行语法分析程序,那么您就可以确保源代码遵守预定义的编码标准。您还可以检测普遍的性能问题,例如即使方法生成的结果没有变化,还是调用该方法多次。您甚至可以分析每个类的导入,从而了解该类依赖于其他什么类,或者哪些类依赖于该类。这些都不需要对程序进行执行或编译。

虽然有许多类型的静态分析,但是根据它们提供的价值,可以分为一些常见的类别。当然,还有许多其他类型的静态分析,表 1 中列出了作为关于 Rational Software Analyzer 的本系列文章的主题的静态分析的关键类型和形式。

表 1. 最常见的静态分析类别
类型价值
代码审查这种类型的工具一般是执行自动的代码语法分析的,工具加载每个源文件,并将源文件通过语法分析器处理,寻找违反确定规则的特殊的代码模式。在一些语言中,例如 C++,许多这样的规则都内嵌于编译器中,或者存在于外部的程序中,例如 Lint。在其他语言中,例如 Java,编译器几乎不进行自动的代码审查。代码审查是强制实施编码标准,找寻基本的性能问题,并且找到可能的 API 滥用的良好工具。代码审查还包含更多层次的分析形式,例如数据流、控制流、类型状态等等。这些将在本系列的其他文章中进行讨论。
代码依赖性代码依赖性工具不是分析个别源文件的格式,而是分析源文件(一般是类)之间的关系,从而生成程序整体架构的映射。依赖性工具通常用于发现代码中已知的设计模式(好的)或普遍的反模式(坏的)。
代码复杂性复杂性工具分析程序代码,并且将其与已制定的软件量度进行比较,从而确定该程序是否是不必要的复杂。如果特殊的代码片断超出了给定的阀值,那么可以将其标记为重构的候选,来帮助提高可维护性。
趋势趋势分析不直接使用代码工件。而是基于其他形式的分析(本质上,它分析其他分析的结果),研究代码质量中的提高或退化。这些工具生成的结果一般提交给经理、执行者和客户,而不是开发人员,因为这些结果陈述了质量提高的方向,因此回答了问题:“代码会更好还是更糟?”

静态分析的好处

本文已经提到了一些在开发过程中进行静态分析的理由。这里重申一下,鼓励静态分析的两个基本且强制性的理由:节省时间并节省金钱。静态分析工具在时间节省方面相当明显:它花费您较少的时间获得较高质量的代码。许多研究,包括 IBM 内部进行的一些,都声称甚至简单的自动代码审查都会找到代码中 5 到 15% 的缺陷。

同样的研究声称您客户所报告的一个缺陷可能耗费 12,000 到 18,000 美元。如果您考虑一个在生命期中有一千个缺陷的大型软件,您会快速地发现使用自动的代码审查工具可以节省 600,000 到 270 万美元。不管您相信的程度有多大,静态分析工具潜在的成本节省是惊人的。

当然,避免客户报告的缺陷是减少成本的最明显的方式,并且您一般可以通过综合的测试过程来实现。但是,利用静态分析工具,例如代码审查,可以让您减少更多成本。

我们都看过如图 1 中所示的图,而很少有人会怀疑其背后的基本原理。在开发过程中尽早找到缺陷花费会更少,而利用简单的自动代码审查,您可以在项目的编码阶段开始找寻缺陷 —— 也许甚至在开发人员输入代码时。

图 1. 开发生命周期的不同阶段找到的缺陷的修复成本比较
开发过程中的成本趋势的图

另一方面的节省可能不那样明显。迄今为止,我们已经着重于开发人员如何利用静态分析节省时间和金钱,但客户如何呢?如果您的软件成本耗费客户时间或金钱,那么他们会投诉您。您希望客户购买并使用您的软件,因为您以可靠性著称。当您向您的开发过程中添加静态分析时,您的客户也会获得时间和金钱的好处。较高质量的代码意味着您的客户将不用浪费时间等待您修复他们报告的缺陷。此外,在客户等待的过程中,他们赚钱的能力不会受到妨碍。

Rational Software Analyzer 满足许多需求:

  • 首先,紧密地集成到 Eclipse、Rational Software Architect,或 Rational Application Developer 工作平台中,从而让开发人员在编写代码时可以充分地分析他们的代码。
  • 其次,可以利用命令行或 ANT 任务形式支持与现有链编系统的集成。完整的 API 能够让您不仅使用内嵌的分析技术和规则,还可以创建自己的。
  • 最后,在工作平台中,以导出的格式(例如 HTML)抽取分析结果并生成报告让开发人员、经理,和执行者能够评估整体的代码质量。

指定运行分析的规则

当您的工作平台中可以使用 Rational Software Analyzer 时,将在 Java、Debug,和 Plug-in Development 透视图中出现新的菜单和工具栏选项。在其他透视图中,您需要手工地启用这些特性:

  1. 在 Eclipse 菜单栏中,选择 Window > Customize Perspective(参见图 2)。
图 2. Customize Perspective 选项
下拉菜单的图
  1. 当出现对话框时,选择 Commands 选项卡,并单击 Rational Software Analyzer 复选框。
  2. 单击 OK 接受变更(图 3)。
图 3. Commands 选项卡视图
对话框的图

您将看到 Eclipse 工具栏和菜单上新的静态分析选项。这些选项能够让您创建、修改,并运行分析配置。

  1. 选择 Run > Analysis 菜单选项来显示主分析配置对话框。

您将看到的对话框非常像在 Eclipse 工作平台中运行或调试代码时使用的对话框。为了简单,该对话框被设计为与您已经使用过的对话框窗口类似的操作方式。您可以利用对话框左上角的按钮添加或删除分析配置。如名字所示,配置用来确定执行哪些形式的分析和哪些规则,以及分析的范围(举例来说,项目、工作集,或整个工作区)。

  1. 要开始,就选择配置对话框左边的 Configurations 列表中的 Analysis 元素,并单击 New 按钮。

您将注意到对话框右边变化为显示基本的配置接口。

配置分析

生成分析配置的第一步是指定您想要分析的资源的默认范围。您在 Scope 选项卡中选择所期望的范围。当前可用的选项是分析整体工作区、工作集,或一组项目。对于此实例:

  1. 创建新的配置,并在 Scope 选项卡上,选择 Analyze entire workspace 选项,如图 4 所示。
图 4. 指定您分析的范围
对话框的图

Rules 选项卡下,指定您想要执行的分析形式。您将注意到该选项卡显示出一个目录(树),您可以在上面选择或取消选择分析元素,并且该选项卡包含用于导入或导出规则选择的额外按钮。域树最顶层的节点是分析提供者,它表示分析框架所识别出的分析工具的类型。提供者包含许多类别,它们是松散地组织的规则或其他类别。规则通过定义在分析过程中生成结果的条件来执行过程中所有的重任。

树中每个节点前的复选框控制元素的启用状态。当选择或取消选择一个元素时,它所有的子节点都设置为相同的状态,这可以用来快速选择整个类别甚至整个树。对于此实例:

  1. 选择整个 Code Review for Java 分支。

注意:
不要担心您在分析配置对话框中看到的规则数与图 5 中显示的不同。许多 Rational 产品中都有 RCS 功能,并且所含的规则集都不同。

图 5. 分析配置对话框
对话框的图

一些规则将显示出额外的配置选项。在此情况下,Rules 选项卡下面的部分显示出规则的当前所有设置,要不然就为空。图 6 显示了对于一个 Java 软件量度规则的规则参数示例列表,让您对此有个感性认识。当规则以这种方式显示参数时,您可以调整它们来适合您的需要,并且新的值将自动地存储于规则选择中。

图 6. 规则参数的示例列表
对话框的图

运行分析并显示结果

  1. 要开始分析,单击 Analyze 按钮。

当您这样做时,您将看到 Eclipse 工作平台中的 Analysis Results 视图。根据您在进行的分析类型,结果视图可能不同。一些结果视图,像 Java 代码审查所提供的,支持以一种以上的格式查看结果(举例来说,表或树)。

如图 7 所示,如果您的分析配置选择了一种以上的分析类型(在此情况下为代码审查和架构发现),那么结果的视图将包含每个分析提供者的结果的选项卡。

图 7. Java Code Review 结果视图
对话框的图

提示:
如果您右键单击结果,那么您可以执行特别的任务,例如查看出现问题的源代码,或者用自动的结果“快速修复”问题,如果规则的作者已经提供了该规则的快速修复方法,那么这就是不重要的。

  1. 如果启用了 Quick Fix 菜单选项,那么选择它将带您经过纠正问题的过程。
图 8. Quick Fix 选项
弹出菜单的图

重要的是注意,用于显示结果的查看器是其包含的数据类型的功能。当查看结果时,您可能看到编辑器中打开源文件,并且带有高亮显示的文本,或 UML 图,或统计数据的表格。确实不存在查看结果的通用方法,这是由规则的作者确定的。对于 Java 代码审查分析提供者,所有的结果都显示为可编辑的 Java 源代码。

导出和报告

结果视图中可能也有一些其他的公共功能(这依赖于您正在执行的分析类型)。这些是以数据导出和报告的形式存在。

数据导出,如名字所指,允许您将原始的分析结果导出到文件中,一般是 XML 文件格式。导出数据的类型已经由分析提供者所决定,该功能将提供一列已知的数据导出,并且允许您选择要执行哪个(参见图 9)。

图 9. Analysis Reporting 视图
对话框的图

在许多方面,报告类似于数据导出。事实上,两个功能都共享导出程序。然而,报告生成可以在本地存储或直接写到远程 Web 站点的格式很好的页面。您可以获取任何现有的报告文件并修改它以适合您的需求(例如,添加公司标志)。生成的报告将类似图 10 和 11 中所示的内容,但由于报告引擎十分灵活,因此有其他变种。

图 10. Java 代码审查
分析报告的图
图 11. 饼图显示的 Java 代码审查严重性摘要
饼图

(可选)创建定制的规则和类别

除了 Rational Software Analyzer 所提供的规则和任何第三方开发人员贡献的规则以外,您可以根据模板,在不书写任何代码的情况下,创建定制的类别和定制的规则。要创建新的定制规则和类别:

  1. 选择 Window > Preferences 打开 Preference 页。
  2. 然后,在 Preferences 树中,选择 Analysis > Custom Rules and Categories(参见图 12)。
图 12. Preferences 中的 Custom Rules 和 Categories 视图
对话框的图
  1. 单击 Add Category 添加新的定制类别。

这将让您看到一个简单的向导,您可以在该向导中选择新类别的父类别和名字。定制类别的树形控件显示出任意定制类别的完整类别路径。只有之前定义的定制类别可以被删除。

  1. 单击 Add Rule 启动规则创建向导。

在向导的第一页,您可以选择规则位于分析类别树的什么位置。

  1. 在向导的第一页,选择一个类别并单击 Next
  2. 在向导的第二页,您将看到一列规则模板。选择您想要用作新规则的基础的规则模板。

注意到不是所有的分析提供者都支持定制规则。但是 Java Code Review 提供许多您可以自由支配的规则。

图 13. 创建定制规则时用的模板
对话框的图

在向导的最后一页,您将看到规则模板中定义的每个参数项。在图 14 中所示的实例中,所选的规则模板只定义了一个参数,因此,您可以在提供的文本框中只输入限定的类名。

  1. 使用 Browse 按钮浏览现有的类,或在文本框中手工输入有效的类名。
图 14. Assign Template Values(参数)视图
对话框的图
  1. 单击 Finish 按钮创建基于模板的规则,并将其添加到规则树中。

今后,您可以选择该规则作为任意分析配置的一部分。

下一篇文章

包含四部分的系列中的第一篇文章介绍了一般概念上的静态分析,并且阐述了 Rational Software Analyzer 的关键特性,它可以帮助您在开发生命周期的早期找到代码质量问题。在第 2 部分中,您可以进一步了解 Rational Software Analyzer 的 Java 代码审查功能。该文章将包含对利用已提供的 API 编写基本规则的深入研究,以及更多您可以用来用各种数据创建规则模板或规则的高级特性。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=332960
ArticleTitle=使用 IBM Rational Software Analyzer 进行静态分析,第 1 部分: 入门指南
publish-date=08252008