S4Plus/QLStat
GitHub: S4Plus/QLStat
QLStat 利用 CodeQL 声明式静态分析对批量真实世界项目进行大规模实证研究,帮助研究者系统化地发现代码模式与规律。
Stars: 1 | Forks: 1
# QLStat
利用 CodeQL 提供的声明式静态分析功能对批量真实世界项目进行分析,以服务于实证研究和统计分析,从而深入洞察真实项目中的模式。
## 功能概述
QLStat 提供了一个全面的框架,利用 CodeQL 对软件项目进行大规模实证分析。主要功能包括:
- **批处理**:并行克隆、构建和分析多个代码仓库
- **灵活配置**:基于 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`:配置构建组,包括超时时间、构建命令和可选的 extgen 脚本
- `queryconfig`:设置带有并行化选项的查询执行
- `queryGrps`:使用特定的查询和目标代码仓库定义查询组
### 2. 创建数据库
运行 `go run ./cmd/batch_clone_build stat.yaml` 以克隆代码仓库并创建 CodeQL 数据库:
```
go run ./cmd/batch_clone_build stat.yaml
```
主要选项:
- `-noclone`:如果代码仓库已存在,则跳过克隆
- `-nobuild`:如果数据库已存在,则跳过数据库创建
- `-noextgen`:跳过外部谓词的生成
该工具支持三个主要阶段:
1. **克隆**:从指定来源下载代码仓库
2. **构建**:使用适当的构建命令创建 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 的构建组中配置 `extgenScript: goescape`(其中 `goescape` 运行 `go build -a -gcflags=all=-m=2 .`)。
- 您也可以指定自己的脚本,只要它在 `$logRoot/extgen/path/to/repo/m2.log` 中生成 `m2.log` 即可。
2. 这会在构建阶段生成逃逸分析数据。
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)。
# 引用
```
@software{Li_QLStat,
author = {Li, Qingwei and Ding, Boyao and Zhang, Yu and Chen, Jinbao},
license = {Apache-2.0},
title = {{QLStat}},
url = {https://github.com/s4plus/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工具, 云安全监控, 代码分析, 代码示例, 凭证管理, 安全评估工具, 数据分析, 日志审计, 防御机制, 静态分析