返回

CodeQL 中 Dataflow 路径问题查询的 \

java

在 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 中的「错误:预期结果模式不存在」错误。通过正确定义结果模式,你可以编写有效的路径问题查询,以识别代码中的安全漏洞和问题。

常见问题解答

  1. 为什么我需要两个结果模式?
    因为路径问题查询需要定义路径的起点和终点,以及路径中使用的「边」。

  2. 「边」谓词是什么意思?
    「边」谓词定义了路径中节点之间的关系,例如「跟随」或「调用」。

  3. 如何确定我是否需要显式创建「边」谓词?
    如果你使用的是 DataFlow 库,则需要显式创建「边」谓词。

  4. 导入「路径图」模块有什么好处?
    导入「路径图」模块可以让你访问预定义的「边」谓词,使你的查询更简洁。

  5. 如果我仍然遇到错误,该怎么办?
    请检查你的查询是否有语法或结构错误,并尝试使用不同的 CodeQL CLI 版本。