Case Studies

Riverblade

加速 PC-lint C++ 代码分析

2009 年 3 月 29 日——Anna-Jayne Metcalfe,Riverblade

摘要

本文介绍了 Riverblade 如何使用 Incredibuild  接口加速 PC-lint C++ 代码分析,以便采用传统方法在很短的时间内完成 Visual Studio 解决方案的静态分析。

PC-lint 可分析 C++ 源代码,如果被分析的代码使用使用 Windows SDK 头文件或拥有大量内部依赖项,那么使用其进行分析可能会非常耗时。Riverblade 的解决方案拟采用 Xoreax Incredibuild 接口扩展包,以便将 PC-lint 分析任务分配给网络上的空闲开发设备。通过这种方式,我们可以观察到,相较于传统单线程分析方法,这种方式能够让速度提升 17 倍。

难点

Riverblade 提供 Visual Studio 集成和代码分析工具,其中最著名的是Visual Lint (www.riverblade.co.uk/products/visual_lint)——一款将 Gimpel PC-lint C++ 代码分析工具直接集成到 Visual Studio 开发环境中的产品:

任何使用过静态代码分析工具(尤其是 PC-lint)的人都知道,它们可以非常彻底,但是完成一个代码库的完整分析,要比编译相同的代码所需的时间更长。考虑到分析的深度,这是一个合理的表现,但在某些情况下,运行分析所需的时间可能会是一个问题,反而会抑制代码分析工具的使用。

利用多核处理器完成 PC-lint 代码分析,使分析运行速度显著快于传统命令行驱动的流程,是 Visual Lint 的设计初衷之一。在这方面它表现不错——例如,在双核系统上运行时,通常能够将分析时间缩短一半。然而,由于桌面处理器内核数量的演变通常是一个缓慢的过程(而且也受制于磁盘和存储器 I/O 瓶颈的潜在影响),仅采用这种方法对分析时间进行的任何进一步改进,从根本上而言都是有限的。

为了在不用等待内核比当前设计更多且更快的处理器面市的情况下,进一步缩短分析时间,显然需要做的是,利用网格计算技术将分析任务分布在网络上的多台设备上运行。事实上,Riverblade 已经酝酿了一段时间,但直到最近,我们才找到了适合我们用途的工具包。

备用方案

有多个传统方法可加速运行 PC-lint 分析:

  • 购买内核数量更多且更快的设备
  • 减少需要进行分析的代码库中的包含依赖项
  • 使用 PC-lint 9.0 预编译和绕过头文件功能来缓存常用包含文件定义

虽然全新 PC-lint 9.0 对预编译/头文件绕过的支持展现出了不错的前景(我们的测试表明,它可以将我们自己的代码库的分析时间缩短三倍),但我们的经验表明,在并行分析场景中,它需要大量工作来正确地进行配置,且可能会(至少在 PC-lint 9.00b 中)产生常规 PC-lint 分析中不存在伪分析错误。

因此,从根本上而言,所有这些解决方案都限制了其可实现的收益,并且可能需要大量的时间和/或资本投入,才能获得可能是相当有限的益处。

解决方案:VISUAL LINT 和 INCREDIBUILD

几个月前,我们了解到 Incredibuild(我几年前遇到的一款产品,但由于我们的构建时间很短,当时没有直接需求)现在可通过接口扩展包支持通用网格计算外部接口。鉴于我们制定了使用网格计算技术进一步加速 PC-lint 分析任务的长期目标,这显然是一个潜在的解决方案,因此我们必须进行调研。

在可用的接口(XML,Automatic Interception和Submission)中,XML 接口似乎最适合我们的要求,因为它能够让我们详细地规定每个任务的属性,并且分析任务完成后直接接收原始分析结果。

我们发现 XML 接口相对简单直接,尽管一开始在具体识别特定任务输出方面存在一些困难(通过以稍微非标准的方式使用 SourceFile 和接口的输出属性解决了问题),我们很快就有了一个可工作的 Visual Lint 开发构建,它能够使用 IncrediBuild 来运行 PC-lint 分析任务。

使用这一组合进行测试的结果(至少可以说)非常显著。仅使用六个Agent(四个双核和两个四核桌面系统),我们便能够在 15 分钟多一点的时间内完成对 Visual Lint 代码库的完整分析——较单线程分析速度提升了十七倍。

益处

将 Incredibuild 支持集成到 Visual Lint 中,使我们能够花比以前更少的时间对我们自己的代码库进行完整的静态分析。因此,我们现在能够更快地识别并纠正任何回归问题(通常出现在重构或新功能开发过程中)。

此外,Incredibuild 接口能够让我们将该功能以很低的成本集成到我们的产品中,如果我们尝试自行实施网格计算代码分析,所产生的成本将是这个成本的几倍。它还通过 Incredibuild 构建监视器提供了一个非常清晰的可视化分析任务进度,当然,该监视器也与 Visual Lint 显示界面一并集成至了开发环境中。

总结

Visual Lint/Incredibuild 集成解决方案能够让开发人员在很短的时间内执行通常非常耗时的 PC-lint 代码分析操作,极大地提高了代码分析效率。

分析时间
4小时Without Incredibuild
15分钟With Incredibuild