
Pacote de replicação que estuda como auditores de vulnerabilidades baseados em LLM acatam evidências de análise estática, com um front end C/C++ baseado em tree-sitter, condições controladas de evidências e código de análise estatística.
Pacote de replicação para o artigo de mesmo título de ZhiHong Liu.
Auditores de vulnerabilidade LLM receberam evidências de análise estática sobre funções C/C++ vulneráveis e corrigidas do PrimeVul. As evidências eram verdadeiras ou fabricadas, enquanto o código e o modelo permaneciam fixos. Falsas garantias (afirma-se que uma verificação ausente existe) reduziram a detecção de vulnerabilidades reais. Falsos alarmes (afirma-se que uma verificação adicionada está ausente) nunca reduziram a precisão, e os modelos os contestaram com muito mais frequência. Uma replicação registrada em sete novos modelos confirmou a assimetria. Verificar cada afirmação em uma chamada separada e mostrar as afirmações refutadas (verify-show) reduziu a deferência em um teste registrado.
Este repositório contém o analisador, o código do experimento e da análise, os registros, as anotações e os relatórios resumidos. Os registros completos de execução (cada nota de evidência e resposta do modelo) e o cache de respostas do LLM estão arquivados separadamente (consulte Resultados completos).
| Caminho | Conteúdo |
|---|---|
sgv/cfront.py | Front end intraprocedural de C/C++ (tree-sitter): operações sensíveis, guardas dominantes, obrigações de prova |
sgv/evidence.py | O estudo controlado: condições de evidência C0–C5, estratégias de apresentação, configurações de modelo, executor |
sgv/vuln.py | Prompt de auditoria, análise de veredito e carregamento do PrimeVul (também o estudo preliminar de vulnerabilidade) |
sgv/contrasts.py | Precisões por versão e contrastes emparelhados (C4 vs C2, C5 vs C2, …) |
sgv/direction.py | Medida de deferência sensível à direção (H3) |
sgv/deference.py | Deferência e a pista lexical de "contestação" |
sgv/mitigation.py | Comparação de estratégias de apresentação com testes de McNemar emparelhados e correção de Holm |
sgv/pooled.py | Análise agrupada post-hoc de H2 e descritivas do conjunto de dados |
sgv/annotate.py | Planilhas de anotação e concordância (kappa de Cohen) para a codificação comportamental |
sgv/figures.py, sgv/diagrams.py | Todas as figuras do artigo, calculadas a partir dos registros de execução |
sgv/stats.py | Intervalos de Wilson, teste exato de McNemar, bootstrap emparelhado |
sgv/llm.py | Cliente compatível com OpenAI com cache de respostas SQLite |
sgv/analysis.py, claims.py, verifier.py, methods.py, run.py, trace.py, labeling.py, … | Estudo preliminar em Python (CRUXEval, REval): extração de afirmações e verificação fundamentada na estrutura |
preregistration/ | Registro de H3 e os hashes do código de análise fixados antes das execuções |
annotation/ | Guia de anotação, planilhas de ambos os anotadores LLM, a verificação de 20 itens do autor |
results/*.md | Relatórios resumidos do estudo, conjuntos held-out, de desenvolvimento, de teste e H3 |
tests/ | Testes unitários (python -m unittest discover -s tests -t .) |
Python 3.12 ou posterior (desenvolvido com 3.14).
pip install -r requirements.txt
O PrimeVul não é redistribuído aqui. Baixe as divisões emparelhadas do repositório PrimeVul e coloque-as como
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
A seleção de pares é determinística dado o ficheiro, --pairs, --max-lines e --seed. Os dados para o estudo preliminar são descarregados por python -m sgv.data --dest data/cruxeval.jsonl e python -m sgv.reval --dest data/reval.
O diretório de resultados completos, com evidence.jsonl (as notas apresentadas em cada condição) e records.jsonl (cada resposta do modelo e veredicto) para cada execução, juntamente com llm_cache.sqlite (todas as respostas da API), está arquivado no Zenodo. Descomprima-o na raiz do repositório para que crie results/. Com a cache no lugar, cada execução abaixo é reproduzida a partir da cache sem qualquer chamada à API, e cada análise reproduz os números do artigo.
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
Os modelos são chamados por meio de APIs compatíveis com OpenAI (DeepSeek e Alibaba Cloud Bailian/DashScope). Os nomes dos modelos, snapshots fixados e configurações de requisição estão em MODELS em sgv/evidence.py. As chaves de API são lidas do ambiente (SGV_API_KEY para DeepSeek, SGV_QWEN_KEY para DashScope) ou de ~/.sgv_deepseek_key / ~/.sgv_qwen_key. Elas nunca são gravadas no repositório.
# 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
Opções principais: --conditions (C0–C5), --presentation (plain, quote, alarms, reframe, provenance,
verify, verify-show, commit, commit-verify), --heldout (pares disjuntos do conjunto de estudo),
--max-lines, --seed. Os conjuntos de dados do artigo são
| Conjunto | Divisão de origem | Seleção |
|---|---|---|
| Estudo | primevul_test_paired | CWEs estruturais, ≤150 linhas, todos os pares elegíveis |
| Held-out | primevul_test_paired | --heldout --max-lines 300 (todas as CWEs, disjuntas do conjunto de estudo) |
| Desenvolvimento | primevul_valid_paired | todos os pares elegíveis |
| Teste (registrado) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 executa a replicação H3 registrada (sete modelos, C2/C4/C5, apresentação plain).
A codificação comportamental foi anotada por dois LLMs (Claude e deepseek-v4-pro). O autor verificou 20 itens manualmente.
O artigo relata isso.
Código: MIT (ver LICENSE). O PrimeVul e os conjuntos de dados do estudo preliminar mantêm suas próprias licenças.
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}