gpt4 book ai didi

java - 如何分析当前在 SonarQube 中分析的其他类的代码?

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:11 24 4
gpt4 key购买 nike

案例: 我正在编写需要检查手动创建的对象是否正在关闭的 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();
}
}

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

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

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

最佳答案

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

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

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

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

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

关于java - 如何分析当前在 SonarQube 中分析的其他类的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com