前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SonarQube自定义规则开发

SonarQube自定义规则开发

作者头像
源代码安全
发布2023-02-28 11:39:09
1.6K0
发布2023-02-28 11:39:09
举报
文章被收录于专栏:sonarqube
  1. 本篇介绍了如何使用java来进行SonarQube的自定义规则插件的开发
  2. 基本上就是直接翻译Writing Custom Java Rules 101这个SonarQube的官方Readme内容
  3. 建议具有一定Java,Maven和Junit的基础,当然按照步骤是能够完成整个开发,但是如果中间出现操作失误或者由于配置环境不同,一定的基础知识能够帮助你更好的解决问题

开发之前需要的环境

  1. Java要尽量在1.8版本以上
  2. Maven安装最新版就行
  3. 推荐使用Intellij idea或者eclipse等主流IDE
  4. 本次规则插件主要针对SonarQube8.9以上的版本进行开发

主要开发流程

  1. git clone sonar-java这个项目
  2. 进入到开发目录./docs/java-custom-rules-example/中,对该目录下的各个文件夹和文件进行说明:
    • pom.xmlpom_SQ_8_9_LTS.xml: 由于SonarQube的规则插件是基于Maven开发的,所有开发需要的依赖和插件都需要在这里写明,由于本次是编写面向SonarQube8.9以上版本的规则插件,所以这一次使用pom_SQ_8_9_LTS.xml
    • ./src/main: 这个路径主要放规则插件的规则逻辑代码
    • ./src/test:  由于本次规则插件是基于TDD(测试驱动开发)进行开发,这个目录放置针对./src/main中放置的规则逻辑代码的测试代码
    • 使用Maven进行打包的时候使用mvn clean install -f pom_SQ_8_9_LTS.xml命令
  3. 本次开发主要就是写三个文件 1. 测试文件:文件路径/src/test/files/,建立一个文件名为MyFirstCustomCheck.java,用来测试规则代码 2. 测试class:文件路径/src/test/java下的org.sonar.samples.java.checks包,建立一个文件名为MyFirstCustomCheckTest.java,用于调用junit进行单元测试 3. 规则代码:文件路径/src/main/java下的org.sonar.samples.java.checks包,建立一个文件名为MyFirstCustomCheck.java,这个就是写入本次规则插件的主要代码
  4. 主要开发流程中各个文件的代码 本次开发的规则:如果一个函数有一个参数,那么他的返回值和这个参数不能是一个类型

1、测试文件MyFirstCustomCheck.java

代码语言:javascript
复制
class MyClass {  MyClass(MyClass mc) { }  int     foo1() { return 0; }  void    foo2(int value) { }  int     foo3(int value) { return 0; } // Noncompliant  Object  foo4(int value) { return null; }  MyClass foo5(MyClass value) {return null; } // Noncompliant  int     foo6(int value, String name) { return 0; }  int     foo7(int ... values) { return 0;}}

程序说明:

  • // Noncompliant是指违反规则的测试,在写测试用例的时候,必须加这个注释
  • 由于foo3foo4的参数类型和返回类型是相同的,违反规则

2、测试classMyFirstCustomCheckTest.java

代码语言:javascript
复制
package org.sonar.samples.java.checks;import org.junit.jupiter.api.Test;class MyFirstCustomCheckTest {  @Test  void test() {    CheckVerifier.newVerifier()      .onFile("src/test/files/MyFirstCustomCheck.java")      .withCheck(new MyFirstCustomCheck())      .verifyIssues();  }}

3、规则代码MyFirstCustomCheck.java

代码语言:javascript
复制
package org.sonar.samples.java.checks;
import org.sonar.check.Rule;import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;import org.sonar.plugins.java.api.tree.Tree.Kind;import java.util.Collections;import java.util.List;
@Rule(key = "MyFirstCustomRule")public class MyFirstCustomCheck extends IssuableSubscriptionVisitor {
  @Override  public void visitNode(Tree tree) {    MethodTree method = (MethodTree) tree;    if (method.parameters().size() == 1) {      Symbol.MethodSymbol symbol = method.symbol();      Type firstParameterType = symbol.parameterTypes().get(0);      Type returnType = symbol.returnType().type();      if (returnType.is(firstParameterType.fullyQualifiedName())) {        reportIssue(method.simpleName(), "Never do that!");      }    }  }
  @Override  public List<Kind> nodesToVisit() {    return Collections.singletonList(Kind.METHOD);  }}

程序说明:SonarQube的规则插件是基于AST算法的,要注意这里面的两个方法。

  • nodesToVisit(): 由于本次规则是针对函数的输入值和返回值的问题,所以就是对于函数的静态代码检查,所以会使用Kind.METHOD这个关键词,如果你有其他希望测试的,可使用其他类型的关键词
  • visitNode():AST算法会把代码中的单词和符号进行归类排序成为树状,每个树枝都是一个Node,本次规则是针对函数的规则,所以就需要找Method类,接下来根据代码就能够理解内容了。

5、这样主要的规则代码就完成。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发之前需要的环境
  • 主要开发流程
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档