Lslightly/QLStat

GitHub: Lslightly/QLStat

QLStat 是基于 CodeQL 的大规模批量静态分析框架,用于对大量真实项目进行并行查询并聚合结果,支撑软件工程领域的实证研究。

Stars: 1 | Forks: 0

# QLStat 利用 CodeQL 提供的声明式静态分析技术,对大量真实世界项目进行批量分析,用于实证研究与统计分析,从而深入洞察真实世界项目中的模式。 ## 功能概述 QLStat 提供了一个基于 CodeQL 进行软件项目大规模实证分析的综合性框架。主要功能包括: - **批量处理**:并行执行多个仓库的 clone、build 和分析 - **灵活配置**:基于 YAML 的配置方式,用于定义分析目标与参数 - **可扩展分析**:支持自定义的外部谓词(例如,逃逸分析数据) - **可扩展的查询执行**:跨多个仓库并行执行 CodeQL 查询 - **全面的日志记录**:在分析 pipeline 的各个阶段提供详细的日志 - **数据收集**:将多个仓库的分析结果聚合为统一的数据集 - **语言支持**:目前专注于 Go 语言,并具备扩展至 CodeQL 支持的其他语言的能力 ## 设置 - 安装 [CodeQL CLI](https://docs.github.com/en/code-security/how-tos/scan-code-for-vulnerabilities/scan-from-the-command-line/setting-up-the-codeql-cli#1-download-the-codeql-cli-tar-archive) 并将 codeql 添加到你的 PATH 中。 - 安装 [Go](https://go.dev/dl/)。 ## 演示 - [`demo.sh`](./demo.sh):一个用于在示例配置文件上运行 QLStat 的演示脚本。 - 结果保存在 `./codeqlResult/escape_ext/heapvar_should_move` 中。你可以找到分配在堆上的优化变量。 - [`demo.yaml`](./demo.yaml):演示 QLStat 用法的示例配置文件。 ## 使用说明 ### 1. 配置 参照 [`example.yaml`](./example.yaml)、[`demo.yaml`](./demo.yaml) 或 [`yaml-examples/`](./yaml-examples/) 目录下的 YAML 文件,创建你的 `stat.yaml` 配置文件。该配置支持以下几个关键部分: - `repositories`:通过 URL 前缀和可选的目录结构定义代码仓库 - `language`:指定用于分析的编程语言(例如:go) - `buildGrps`:配置 build 组,包含超时时间、build 命令以及可选的 extgen 脚本 - `queryconfig`:设置查询执行及其并行化选项 - `queryGrps`:定义查询组,包含特定的查询和目标仓库 ### 2. 创建数据库 运行 `go run ./cmd/batch_clone_build stat.yaml` 来 clone 仓库并创建 CodeQL 数据库: ``` go run ./cmd/batch_clone_build stat.yaml ``` 主要选项: - `-noclone`:如果仓库已存在,则跳过 clone - `-nobuild`:如果数据库已存在,则跳过数据库创建 - `-noextgen`:跳过外部谓词的生成 该工具支持三个主要阶段: 1. **Cloning**:从指定的数据源下载仓库 2. **Building**:使用相应的 build 命令创建 CodeQL 数据库 3. **外部谓词生成**:生成如逃逸分析结果等额外的数据源 ### 3. 查询开发 在 [`qlsrc`](./qlsrc/) 目录中创建你的查询。查询应遵循 CodeQL 规范,并可在需要时利用外部谓词。 ### 4. 查询执行 运行 `go run ./cmd/codeql_qdriver -collect stat.yaml` 在创建好的数据库上执行查询: ``` go run ./cmd/codeql_qdriver -collect stat.yaml ``` 可用选项: - `-format`:指定输出格式(text, csv, json, bqrs) - 默认:csv - `-decode-only`:仅解码现有的 bqrs 文件,而不运行查询 - `-collect`:将所有 CSV 结果收集到一个单独的文件中,并附带仓库名称 结果处理分为三个阶段: 1. **查询执行**:在每个数据库上运行 CodeQL 查询 2. **解码**:将 bqrs 结果转换为指定格式(CSV、JSON 等) 3. **收集**:将所有仓库的结果聚合到一个单一的数据集中 ## 扩展 ### Go 逃逸分析扩展 QLStat 支持通过 escape adapter 利用逃逸分析数据来扩展 CodeQL: 1. 在 YAML 文件的 build 组中配置 `extgenScript: goescape`(其中 `goescape` 会运行 `go build -a -gcflags=all=-m=2 .`)。 - 你也可以指定自己的脚本,只要它能在 `$logRoot/extgen/path/to/repo/m2.log` 中生成 `m2.log` 即可。 2. 这将在 build 阶段生成逃逸分析数据。 3. 在你的查询组中通过 `externals: [movedToHeap, newEscapesToHeap]` 引用外部谓词。 4. 在你的 CodeQL 查询中使用该外部谓词。 关于逃逸分析扩展工作原理的更多细节,请参阅[逃逸分析文档](doc/adapters/escape_analysis.md)。 ## 架构 有关存储结构和架构的详细信息,请参阅[架构文档](doc/arch.md)。 # 贡献 欢迎任何贡献!如果你在使用 QLStat 时遇到任何问题,或者有任何改进的想法,欢迎提交 [Issue](https://github.com/Lslightly/QLStat/issues) 或发起 [Pull Request](https://github.com/Lslightly/QLStat/pulls)。 # 引用 ``` @misc{qlstat, author = {Qingwei Li}, title = {QLStat}, howpublished = {\url{https://github.com/Lslightly/QLStat}}, } @article{li2026empiricalMemPerfSafetyGo, title = {Go语言程序的内存性能与安全问题实证研究}, author = {李清伟 and 丁伯尧 and 张昱 and 陈金宝}, journal = {软件学报}, volume = {37}, number = {3}, pages = {1197}, numpages = {28}, year = {2026}, doi = {10.13328/j.cnki.jos.007464}, publisher = {科学出版社} } ```
标签:CodeQL, Go, Ruby工具, 云安全监控, 安全评估工具, 批处理, 数据管道, 日志审计, 软件工程, 防御机制, 静态分析