源码检测包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。
介绍
源码检测
(一些源码检测工具)
源码检测包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。
Findbugs介绍
Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。
安装及运行(非插件版)(后文都是基于非插件版)
依赖
必须:
Jdk7u(新版ant编译时会报错)
- 解压至/usr/local
配置环境变量vim /etc/bash.bashrc
1
2
3
4export JAVA_HOME=/usr/local/jdk1.7.0_80
export JRE_HOME=/usr/local/jdk1.7.0_80/jre
export PATH=$PATH:/usr/local/jdk1.7.0_80/bin
export CLASSPATH=./:/usr/local/jdk1.7.0_80/lib:/usr/local/jdk1.7.0_80/jre/libsource并查看version
Ant-1.9.x(https://ant.apache.org/bindownload.cgi)
- 解压至/usr/local
配置环境变量vim /etc/bash.bashrc
1
2
3#set Ant enviroment
export ANT_HOME=/usr/apache-ant-1.9.2
export PATH=$PATH:$ANT_HOME/binsource并查看version
Git
非必须:
安装findbugs
- 下载源码:https://sourceforge.net/projects/findbugs/files/findbugs/3.0.1/findbugs-3.0.1-source.zip/download?use_mirror=jaist&download=
- 进入目录后运行ant build
配置环境变量vim /etc/bash.bashrc
1
2
3#set findbugshome
export FINDBUGS_HOME=/usr/local/findbugs-3.0.1
export PATH=$PATH:$FINDBUGS_HOME/binsource激活
运行findbugs
输入命令findbugs直接进入gui,或者带命令行
基本原理
它主要用到的技术是缺陷模式匹配和数据流分析:
缺陷模式匹配
事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
数据流分析
数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行 分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的 数据域特性。
检测对象
FindBugs检查.class文件,基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug。主要检查bytecode中的bug patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等。
检测能力
Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,23种Performance,43种Dodgy。
1) Bad practice 不佳实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配(如重写equals但没重写 hashCode,或相反情况等)
2) Correctness 可能导致错误的代码(如空指针引用、无限循环等)
3) Internationalization 国际化相关问题(如错误的字符串转换等)
4) Malicious code vulnerability 可能受到的恶意攻击(如访问权限修饰符的定义等)
5) Multithreaded correctness 多线程的正确性(如多线程编程时常见的同步,线程调度问题等)
6) Performance 运行时性能问题(如由变量定义,方法调用导致的代码低效问题等)
7) Security 安全问题(如HTTP,SQL,DB等)
8) Dodgy code 导致自身错误的代码(如未确认的强制转换、冗余的空值检查等)
使用方法
FindBugs有两种使用形式,一是作为插件,放在Eclipse中使用,二是提供软件运行。而作为插件的形式比较方便简单,个人觉得使用起来比较合适。
深入理解findbugs
- Findbugs不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 观察者模式,检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。PMD也是一款静态代码分析工具,它是分析Java源文件。
可以下载到源代码,对源代码进行分析。
1)src/jui包是Findbugs开发UI界面使用到的包,src/junit是单元测试包,里面包含有对很多类的测试用例。etc文件下是包含的一些配置文件。
2)src/tools包下面有四个子文件夹,里面包含的是一些公用的工具类,比如打印bug描述,生成xml文件等。
3)src/antTask包下面是针对Ant的一些类。
4)最主要的就是src/java包下面的将近50个子文件夹,如下(未截完):
该工具自带了一些检测器,于此同时,开发者可以根据自己的需求设计编写特定于应用程序的缺陷检测器。
5)有一个专门的文件夹edu.umd.cs.findbugs.detect,里面包含该工具提供的所有检测器,FindBugs 利用了 Byte Code Engineering Library,或称为 BCEL,以实现其检测器。所有字节码扫描检测器都基于 visitor 模式,FindBugs 实现了这个模式。它提供了这些方法的默认实现,在实现自定义检测器时要覆盖这些方法。我们将侧重于两个方法——visit(Code)和sawOpcode(int)。在 FindBugs 分析类时,它会在分析方法内容时调用visit(Code)方法。与此类似,FindBugs 在分析方法正文中的每一个操作码时调用sawOpcode(int)方法。
定制规则
很棒的参考:
编写完自定义的规则后配置两个xml文件然后使用ant重新打包生成即可
关于如何编写规则
- FindBugs利用了BCEL字节码程序设计库,这个设计库专门用于分析java字节码,简明教程,其api文档
- 需要熟悉fingbugs检测器提供的api
规则整理
参考文献
SpotBugs
SpotBugs是Findbugs的继任者,Findbugs已经不再维护,不过SpotBugs继承了绝大部分Fingbugs的代码结构。