【问题标题】:How to get value of a variable in SonarQube (custom-rules )?如何在 SonarQube(自定义规则)中获取变量的值?
【发布时间】:2018-04-26 09:30:28
【问题描述】:

我最近开始研究声纳自定义规则,所以我是新手。在编程时,我无法访问变量的值。

.g.考虑这个简单的例子

// Input program file

public void myMethod()
    {
        String a = "Name";
        String b ="Address"
        myMethod2(b);
    }

如上示例,我如何获取变量ab 的值和名称。

我尝试过使用LiteralTree,但我只能获取值,而使用Identifier Tree我只能获取标识符的名称。

如何获取变量/标识符的名称和值?

【问题讨论】:

    标签: java sonarqube rules


    【解决方案1】:

    你应该使用VariableTree,通过它的simpleName()方法你可以访问IdentifierTreeinitializer()允许使用初始化器(它可能不存在,在这种情况下它将是null)。但是,这仅适用于变量声明。对于作业,您需要使用AssignmentExpressionTree,因为这是另一个语法元素。

    根据您想要实现的目标,您可能需要使用语义模型(通过使用IdentifierTree.symbol(),例如可以通过Symbol.usages() 方法为您提供变量的所有用法。

    【讨论】:

    • 谢谢!它适用于变量声明。但是我如何得到它来分配? 考虑这个简单的例子 Class A { public void methodA(String name) { //some code } } Class B { String name; public void methodB() { name = "XYZ"; A a = new A(); a.methodA(name); } } 如果我使用 visitMethodInvocation 方法,我将通过它获取参数(名称),但是我将如何获取它的值,因为它存储在上面提到的 AssignmentExpressionTree 中。跨度>
    • 您将无法仅使用句法方法来跟踪变量的值,因为使用更高级的控制流结构会使事情变得非常复杂。能够执行此类操作的技术称为符号执行。虽然 SonarJava 有符号执行引擎,但它还没有通过公共 API 公开,我们暂时没有计划。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多