2

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

在这里它应该返回无限循环错误。

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);
}

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

4

2 回答 2

1

最简单的 API

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

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

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

于 2018-03-23T16:54:13.020 回答
0

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

于 2018-03-21T10:30:06.400 回答