Jenkins 之 Java 代码检查

一、名词解释:

在java中代码检查分为 静态代码检查 和动态代码测试,但是他们主要有什么区别呢?

静态代码检查是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。

动态代码测试主要是指单元测试和集成测试,是用来验证我们代码的业务逻辑、数据结果、算法等是否符合预期,前提条件是被测代码需要处于运行状态;

由此可见他们的适用范围和侧重点都是不一样的。

二、Java 静态代码分析理论基础和主要技术:

  • 缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
  • 类型推断:类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。
  • 模型检查:模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。
  • 数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的数据域特性。

三、现有主流 Java 静态分析工具

Checkstyle

Checkstyle 是 SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。

②FindBugs

FindBugs 通过检查类文件或 JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。

③其它:PMD、Jtest 不做讨论;

Checkstyle  与 FindBugs 的主要区别:

从名字上就应该能够猜出一二来,Checkstyle  主要用来检查编码样式、编码规范,FindBugs 才侧重于查找问题;事实上也确实如此。

四、Jenkins 中 FindBugs的使用:

  • 下载FindBugs插件,并安装;
  • 被测代码的pom中添加findbugs插件:
  • <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>findbugs-maven-plugin</artifactId>
       <version>1.2</version>
       <configuration>
          <findbugsXmlOutput>true</findbugsXmlOutput>
         <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
          <xmlOutput>true</xmlOutput>
          [...]
       </configuration>
    </plugin>
  • 构建命令:clean install findbugs:findbugs   而非 clean findbugs:findbugs  install
  • Job配置,构建后操作,Publish Findbugs analiysis results

备注:需要了解更多Java的静态检查工具的,参考下图:

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s