定制 findbugs规则

2023-11-08



come from: http://www.51testing.com/html/97/13997-211893.html


  Findbugs是著名的开源java静态代码分析工具,基于bytecode扫描,具备数据流分析能力.操作很简单,可以下载单独的swing图形化工具也可下载eclipse插件运行. 原理请参考A Comparison of Bug Finding Tools for Java


这类文章极少,字节码操作需要对becl库及jvm字节码操作有一定常识。参考:

http://blog.csdn.net/lywybo/archive/2010/03/01/5335748.aspx

http://javadevelopmentforthemasses.blogspot.com/2008/09/custom-findbugs-detectors-and-maven.html

https://www.ibm.com/developerworks/cn/java/j-findbug2/

 

ibm介绍的原理实用,但配置过时;支付宝朋友写的message.xml/findbugs.xml不够详细且有笔误。

 

1.1      准备

下载findbugs:http://sourceforge.net/projects/findbugs/files/findbugs/1.3.9/findbugs-1.3.9.zip/download

 

修改build.xml ,去除所有的validate依赖。执行ant编译。

eclipse引入findbugs工程

 

1.2      实现类

直接在findbugs目录中增加类

 

packageedu.umd.cs.findbugs.detect;

importorg.apache.bcel.classfile.Code;

importedu.umd.cs.findbugs.BugInstance;

importedu.umd.cs.findbugs.BugReporter;

importedu.umd.cs.findbugs.bcel.OpcodeStackDetector;

 

/**

 *@authorbo

 *这个规则类用于判断System.outSystem.error这种情况

 */

publicclassForbiddenSystemClassextendsOpcodeStackDetector{

 BugReporterbugReporter;

 

 publicForbiddenSystemClass(BugReporter bugReporter) {

 this.bugReporter= bugReporter;

 }

 

 /**

 * visit方法,在每次进入字节码方法的时候调用

 *在每次进入新方法的时候清空标志位

 */

 @Override

 publicvoidvisit(Code obj) {

 super.visit(obj);

 }

 

 /**

 *每扫描一条字节码就会进入sawOpcode方法

 *

 *@paramseen 字节码的枚举值

 */

 @Override

 publicvoidsawOpcode(intseen) {

 if(seen ==GETSTATIC) {

  if(getClassConstantOperand().equals("java/lang/System")

          && (getNameConstantOperand().equals("out") || getNameConstantOperand().equals("error"))) {

   BugInstance bug =newBugInstance(this,"ALP_SYSTEMCLASS",NORMAL_PRIORITY).addClassAndMethod(this)

           .addSourceLine(this, getPC());

   bug.addInt(getPC());

   bugReporter.reportBug(bug);

  }

 }

 }

}

1.3      修改etc目录配置文件findbugs.xmlmessage.xml

不支持中文注释。

findbugs.xml增加内容。

<Detectorclass="edu.umd.cs.findbugs.detect.ForbiddenSystemClass" 

  speed="fast"

    reports="ALP_SYSTEMCLASS"

    hidden="false"/>

 

<BugPatternabbrev="LIANGJZFORBIDDENSYSTEMCALSS"type="ALP_SYSTEMCLASS"category="EXPERIMENTAL" />

 

 

Message.xml增加:

 

<Detectorclass="edu.umd.cs.findbugs.detect.ForbiddenSystemClass">

  <Details>

   <![CDATA[

   <p>category:detector find System.out/System.error

   <p>please use log4j

   ]]>

  </Details>

 </Detector>

 

<BugPatterntype="ALP_SYSTEMCLASS">

   <ShortDescription>short desc:System.out/error</ShortDescription>

   <LongDescription>class={0},method {1}long desc:System.out,please use log4j</LongDescription>

   <Details>

 <![CDATA[

   <p>detail info see log4j document</p>

 ]]>

   </Details>

 </BugPattern>

 

 

 

1.4      findbugs图形化界面测试

点击bin/finbugs.bat,打开扫描的.class目录。看到扫描带System.out或者System.error.class放到experimental类错误时,验证成功。

 

1.5      替换eclipse findbugs-plugin.jar文件

winrar打开

D:\devtools\eclipse_3.5.1\plugins\edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821\findbugs-plugin.jarmessage.xml,findbugs.xml,z加入二进制的edu.umd.cs.findbugs.detect.ForbiddenSystemClass

 

重启elipse,还需要确保experimental类的错误能在findbugs窗口展现:windows->preferences->java->findbugs->reporter configuration上的experimental选项勾上。

 

 

 执行findbugs扫描.class,看到结果出现..

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定制 findbugs规则 的相关文章

  • Keytool 应用程序在哪里?

    我需要在android中使用mapview控件 但我似乎不明白如何运行keytool 是用eclipse安装的吗 我好像找不到下载链接 Thanks keytool http docs oracle com javase 7 docs te
  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 基于内容的图像检索技术(1):从特征到检索

    作者 赵丽丽 链接 https zhuanlan zhihu com p 46735159 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 基于内容的图像检索 CBIR Content Based Image
  • 解决pandas中boxplot函数默认添加大标题“Boxplot grouped by ”

    问题 如何删除下图的 Boxplot grouped by path num 生成上图的代码 fig ax plt subplots figsize 8 6 df df path num 2 boxplot column travel ti
  • 【软件工程

    概念 耦合 coupling 是对两个模块之间联接程度的一种度量 模块间的依赖程度越大 则其耦合程度也就越大 反之 模块间的依赖程度越小 则其耦合程度也就越小 很显然 为了使软件具有较好的可维护性和可修改性 模块间的关联程度即耦合程度应越小
  • 网络安全鹰眼靶场(基础关)

    目录 前言 key在哪里 再加密一次你就得到key啦 猜猜这是经过了多少次加密 据说MD5加密很安全 真的是么 种族歧视 HAHA浏览器 key究竟在哪里呢 key又找不到了 冒充登陆用户 比较数字大小 本地的诱惑 就不让你访问 前言 靶场
  • CodeSmith 使用教程(3): 自动生成Yii Framework ActiveRecord

    上例介绍了使用CodeSmith编写代码模板的基本方法 本例实现一个较为实用的代码模板 通过数据库自动为Yii Framework生成所需要的ActiveRecord 类 本例通过修改Yii Framework 开发教程 26 数据库 Ac
  • numpy明明有高版本却显示版本不够

    不知道和我上篇文章添加Jupyter notebook代码提示是否有关系 大概率 在进行导入numpy库的时候出现了以下问题 真的特别离奇 我之前都用得好好的 怎么突然不行了 接下来就对库版本进行折腾 以下操作均在管理员运行的Anacond
  • 全球计算机出货量排名,2018年全球电脑出货量排名:联想夺冠,惠普戴尔分列二三...

    作者 虎龙吟 美国当地时间2019年1月10日 Gartner发布了2018年全球个人电脑出货量数据报告 根据Gartner发布的数据 2018年第四季度 全球个人电脑出货量达到6860万台 比2017年第四季度下降了4 3 根据Gartn
  • chatglm2-6b在P40上做LORA微调

    背景 目前 大模型的技术应用已经遍地开花 最快的应用方式无非是利用自有垂直领域的数据进行模型微调 chatglm2 6b在国内开源的大模型上 效果比较突出 本文章分享的内容是用chatglm2 6b模型在集团EA的P40机器上进行垂直领域的
  • 萌妖出没服务器维护电视版,萌妖出没-萌妖出没手游官网版预约-9k9k手游网

    萌妖出没是一款根据经典动漫改编而成的策略竞技手游 游戏中还原了众多经典的场景 玩家在玩游戏的过程中还有回味众多经典的动漫情节 众多宠物精灵等你来收集 打造强大的精灵战队 带领它们不断的战斗冒险 体验其中的无穷乐趣 感兴趣的玩家随时可以来下载
  • 牛客网——字符串排序(C++)

    题目描述 编写一个程序 将输入字符串中的字符按如下规则排序 规则 1 英文字母从 A 到 Z 排列 不区分大小写 如 输入 Type 输出 epTy 规则 2 同一个英文字母的大小写同时存在时 按照输入顺序排列 如 输入 BabA 输出 a
  • R语言 第四章 初级绘图(3)核密度图,小提琴图,QQ图,星状图,等高图,固定颜色选择函数,渐变色生成函数,主体调色板,rainbow(),RcolorBrewer包

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 绘制其他图形 核密度图 sm包中sm density compare函数用于绘制核密度图 核密度图是用一条密度曲线而不是通过柱状来展示连续型变量的分布 相比直方图 密度图的一个
  • getUserProfile:fail 调用失败?getUserProfile:fail can o

    一般Fail原因有很多 如果fail函数的参数返回结果有具体的提示错误 比如长度关键字等问题 那么根据提示直接更改就行 还有一种情况就是我们使用测试号 Uni开发时 我们调用getUserProfile函数返回错误 我们首先要考虑AppId
  • 分享三个不同目录双向更新的实用方法

    分享三个不同目录双向更新的实用方法 方法一 rsync 判断脚本 进行双向更新 方法二 使用rsync的 u选项 方法三 使用rsync inotify监控工具 扩展 方法一 rsync 判断脚本 进行双向更新 脚本内容如下 bin bas
  • 一起来!白嫖Amazon DynamoDB!!!

    Amazon DynamoDB简介 Amazon DynamoDB是由Amazon Web Services AWS 提供的一种快速 灵活 全托管的NoSQL数据库服务 支持文档和键 值数据模型 它具有自动扩展 低延迟 高可靠性 高吞吐量等
  • 4.2 配置Mysql与注册登录模块(中)

    目录 学习目标 学习内容 后端 JWT工具类 数据库修改 写具体业务API 根据token获取用户信息 注册API 前端 这节课实现了登录效果 学习目标 jwt验证 后端的API 前端登录注册页面 学习内容 前端和后端会有跨域问题 不用传统
  • Linux 中的 colcrt 命令及示例

    Linux 系统中的colcrt命令用于格式化文本处理器输出 以便可以在阴极射线管显示器上查看 它删除了下划线 删除线和下划线 这些内容无法在 CRT 上显示 因为在 CRT 屏幕上的给定位置只能生成一个字符 它还将所有下划线放在新行上 位
  • 华为服务器怎么升级2016系统,服务器怎么升级

    服务器怎么升级 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 当您购买的弹性云服务器规格无法满足业务需要时 您可以随时变
  • Ruby

    1 如何安装ralis 在线安装常常因为公司proxy server的原因产生连接问题 所以可以先到https rubygems org下载然后离线安装 gem install l rails2 3 5 gem
  • 【LeetCode刷题】-岛屿数量

    Task 思路 1 首先判断给定的二维数组是不是空的 2 对二维数组遍历一下 对每个元素进行判断 a 如果这个值等于1 那么就把计数器 1 并且对该元素四周进行深度搜索 3 返回 代码 class Solution public int n
  • 定制 findbugs规则

    come from http www 51testing com html 97 13997 211893 html Findbugs是著名的开源java静态代码分析工具 基于bytecode扫描 具备数据流分析能力 操作很简单 可以下载单