我如何使用 Java 运行 SpotBugs 进行静态代码分析?

How can I run SpotBugs using Java for static code analysis?

我正致力于在 Java 中动态注入 groovy 脚本。因此,在执行这些脚本之前,我想使用 SpotBugs(静态代码分析器)确保它们没有潜在的错误。 这是伪代码:

Here it should return the infinite loop bug.

String script = "class Hello { static void main(String []args) { def i = 0; while ( i <= 0) { i = i - 1; } } } ";
List<Bugs> bugs = SpotBugs.getBugs(script);
if (bugs == null) {
    execute(script);
}

那么如何使用java来完成SpotBugs.getBugs(script),输入脚本不会像上面的例子那样被硬编码,而是会被动态获取。

似乎 SpotBugs 应该 运行 使用 maven,这意味着它将打包并仅包含有效的 groovy 脚本。 因此,您无需在执行前进行检查。

最简单API

最简单的方法是将编译后的代码写入 class 文件(如果需要,在临时目录中)。通过将 class 编译为文件,您将能够使用提供 API 的 FindBugs class 来配置范围和规则,而无需使用内部 classes 可能会发生变化。

Groovy 动态(默认)与静态编译

但是,您将面临的主要障碍是 groovy 字节码 对于 SpotBugs 来说过于模糊。对于函数 abc() 的调用,您不会在字节码中看到对方法 abc 的调用。它将是对在运行时创建的全局函数映射的引用。 Groovy 有一种模式可以编译成不太动态的格式。此模式不允许在运行时创建函数。您可以检查配置以指示编译器在此测试 repo 中使用静态模式:https://github.com/find-sec-bugs/find-sec-bugs-demos/tree/master/groovy-simple。但是,这是一个 Gradle 编译,而不是接收字符串作为代码的程序化 API。