如何分析来自其他 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" 一些字节码指令或尝试阅读和解析您感兴趣的源代码)所以我赢了'推荐那些。
案例: 我正在编写需要检查手动创建的对象是否正在关闭的 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" 一些字节码指令或尝试阅读和解析您感兴趣的源代码)所以我赢了'推荐那些。