无法从不同的文件夹添加 CodeQL 库:“无法解析模块 <xxx>”

问题描述

我有以下文件夹结构:

└── MyProj
    ├── Dangerous_Memcopy
    │   ├── Config.qll
    │   └── ...
    ├── MemMangementLibraries
    │   ├── FFmpegMemory
    │   └── ...

这是Config.qll的开始:

import cpp
import Utils
// Change here the memory library if wrappers exists in project
import MemMangementLibraries.FFmpegMemory
import semmle.code.cpp.dataflow.TaintTracking



class MyConfig extends TaintTracking::Configuration{
    MyConfig() {this = "MyConfig"}

    override predicate isSource(DataFlow::Node node){
        exists(
            CallAllocationExpr alloc_foo | 
            (
                node.asExpr() = alloc_foo
                and not alloc_foo.getFile().toString().matches("%mem.c%")
            )
        )
    }

...

我有四行错误:import MemMangementLibraries.FFmpegMemory

无法解析模块 MemMangementLibraries.FFmpegMemory

我不明白为什么。我使用库名称后面的文件夹名称进行导入:

import MemMangementLibraries.FFmpegMemory

知道是什么问题吗?
如果我将库 FFmpegMemory.qll 移到文件夹 Dangerous_Memcopy 下并将 Config.qll 中的第四行更改为 import FFmpegMemory,它会接受它。

它似乎无法识别导入中使用的文件夹 MemMangementLibraries

解决方法

QL 中的导入是相对于“QL 包根目录”解析的,该目录是最近的包含 qlpack.yml 文件的封闭目录。 (它们也相对于包含 import 语句的文件进行解析,这就是为什么如果您将库移动到导入文件旁边会起作用的原因。)

在这种情况下,是不是您的 MyProj 目录不包含 qlpack.yml?如果它本身在 QL 包中(也就是说,它的父级包含 qlpack.yml),那么您应该能够将它作为 MyProj. MemMangementLibraries.FFmpegMemory 导入。或者,您可以在其中添加最小的 qlpack.yml 以使导入工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...