返回
CodeQL 中 Dataflow 路径问题查询的 \
java
2024-03-18 17:31:46
在 CodeQL 中使用 Dataflow 时如何解决「错误:预期结果模式不存在」
问题概要
当你在 CodeQL 中使用 Dataflow 库来执行路径问题查询时,可能会遇到以下错误:
A fatal error occurred: Could not process query metadata for ServletRuntimeErrorMessageContainingSensitiveInformation.ql. Error was: Expected result pattern(s) are not present for path-problem query: Expected at least two result patterns. These should include at least an 'edges' result set (see [https://codeql.github.com/docs/writing-codeql-queries/creating-path-queries/](https://codeql.github.com/docs/writing-codeql-queries/creating-path-queries/)). [INVALID\_RESULT\_PATTERNS]
此错误表明你的查询缺少有效的输出模式。路径问题查询需要定义至少两个结果模式,其中一个必须是「边」(edges
) 结果集。
解决方法
你可以通过两种方法解决此问题:
- 方法 1:显式创建「边」谓词
在你的查询中添加显式的「边」谓词,例如:
predicate edges(MyFlow::PathNode n1, MyFlow::PathNode n2) {
n1.follows(n2)
}
- 方法 2:导入「路径图」模块
导入「路径图」(PathGraph) 模块,其中预定义了「边」谓词。
import MyFlow::PathGraph
提示
- 确保你的路径问题查询中至少有两个结果模式,包括一个「边」结果集。
- 检查你的查询的语法和结构是否有错误。
- 尝试使用不同的 CodeQL CLI 版本。
示例查询
以下是一个修改后的示例查询,其中使用了「边」谓词:
predicate edges(MyFlow::PathNode n1, MyFlow::PathNode n2) {
n1.follows(n2)
}
from MyFlow::PathNode source, MyFlow::PathNode sink
where MyFlow::flowPath(source, sink)
select sink, source, sink, "Potential CWE-536: Servlet Runtime Error Message Containing Sensitive Information."
结论
遵循这些步骤,你应该能够解决 CodeQL 中的「错误:预期结果模式不存在」错误。通过正确定义结果模式,你可以编写有效的路径问题查询,以识别代码中的安全漏洞和问题。
常见问题解答
-
为什么我需要两个结果模式?
因为路径问题查询需要定义路径的起点和终点,以及路径中使用的「边」。 -
「边」谓词是什么意思?
「边」谓词定义了路径中节点之间的关系,例如「跟随」或「调用」。 -
如何确定我是否需要显式创建「边」谓词?
如果你使用的是 DataFlow 库,则需要显式创建「边」谓词。 -
导入「路径图」模块有什么好处?
导入「路径图」模块可以让你访问预定义的「边」谓词,使你的查询更简洁。 -
如果我仍然遇到错误,该怎么办?
请检查你的查询是否有语法或结构错误,并尝试使用不同的 CodeQL CLI 版本。