0.前言
PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工程里往往用于配置文件,像web的ssm框架里的applicationContext.xml或者是sqlMapConfig.xml等等.在安卓工程里同样会使用xml,本文主要以安卓的配置清单--AndroidManifest.xml做基础来讲解.
1.准备
知识准备:http://www.w3school.com.cn/xpath/ xpath语法学习
工程准备:
需要有PMD-bin工程,我选择5.7.0版本,目前最新是6.xx的.(新增了几个语法,对rule分类做了调整)
打开本地的 \pmd-bin-5.7.0\bin\designer.bat
-->选择左上角,language下的XML
讲解下PMD Rule Designer这个GUI的几个分类:
a)Source Code就是写我们要查的代码的地方,java代码必须具体到class(导包无所谓),不能只是method;xml代码必须有文档声明,每个元素必须正确结尾.
b)xpath query是写xpath做设计测试的地方,有三个xpath的语言版本可选择,2.0的xpath语法扩展了for,return,if,else等语法,在操作上有更多步数和设计余地.选择的语言版本稍后讲解.
c)AST Tree 就是抽象代码树,下方的栏目是封装的scope及提醒了你xpath能拿到的属性,另一个分页是DFA数据流,目前PMD支持的不太好.
d)右下角,则是告警的地方,显示几行几列,什么节点处.
另外需要PMD的master工程,将其导入到eclipse里.你可以只导入core和xml子工程.
2.分析设计
使用的代码示例如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tk.jianmo.study" android:versionCode="2" android:versionName="2.0" >
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" >
<service android:name=".killpoccessserve"/> />
<activity android:label="@string/app_name" android:name=".MainActivity"
android:exported="false" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
</manifest>
使用xpath定制规则,我们的核心是写出xpath语句,而后续配置是很简单的.
需求:寻找不暴露的activity,也就是查找exported为false的activity标签.
这是非常简单的需求!你知道xpath语法后,你觉得可以这样找://activity[@android:exported = 'false'] 先找节点,然后看对应的属性是否为相应的值.其实这样就错了.为什么?我们首先第一步是要去分析PMD解析的AST,下图中发现,工具提供的activity这个节点,对应的attribute没有我们想要的,更不存在android:exported!所以肯定是失败.

其实这里是一个坑.在xpath语法中可以通过@属性来获得对应属性的情况,但是在PMD里的不行,原因是AST解析的不同.怎么办呢?笔者最终在stackoverFlow上找到一个方法.如下格式即可.

//activity[@*[name()=‘android:exported’ ]=‘false’] (版本xpath1.0 试过2.0不行)先拿activity,再@*从所有属性匹配,再匹配符合的值。这样我们就满足了需求.以下是designer细节:

所以我们要配置的xpath代码就是: //activity[@*[name()=‘android:exported’ ]=‘false’] 并且选择1.0的语言版本

3.配置执行
打开PMD工程,打开pmd-xml子工程如果是你最新版,会是如下,如果是5.几版本相应的xml规则在ruleSets里.

打开errorprone.xml文件(其他都还是空的),发现里面就是rule的配置方法.(细节不懂的可以去https://pmd.github.io/),具体rule节点一般如下:

   <rule name="规则名字"
language="xml"
since="5.0"
message="规则信息"
class="net.sourceforge.pmd.lang.rule.XPathRule" 必须配置,意味着该规则交给XPathRule类做分析
externalInfoUrl="规则解释链接,一般不需要,如果公司有对应安全库网站,可以配置相应url">
<description>   这里是规则的描述
</description>
<priority>3</priority>
<properties>
      <property name="version" value="1.0" /> 添加这行,可以配置xpath对应语言版本
<property name="xpath">
<value>
<![CDATA[
规则代码例如: //activity[@*[name()='android:exported']='false']
]]>
</value>
</property>
</properties>
<example>
<![CDATA[
规则场景代码
]]>
</example>
</rule>

复制一份xml,到该resources文件下,然后按上文配置即可. 具体的程序启动就不细讲了~~官网都讲了.

静态代码扫描工具PMD定制xml的规则(一)操作篇的更多相关文章

  1. Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)

    目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...

  2. Lint——Android SDK提供的静态代码扫描工具

    Lint和FindBugs一样,都是静态代码扫描工具,区别在于它是Android SDK提供的,会检查Android项目源文件的正确性.安全性.性能.可用性等潜在的bug并优化改进. 下图简单地描述了 ...

  3. 静态代码检查工具-PMD初学者入门篇

    前言: PMD是一款静态代码分析工具,它能够自动检测各种潜在缺陷以及不安全或未优化的代码. PMD更多地是集中在预先检测缺陷上,它提供了高度可配置的丰富规则集,用户可以方便配置对待特定项目使用那些规则 ...

  4. 静态代码检查工具-PMD刚開始学习的人入门篇

    前言: PMD是一款静态代码分析工具.它能够自己主动检測各种潜在缺陷以及不安全或未优化的代码. PMD很多其它地是集中在预先检測缺陷上.它提供了高度可配置的丰富规则集,用户能够方便配置对待特定项目使用 ...

  5. iOS开发之使用 infer静态代码扫描工具

    infer是Facebook 的 Infer 是一个静态分析工具.可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题. 任何人都可以使用 infer 检测应用,可以将严重的 ...

  6. 静态代码扫描工具使用教程 - SonarQube+SonarScanner

    预置条件: Jdk已安装 Mysql已安装 1. 下载 SonarQube和Sonar scanner. SonarQube: http://www.sonarqube.org/downloads/ ...

  7. 【Lua篇】静态代码扫描分析(一)初步介绍

    一.静态代码分析         静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段.通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问 ...

  8. Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果

    为了规范代码,我们一般会集成静态代码检测工具,比如PMD.FindBugs.Checkstyle,那么Jenkins如何集成这些检查工具,并把检查结果放到构建邮件里呢? 今天做了调研和实现,过程如下 ...

  9. Findbug插件静态java代码扫描工具使用

    本文转自http://blog.csdn.net/gaofuqi/article/details/22679609 感谢作者 FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具. ...

随机推荐

  1. FFmpeg 2.1 试用(新版支持HEVC,VP9)

    前两天帮一位老师转码图像的时候,无意间发现新版FFmpeg竟然支持了下一代编码标准HEVC,以及Google提出的下一代编码标准VP9.真心没想到FFmpeg对下一代的编码标准支持的是如此之快.我还以 ...

  2. 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章

    菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...

  3. Android的启动过程分析(从进程和Framework的角度)-android学习之旅(98)

    Android的启动过程包含从Linux加载到home程序运行的过程,如下图所示: 1.linux内核: Android是基于Linux内核的系统平台.启动时,首先通过bootloader加载LInu ...

  4. MakeFile 文件的作用

    makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefi ...

  5. 如何在asp.net mvc 中使用Autofac 控制反转(Ioc)

    前言 最近看了一些关于Ioc方面的开源项目,里面的类跳来转去,看的迷迷糊糊的.项目里根本不需要这么“复杂的”设计,只需简单完成Ico,达到解耦的目的,并且能高效的完成项目.于是参考autofac的官网 ...

  6. JAVA代码设置selector不同状态下的背景颜色

    代码实现Shape 代码实现Selector StateListDrawable与GradientDrawable 的运用 在Android开发中,我们时常会用到自定义drawable样式,在draw ...

  7. JavaScript中两个对象数组 属性undefined

    var BaiduUsers = []; var UserArray = function(name, phone, id, id2) { this.name = name; this.phone = ...

  8. Socket.io文字直播聊天室的简单代码

    直接上代码吧,被注释掉的主要是调试代码,和技术选型的测试代码 var app = require('express')(); var server = require('http').Server(a ...

  9. Sina微博爬取@pyspider

    这是一篇不应该写的文章,都写了,针对特定“方式”的爬虫也就没法爬了. 1.模拟登录的一些文章: 解析新浪微博的登录过程(2013-12-23): http://www.cnblogs.com/houk ...

  10. JavaScipt浅谈——全局变量和局部变量

    全局变量的作用域为所属的整个程序. 全局变量的定义形式有: (1)在函数外定义 (2)在函数内定义,但不加var声明        (3)使用 window.变量名 的形式定义         (4) ...