静态代码扫描工具fireline

背景

  • firline(火线)是360 搞的一款移动端的静态代码扫描工具,现在火线在360公司app的发布流程中是必不可少的环节,目前火线在360发布流程中已累计运行超过500天,扫描文件数2千万+,扫描代码量超过45亿行。火线最近推出的Android Studio插件360 Fireline Plugin下载量已达到4000+。
  • 火线拥有四大规则:
    • 安全类:和360信息安全部分合作,根据最权威的SDL专门定制,每一条SDL都有真实的攻击案例。
    • 内存类:各种资源关闭类问题检测。
    • 日志类:检测日志输出敏感信息内容的规则。
    • 基础类:规范类、代码风格类、复杂度检查规则。

使用方法

  • 详细可以参考官网的介绍使用手册
  • 我们这里重点来介绍下如何自定义规则。

自定义规则

下载fireline.jar

  • 先去官网下载fireline.jar
  • 然后将fireline.jar解压到当前目录,方便修改其文件。
  • 看下解压后的目录结构:
    pmd_folder

以xpath 方式自定义pmd规则

  • 以xpath方式定义的规则,只需要修改xml目录下的文件,如下图所示目录:
    pmd_path

  • 在PMD_RedLineRule_All.xml中添加一个rule,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!--用于测试-->
<rule xmlns="" class="net.sourceforge.pmd.lang.rule.XPathRule"
externalInfoUrl="${pmd.website.baseurl}/rules/java/empty.html#EmptyFinallyBlock"
language="java"
message="While With brance"
name="WhileLoopsMustUseBracesRule"
since="0.4">
<description>
WhileLoops Must use braces Rule.
</description>
<priority>1</priority>
<properties>
<property name="xpath">
<value>
//WhileStatement[not(Statement/Block)]
</value>
</property>
</properties>
<example>
public class PmdWhileTest {
public void testWhile(){
int i = 0;
while (i != 0)
i++;
System.out.println("this is a test");
}
}
</example>
</rule>
  • 在RedLineRule_All.xml中添加一个中文描述的规则:
1
2
3
<rule id="67" name="WhileLoopsMustUseBracesRule" cname="While循环" risk="冗余" priority="1">
<description><![CDATA[java代码中While循环不能不用括号。]]></description>
</rule>
  • 综上,只需要修改这两个配置文件就可以了。还是比较简单方便的。

写java文件定义的规则

  • 这种方式需要在pmd源码中编译pmd-core(如果有改动)和pmd-java。进入它们对应的目录,执行:
1
mvn clean package
  • 将编译得到的jar文件复制到fireline目录下,替换里面的对应的jar。

重新打包jar

  • 在fireline的上层目录下面,执行命令:
1
2
## 这里的MANIFEST.MF是jar的配置清单,必须有,否则会报【没有清单文件】的错误
jar cvfm fireline.jar fireline/META-INF/MANIFEST.MF -C fireline/ .

进行扫描

  • 接下来就可以用编译的jar进行扫描了。
1
java -jar D:\worktools\fireline.jar -s=E:\javaworkspace\MineDemo\src\com\liwei\pmd\PmdWhileTest.java -r=F:\360FireReport

总结

  • 火线已经对规则过滤的非常好了,所以一般情况下不需要自定义规则,除非有和自己业务相关的代码需要规则来约束。