InfoQ

新闻

Klocwork Insight引领源码分析进入桌面时代

作者 Scott Delap译者 张凯峰 发布于 2008年7月20日 上午2时26分

社区
Java
主题
调试,
代码分析
今年年初Klocwork发布了一款桌面产品——Klocwork Insight, 这样每个开发人员都可以应用它的自动源码分析的特性。Insight分别有基于C++和Java的两个版本。目前行业现状是,大家都习惯于把源码分析放在 系统构建阶段的签入步骤之后进行。如今Insight把这一过程提前到构建和开发周期中的实现环节。从Java的角度来看,Insight可以以多种方式进行集成:
……Insight支持包括1.6在内的所有Java版本,而且不仅如此,它还增强了对各种流行的Java框架的支持,如Google Web Toolkit、AWT、Hibernate、JavaMail、J2EE和J2ME。它还支持Eclipse、IBM Rational Application Developer、Intellij IDEA、and JBuilder 2007 IDEs和ANT及Maven构建系统……

之前,Klocwork由于宣称发现开源项目存在大量缺陷成为新闻焦点,而这些缺限即使是早先国土安全部的研究也没有发现。

InfoQ最近与Klocwork的首席技术官(CTO)Gwyn Fisher就其产品进行了讨论。讨论的第一个主题是如何决定重点分析条目:

我们大量的研究工作都是以客户代码中实际发生的错误为基础进行的。开发缺限自动检测解决方案的现实情况是:你必须在“代码正确却被认定有错(误报)”和“代码错误却未被识别(漏报)”这两种情况之间达到一种动态平衡,用户使用产品的真实体验为我们指明了这种平衡点所在和努力方 向。最终我们是侧重于误报还是漏报则要根据使用报告(我们应用3D可视化技术定期对其进行极为细致地研究和分析)中体现出的形式而定。
Fisher补充说:要指出哪一类分析模块对于开发人员最困难不是一件容易的事。不过,缓冲区溢出是比较引人注意的一种类型,仅仅提供上溢/下溢可能发生的场景数目,以及可以区分真正的溢出和正常运行的程序的微妙之处,就能给出问题代码库的主要语义了。Fisher总结说,开发人员可能非常“确信”存储在配置数据或者从输入设备读入的值不会超出给定范围,因此由这些数据引起理论上的溢出就比较困难,即使它们实际上存在缺陷。

InfoQ提出的第二个问题是对于普通开发人员,Klocwork Insight的联机桌面分析特性会带来何种收益:

[GF]试着这样做:不起作用的代码不要签入,这很简单。联机桌面允许开发人员在签入之前进行本地代码分析,并且可以保证具有和集成构建分析相同的准确性和上下文环境。

通过一个例子我们可以更清楚地描述这个问题。假定有个开发人员,我们估且称他为Jim,他工作在一种典型的消费者模式 下,就是说他的工作依赖于同一办公间里另外一位开发人员。当通过分析认定Jim的程序正确时,一方面我们要告诉他代码写得不错,另外一方面我们要了解他调 用的代码怎样工作,这样我们就可以确认他的代码与他调用的代码之间的交互关系也是正确的。

没有分布式上下文环境,分析引擎不能断定null对象传给foo()方法是否会引发问题;也不能分辨foo()方法是否能返回一个可用的对象。但是有了这个上下文环境,所有这些灰色区域就可用实际的分析取而代之。引擎可以知道foo()的内部机制,即使你的本地根本就没有这段程序,如果你打算做什么愚蠢的事情,那么它会像在集成构建分析过程中做到的那样来提醒你。

分析精确性中的这种等效性在几个方面获得了回报,其中生产率是最为明显的。但是如果你考虑公司实现代码分析面对的文化阻碍,那它就更 具吸引力了。典型的,一般公司都会将代码分析作为审计工具整合进集成构建过程,重视报告并将之视为交互点。这要求必须建立如下工作流程之一:强制要求开发人员暂停手头工作,访问报告程序,以查找个人所犯错误;或者由上级通过e-mail给每个人发送错误通知。

不过,还是把进行准确、快速和有效地分析代码的权力放到开发人员手中吧,摒弃那种“问责怪圈”,集中精力让开发者从起步时就创建出高品质、高安全性的代码。

就此InfoQ希望Fisher先生能比较一下Klocwork和流行开源工具FindBugs:

FindBugs是一款很优秀的工具,我非常欣赏Bill Pugh为此所做的出色的工作以及无偿分享其产品。大多数人第一次接触的Java代码分析工具都会是他的产品,总的来说对市场是有利的。我们同 FindBugs的不同之处在于分析的深度,可发现缺限的数量和种类。特别是,FindBugs偏重于一种内部程序缺限,就是通过在一个特定方法内跟踪控制流和数据流来分析错误(实际上如果开发者能够注释他们的代码以详述预期的行为,他们就可以扩展这种分析,不过这就有点欺骗的意思了;P)。Klocwork的分析是在程序间进行的,这意味着我们可以发现跨类、跨包甚至跨模块边界方法调用的缺限。这种“程序整体”分析就是商业静态分析所能做的事情。

最后,InfoQ请Fisher先生比较一下在编写Klocwork C++分析工具和更新的Java分析工具时的体会。他解释说,在Klocwork的观点来看,写一个好的代码分析工具的基础在于编译器。对于Java,他们起初很乐观的打算分析调试模式下的字节代码,因此不需要再写一个编译器。然而这种方法后来被证明不是那么有效。除了编译器外,编写Java版本的最为重要的投资是关于检验程序库,因为要确保为市场提供一个与现存产品(C++版本)同样完美的引擎。目前,Klocwork支持的每种语言所含有的检验程序几乎一样多(大概每种语言有175个)。

查看英文原文:Klocwork Insight Brings Code Analysis to the Desktop

1 条回复

回复

工欲善其事,必先利其器 发表人 Junyin Wu 发表于 2008年7月20日 上午3时2分
  1. 返回顶部

    工欲善其事,必先利其器

    2008年7月20日 上午3时2分 发表人 Junyin Wu

    因为对JAVA领域不熟悉,所以对FindBugs不太了解,不知道是否在.NET和C++领域有啥类似的工具没有?

独家内容

剖析短迭代

敏捷教练Dave Nicolette提出:我们应该如何设定迭代长度?是要根据发布周期的时间么?使用短迭代又有哪些好处?

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。