2015-06-14 68 views
4

案例:我在写SonarQube规则,需要检查手动创建的对象是否正在关闭。如果不是,则应提出问题。如何分析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)

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

+0

向下的票是不是我的(显然:)),但我觉得这个问题有些不清楚。你是什​​么意思_manual creation_?构造函数调用?什么是“SomeExternalClass”?分析之外的代码库之外的东西? 'finally'块在哪里?你能举出这些物体正确关闭的例子吗? – toniedzwiedz

+0

@toniedzwiedz嘿:-),谢谢你分享你对问题的怀疑。我详细阐述了这些。希望现在清楚。 –

回答

1

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

现在的更详细的解答: 如何sonarqube Java插件运行它分析了:它由源文件的作品源文件(又名CompilationUnit)和符号出这个源读取字节码,即使解决这些问题这些符号的来源可用于分析仪。这是一个目前的局限性:来源是相互独立分析的。

这意味着,从今天开始,您就可以知道哪些方法被调用你的源代码,但如果你的源之外定义你没有从API访问该方法的代码。

有计划,使这一限制在某些点消失,但这不是定于现在。

可能有一些解决方法,但这将是黑客入侵,它可能真的很复杂(你可以“内联”一些字节码指令或尝试读取和解析你感兴趣的源),所以我不会推荐那些。