案例我正在编写需要检查手动创建的对象是否正在关闭的SonarQube规则。如果不是,则应该提出问题。
让我们假设与确定是否手动创建对象相关的部分很容易且不相关。出于这个例子的目的,它将是构造函数调用。但是,还有其他方法可以实例化那种不符合关闭条件的对象。
这些是我想要涵盖的案例。我们假设我们有以下课程:
for i in range(len(lst)):
min_ = min(copy)
sort.append(min_)
copy.remove(min_)
这是第一个案例。简单的一个:
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
}
}
总结一下。我已经实施了第一和第二个案例。我有第三个问题,因为我不知道如何跳转到其他类的方法声明来分析它是否手动创建对象。
实施它的正确方法是什么?可能吗? (当然使用可用的API)
两个分析的类都属于同一个项目,并包含在项目分析中。
答案 0 :(得分:1)
简短回答是:使用当前可用的API,您无法解决第三种情况。
现在有更详细的答案:
sonarqube java插件现在如何运行其分析:它通过源文件工作源文件(又名CompilationUnit
)并读取此源中符号的字节码以解析它们即使这些符号的源可用对于分析仪。这是一个当前的限制:来源是彼此孤立分析的。
这意味着,截至今天,您可以知道在源代码中调用了哪种方法,但如果在源代码之外定义了该方法的代码,则无法访问该方法的代码。
有计划在某些时候取消此限制,但目前尚未安排。
可能有一些解决方法,但这将是黑客攻击,它可能非常复杂(你可以“内联”一些字节码指令或尝试阅读和解析你感兴趣的源)所以我不会推荐那些