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. web报表工具FineReport的SQL编辑框的语法简介

    感谢大家捧场,这里继续分享关于SQL编辑框的一些语法心得总结,因为数据集定义的面板,也是FineReport报表中最常用的模块之一. 1.我理解的执行过程. 这里其实是生成一个字符串,FineRepo ...

  2. ubuntu安装qq教程

    安装策略是wine+wine QQ TM2013,wine QQ TM2013是一款专门为wine进行优化的版本 我的ubuntu系统是14.04版本,64位 1. sudo apt-get inst ...

  3. Mysql创建索引

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  4. minimun path sum(最小路径和)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  5. Spring 框架的优点及缺点

    首先Spring 是一个框架,使用Spring并不代表代码质量的提高,就像盖房子选择用上海的地皮还是北京的地皮一样,房子质量与土地所在的城市无关,与房子的具体设计方案和选料有关. 使用Spring 等 ...

  6. [C#网络应用编程]2、对线程的管理

    在System.Threading命名空间下,有一个Thread类,用于对线程进行管理,如创建线程.启动线程.终止线程.合并线程.让线程休眠等 Thread类 (假设Thread firTh = ne ...

  7. Android Studio使用手记

    1.官方的Tip and Tricks:http://developer.android.com/intl/zh-cn/sdk/installing/studio-tips.html 2.项目的目录树 ...

  8. SharePoint2013 功能区的配置

    遇到了很多次对网站功能区个性化定义的任务,包括标签按钮之类的修改,每次都要重新翻书,这次总结一下,留作备用. 添加内容 下面的XML我认为主要的内容是四部分,一个是CommandUIDefinitio ...

  9. MQTT入手笔记

    MQTT服务官网:http://mosquitto.org/download/ 在unix系统按照以下步骤运行并启动mqtt服务: 1. # 下载源代码包wget http://mosquitto.o ...

  10. 基于Python的数据分析(3):文件和时间

    在接下来的章节中,我会重点介绍一下我自己写的基于之前做python数据分析的打包接口文件common_lib,可以认为是专用于python的第三方支持库.common_lib目前包括文件操作.时间操作 ...