【问题标题】:How to analyze code from other class than currently analyzed in SonarQube?如何分析当前在 SonarQube 中分析的其他类的代码?
【发布时间】:2015-06-14 13:48:39
【问题描述】:

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

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

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

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();
    }
}

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

实现它的正确方法是什么?是否可以? (当然使用可用的 API)

分析的两个类都属于同一个项目,都包含在项目分析中。

【问题讨论】:

  • 反对票不是我的(显然:))但我觉得这个问题有些不清楚。 手动创建到底是什么意思?构造函数调用? SomeExternalClass 是什么?正在分析的代码库之外的东西? finally 块在哪里?你能举出这些物体被正确关闭的例子吗?
  • @toniedzwiedz 嘿 :-),感谢您分享您对问题的疑虑。我详细阐述了这些。希望现在清楚了。

标签: java plugins sonarqube


【解决方案1】:

简短的回答是:使用当前可用的 API,您无法解决第三种情况。

现在获得更详细的答案: sonarqube java插件现在如何运行它的分析:它通过源文件工作源文件(又名CompilationUnit)并从此源中读取符号的字节码以解析它们即使这些符号的源可用于分析仪。这是当前的限制:对源进行单独分析。

这意味着,从今天开始,您可以知道在您的源代码中调用了哪个方法,但如果该方法是在您的源代码之外定义的,则您无法从 API 访问该方法的代码。

计划在某个时候取消此限制,但目前尚未安排。

可能有一些解决方法,但它会被破解,而且它可能真的很复杂(你可以“内联”一些字节码指令或尝试读取和解析你感兴趣的源代码)所以我不会推荐那些.

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2020-07-03
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2021-04-13
    • 2016-07-08
    相关资源
    最近更新 更多