ZhiHong Liu 所著同名论文的复现包。
LLM 漏洞审计器获得了关于 PrimeVul 中易受攻击和已修补的 C/C++ 函数的静态分析证据。证据要么真实,要么是伪造的,而代码和模型保持不变。虚假的保证(声称存在一个缺失的检查)降低了对真实漏洞的检测。虚假的警报(声称缺失一个已添加的检查)从未降低准确率,而且模型对它们的质疑频率要高得多。在七个新模型上进行的注册复现证实了这种非对称性。在单独的调用中验证每个声明,并展示被驳斥的声明(verify-show),在注册测试中减少了顺从。
本仓库包含分析器、实验和分析代码、注册、注释以及摘要报告。完整的运行记录(每条证据注释和模型响应)以及 LLM 响应缓存单独归档(见完整结果)。
| 路径 | 内容 |
|---|---|
sgv/cfront.py | 过程内 C/C++ 前端(tree-sitter):敏感操作、支配性守卫、证明义务 |
sgv/evidence.py | 受控研究:证据条件 C0–C5、呈现策略、模型配置、运行器 |
sgv/vuln.py | 审计提示、判定解析和 PrimeVul 加载(也是初步漏洞研究) |
sgv/contrasts.py | 各版本准确率和匹配对比(C4 对 C2、C5 对 C2、……) |
sgv/direction.py | 方向感知的顺从度量(H3) |
sgv/deference.py | 顺从和词汇“质疑”线索 |
sgv/mitigation.py | 使用配对 McNemar 检验和 Holm 校正比较呈现策略 |
sgv/pooled.py | H2 的事后汇总分析和数据集描述性统计 |
sgv/annotate.py | 行为编码的注释表和一致性(Cohen's kappa) |
sgv/figures.py、sgv/diagrams.py | 论文的所有图表,根据运行记录计算 |
sgv/stats.py | Wilson 区间、精确 McNemar 检验、配对 bootstrap |
sgv/llm.py | 带 SQLite 响应缓存的 OpenAI 兼容客户端 |
sgv/analysis.py、claims.py、verifier.py、methods.py、run.py、trace.py、labeling.py、…… | 关于 Python 的初步研究(CRUXEval、REval):声明提取和结构接地的验证 |
preregistration/ | H3 的注册以及运行前固定的分析代码哈希 |
annotation/ | 注释指南、两个 LLM 注释者的表格、作者的 20 项检查 |
results/*.md | 研究、留出集、开发集、测试集和 H3 集的摘要报告 |
tests/ | 单元测试(python -m unittest discover -s tests -t .) |
Python 3.12 或更高版本(使用 3.14 开发)。
pip install -r requirements.txt
PrimeVul 不在此处重新分发。请从 PrimeVul 仓库 下载配对划分,并将它们放置为
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
在给定文件、--pairs、--max-lines 和 --seed 的情况下,配对选择是确定性的。初步研究的数据通过 python -m sgv.data --dest data/cruxeval.jsonl 和 python -m sgv.reval --dest data/reval 下载。
完整结果目录(包含每次运行的 evidence.jsonl(每种条件下显示的注释)和 records.jsonl(每个模型的响应和判定),以及 llm_cache.sqlite(所有 API 响应))已归档在 Zenodo 上。将其解压到仓库根目录,使其创建 results/。在缓存就位的情况下,下面的每次运行都会从缓存中重放,无需任何 API 调用,并且每项分析都能复现论文中的数字。
python -m sgv.contrasts results/evidence_full_a # RQ1/RQ2 on the study set
python -m sgv.deference results/evidence_full_a # RQ3: deference and dispute cue
python -m sgv.mitigation results/evidence_full_a results/mitig_quote results/mitig_alarms \
results/mitig_reframe results/mitig_provenance --model flash # RQ4 on the study set
python -m sgv.direction results/h3_* --pooled # H3 (registered)
python -m sgv.pooled # post-hoc pooled H2
python -m sgv.annotate score annotation/sheet_claude.csv annotation/sheet_deepseek.csv
python -m sgv.figures --out figures # data figures
python -m sgv.diagrams --out figures # schematic figures
模型通过 OpenAI 兼容 API(DeepSeek 和阿里云百炼/DashScope)调用。模型名称、固定快照和请求设置位于 sgv/evidence.py 中的 MODELS 中。API 密钥从环境变量读取(DeepSeek 使用 SGV_API_KEY,DashScope 使用 SGV_QWEN_KEY),或从 ~/.sgv_deepseek_key / ~/.sgv_qwen_key 读取。它们绝不会被写入仓库。
# Build and inspect the evidence of every condition without calling a model
python -m sgv.evidence --pairs 0 --dry-run --out results/evidence_dry
# One run: conditions, presentation strategy and models are arguments
python -m sgv.evidence --data data/primevul/primevul_test_paired.jsonl --pairs 0 \
--models flash --conditions C2,C4,C5 --presentation plain --out results/my_run
主要选项:--conditions(C0–C5)、--presentation(plain、quote、alarms、reframe、provenance、
verify、verify-show、commit、commit-verify)、--heldout(与研究集不相交的配对)、
--max-lines、--seed。论文的数据集为
| 集合 | 来源划分 | 选择 |
|---|---|---|
| 研究集 | primevul_test_paired | 结构性 CWE,≤150 行,所有符合条件的配对 |
| 留出集 | primevul_test_paired | --heldout --max-lines 300(所有 CWE,与研究集不相交) |
| 开发集 | primevul_valid_paired | 所有符合条件的配对 |
| 测试集(已注册) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 运行已注册的 H3 复现(七个模型,C2/C4/C5,plain 呈现方式)。
行为编码由两个 LLM(Claude 和 deepseek-v4-pro)完成标注。作者手工核查了 20 个条目。
论文对此作了报告。
代码:MIT(见 LICENSE)。PrimeVul 及初步研究数据集保留各自的许可证。
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}