如何分析来自其他 class 的代码而不是当前在 SonarQube 中分析的代码?

How to analyze code from other class than currently analyzed in SonarQube?

案例: 我正在编写需要检查手动创建的对象是否正在关闭的 SonarQube 规则。如果不是,则应提出问题。

让我们假设与确定对象是否手动创建(或不创建)相关的部分很简单且不相关。出于本示例的目的,它将是构造函数调用。但是,还有其他方法可以实例化该类对象,这些方法不符合关闭条件。

这些是我想介绍的案例。假设我们有以下 class:

public class MyType {
    public void close() {
        //close
    }
}

这是第一个案例。简单一个:

public class ClassOne {

    public void methodA() {
        MyType z = null;
        try {
            z = new MyType();
            // do sth
        } finally {
            z.close(); // correct use
        }
    }

    public void methodB() {
        MyType z = new MyType();
        // do sth
        // incorrect use, should be closed here
    }
}

第二个,有点棘手:

public class ClassOne {

    MyType creator() {
        return new MyType();
    }

    MyType jump() {
        return creator();
    }

    public void methodA() {
        MyType z = null;
        try {
            z = jump();
            // do sth
        } finally {
            z.close(); // correct use
        }
    }

    public void methodB() {
        MyType z = jump();
        // do sth
        // incorrect use, should be closed here
    }
}

第三种情况,我无法处理:

public class ClassOne {

    public void methodA() {
        MyType z = null;
        try {
            z = new ClassTwo().creator();
            // do sth
        } finally {
            z.close(); // correct use
        }
    }

    public void methodB() {
        MyType z = new ClassTwo().creator();;
        // do sth
        // incorrect use, should be closed here
    }
}


public class ClassTwo {
    MyType creator() {
        return new MyType();
    }
}

总结一下。我已经实施了第一个和第二个案例。我对第三个有问题,因为我不知道如何跳转到其他 class 的方法声明来分析它是否手动创建对象。

正确的实现方式是什么?可能吗? (当然使用可用 API)

两个被分析的class属于同一个项目,被纳入项目分析。

简短的回答是:使用当前可用的 API 你无法解决你的第三个案例。

现在更详细的回答: sonarqube java 插件现在如何运行它的分析:它通过源文件处理源文件(又名 CompilationUnit)并从该源读取符号的字节码来解析它们 即使这些符号的来源可用于分析器。这是当前的限制:来源是相互隔离分析的。

这意味着,到今天为止,您可以知道在您的源代码中调用了哪个方法,但是您无法从 API 访问该方法的代码(如果它是在您的外部定义的)来源。

有计划在某个时候消除此限制,但现在还没有计划。

可能有一些解决方法,但那将是黑客攻击并且它可能非常复杂(您可以 "inline" 一些字节码指令或尝试阅读和解析您感兴趣的源代码)所以我赢了'推荐那些。