Sonarqube 自定义规则 - 字符串文字不应重复,在记录器的上下文中被忽略

Posted

技术标签:

【中文标题】Sonarqube 自定义规则 - 字符串文字不应重复,在记录器的上下文中被忽略【英文标题】:Sonarqube Custom Rule- String Literal should not be duplicated, ignored in context of logger 【发布时间】:2018-09-01 23:53:51 【问题描述】:

尝试扩展以下链接的 Sonarqube 规则以忽略记录器方法中字符串文字的出现。

我在尝试为方法提取方法名称时遇到问题(在基本访问者树的上下文中,我的分析可能不将其限定为方法。但是在查看 methodInvocation 类型以提取一些方法名称时有一些运气) .

所以我的问题是,是否有人有基本访问者树元素的定义列表以及它如何看到不同的语句?

例如weeLogger.Log(exception, "发生异常");

例如logger(exception1, "发生异常);

还有没有人做过类似的事情并分享他们如何从 Base Visitor Tree 类中提取方法名称以使用 Sonarqube 进行分析?

https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/StringLiteralDuplicatedCheck.java

【问题讨论】:

如果您可以在此处发布一些相关代码并且您遇到的错误会有所帮助吗? 如上所述,在寻找方法来提取方法名称并将其与 Sonarqube 分析的参数相关联的代码中没有真正的错误 @JordanSmith,你的工作成果是什么?我也想跳过记录器的重复错误 @michaldo 我已添加作为问题的答案,我对此的解决方案 【参考方案1】:

获取方法名

    public class SomeClass extends IssuableSubscriptionVisitor 
      @Override
      public List<Tree.Kind> nodesToVisit() 
        return ImmutableList.of(Tree.Kind.METHOD);
      

      @Override
      public void visitNode(Tree tree) 
        MethodTree methodTree = (MethodTree) tree;
        IdentifierTree methodName = methodTree.simpleName();
       // getName from methodName. 

      

**get invocation method name**
public class SomeClass extends IssuableSubscriptionVisitor 

    public static IdentifierTree methodName(MethodInvocationTree mit) 
        IdentifierTree id;
        if (mit.methodSelect().is(Tree.Kind.IDENTIFIER)) 
            id = (IdentifierTree) mit.methodSelect();
         else 
            id = ((MemberSelectExpressionTree) mit.methodSelect()).identifier();
        
        return id;
    

【讨论】:

你能澄清我对@Override 的意义吗,根据我对超类的理解,它们没有 nodeToVisit() 或 visitNode() 被覆盖? 它是一个扩展SubscriptionVisitor的类,如果你需要使用BaseTreeVisitor你可以覆盖public void visitMethodInvocation(MethodInvocationTree tree)或者public void visitMethod(MethodITree tree) 非常感谢您的帮助【参考方案2】:
@Override
public void visitMethodInvocation(MethodInvocationTree tree) 
    IdentifierTree id;
    if (tree.methodSelect().is(Tree.Kind.IDENTIFIER))
        id = (IdentifierTree) tree.methodSelect();
     else 
        id = ((MemberSelectExpressionTree) tree.methodSelect()).identifier();
    

    if(id.name().matches("(.*)[lL]og(.*)"))
        //Do nothing -> Ignores method with the "log" in them for scanning
    else 
        scan(tree.methodSelect());
        scan(tree.typeArguments());
        scan(tree.arguments());
    

【讨论】:

@michaldo 希望这是有道理的,只需将其添加到原始字符串文字重复规则中。可以为任何自定义记录器变量名称扩展 谢谢,我在这里分享了这个问题:community.sonarsource.com/t/fp-squid-s1192-logging-statements/…

以上是关于Sonarqube 自定义规则 - 字符串文字不应重复,在记录器的上下文中被忽略的主要内容,如果未能解决你的问题,请参考以下文章

使用 SonarQube 自定义 Fxcop 规则

C# 的 Sonarqube 5.4 自定义规则

sonarqube如何使用自定义规则插件

sonarqube怎么自定义Java代码规则

SonarQube配置自定义的CheckStyle代码规则

SonarQube - 自定义规则,以防止调用某些静态方法