15

我有一个由 Spring Roo 生成的 maven 项目,并使用多种工具(checkstyle、pmd 等)来收集有关我的项目的信息。(即我为此使用codehaus 的声纳

Roo 大量使用 AspectJ 间类型声明 (ITD)来分离持久性、javabeans-getter/setter 等关注点。

这些 ITD 是在编译时编入的,因此像 checkstyle 和 pmd(在源代码级别工作)这样的工具有很多误报。

我目前看到的唯一解决方案是停用对使用 ITD 的类的检查。

有更好的想法吗?

4

5 回答 5

2

这个答案现在对您没有帮助,但希望它会引起您的兴趣,因为它有望在不久的将来解决您的问题。我不知道您是否知道 IntelliJ IDEA - JetBrains 的 Java IDE,但是已经在这个方向上进行了工作,这里是您可能想要关注的专门问题的链接:http://youtrack.jetbrains .net/issue/IDEA-26959。只需在上面设置一个手表 - 并在实现该功能时得到通知。IntelliJ IDEA 提供了非常强大的 SCA。因此,ITD 支持也应该是高质量的。

于 2010-02-25T18:04:14.843 回答
1

FindBugs 和 Cobertura 都不能在源代码级别上工作,而是在字节码级别上工作。因此,您应该在编译时(例如,使用 maven 的 AspectJ 插件)而不是在加载时静态地波动您的方面(这也将改善应用程序的启动时间),然后在结果字节码上运行静态分析工具。

于 2010-02-26T22:08:25.990 回答
1

如果要在将切面编入代码后对源代码进行推理,则应将切面编入源代码而不是二进制代码。

许多方面编织者进行二进制代码编织,因为他们无法访问编译器前端生成的信息(符号表、名称、类型、表达式类型……)。所以,黑客是,使用由编译器生成的虚拟机代码(这个特技基本上只适用于 VM 指令集,如 .net IL 和 java 类代码),通常很容易解码(漂亮的常规指令集)装饰符号表信息。

但是,如果您不能对这种编织过程的二进制结果进行推理,那么您就不能确定编织的程序没有错误,这就是 OP 原始问题的重点:“我如何运行 SCA 工具在(有效的)编织源上?”。

您可以通过两种方式解决此问题:

  • 让社区编写处理字节码而不是源代码的 SCA 工具。这可能很难,因为源代码可能包含在编译过程中丢失的信息。
  • 一个更好的主意:让切面社区编写操作源代码的切面编织器,并生成源代码。这可能很难,因为获得完整的语言前端很困难。

我无法帮助你让社区做出选择。

我可以大力鼓励社区选择第二种方式:我们的DMS Software Reengineering Toolkit。这是一个程序转换系统,它执行“如果你看到这个,用那个替换它”形式的指令,但通过将这些更改实际应用到由完整语言前端生成的编译器数据结构来尊重语言的语法和语义结束。(这是数学中方程代换的软件工程版本)。更改的数据结构可以重新导出为可编译的源文本,并带有注释。

如果您了解转换通常可以做什么,您会发现切面编织器是程序转换系统的一个特例。因此,使用 DMS 很容易实现方面编织器,并且结果是源代码,这意味着您可以应用源代码分析工具。

我怀疑这实际上解决了短期内分析 Roo 生成的代码的 OP 问题:-{

于 2010-02-23T02:24:08.550 回答
1

怀疑这将是一个更长时间的“利基问题” :-) 希望工具供应商会考虑必要的增强功能。

于 2010-02-18T16:10:49.337 回答
0

您能否在 Java 代码中添加特定于工具的注释/注释以抑制误报?例如,FindBugs 有自己的 @SuppressWarnings 注解。

于 2010-02-17T23:19:58.863 回答