
Pacchetto di replica che studia come i revisori delle vulnerabilità LLM si affidano alle evidenze dell'analisi statica, con un front end C/C++ basato su tree-sitter, condizioni controllate di evidenza e codice per l'analisi statistica.
Pacchetto di replica per l'articolo omonimo di ZhiHong Liu.
Ai revisori di vulnerabilità LLM sono state fornite evidenze di analisi statica su funzioni C/C++ vulnerabili e corrette da PrimeVul. Le evidenze erano vere o fabbricate, mentre il codice e il modello restavano fissi. Le false assicurazioni (si afferma l'esistenza di un controllo mancante) riducevano il rilevamento delle vulnerabilità reali. I falsi allarmi (si afferma la mancanza di un controllo aggiunto) non riducevano mai l'accuratezza, e i modelli li contestavano molto più spesso. Una replica registrata su sette nuovi modelli ha confermato l'asimmetria. Verificare ciascuna affermazione in una chiamata separata e mostrare le affermazioni confutate (verify-show) ha ridotto la deferenza in un test registrato.
Questo repository contiene l'analizzatore, il codice dell'esperimento e dell'analisi, le registrazioni, le annotazioni e i report di sintesi. I registri completi delle esecuzioni (ogni nota di evidenza e risposta del modello) e la cache delle risposte LLM sono archiviati separatamente (vedi Risultati completi).
| Percorso | Contenuto |
|---|---|
sgv/cfront.py | Front end C/C++ intraprocedurale (tree-sitter): operazioni sensibili, guardie dominanti, obblighi di prova |
sgv/evidence.py | Lo studio controllato: condizioni di evidenza C0–C5, strategie di presentazione, configurazioni dei modelli, runner |
sgv/vuln.py | Prompt di audit, parsing del verdetto e caricamento di PrimeVul (anche lo studio preliminare sulle vulnerabilità) |
sgv/contrasts.py | Accuratezze per versione e contrasti appaiati (C4 vs C2, C5 vs C2, …) |
sgv/direction.py | Misura di deferenza sensibile alla direzione (H3) |
sgv/deference.py | Deferenza e l'indizio lessicale di "disputa" |
sgv/mitigation.py | Confronto delle strategie di presentazione con test di McNemar appaiati e correzione di Holm |
sgv/pooled.py | Analisi aggregata post-hoc di H2 e descrittive del dataset |
sgv/annotate.py | Fogli di annotazione e concordanza (kappa di Cohen) per la codifica comportamentale |
sgv/figures.py, sgv/diagrams.py | Tutte le figure dell'articolo, calcolate dai registri delle esecuzioni |
sgv/stats.py | Intervalli di Wilson, test esatto di McNemar, bootstrap appaiato |
sgv/llm.py | Client compatibile con OpenAI con cache delle risposte SQLite |
sgv/analysis.py, claims.py, verifier.py, methods.py, run.py, trace.py, labeling.py, … | Studio preliminare su Python (CRUXEval, REval): estrazione delle affermazioni e verifica fondata sulla struttura |
preregistration/ | Registrazione di H3 e gli hash del codice di analisi fissati prima delle esecuzioni |
annotation/ | Guida all'annotazione, fogli di entrambi gli annotatori LLM, la verifica a 20 elementi dell'autore |
results/*.md | Report di sintesi dello studio, dei set held-out, development, test e H3 |
tests/ | Test unitari (python -m unittest discover -s tests -t .) |
Python 3.12 o successivo (sviluppato con 3.14).
pip install -r requirements.txt
PrimeVul non è ridistribuito qui. Scarica gli split appaiati dal repository PrimeVul e inseriscili come
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
La selezione delle coppie è deterministica dato il file, --pairs, --max-lines e --seed. I dati per lo studio preliminare vengono scaricati tramite python -m sgv.data --dest data/cruxeval.jsonl e python -m sgv.reval --dest data/reval.
La directory dei risultati completi, con evidence.jsonl (le note mostrate sotto ogni condizione) e records.jsonl (ogni risposta del modello e verdetto) per ciascuna esecuzione, insieme a llm_cache.sqlite (tutte le risposte API), è archiviata su Zenodo. Decomprimila nella radice del repository in modo che crei results/. Con la cache in posizione, ogni esecuzione riportata di seguito viene rieseguita dalla cache senza alcuna chiamata API, e ogni analisi riproduce i numeri del paper.
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
I modelli vengono chiamati tramite API compatibili con OpenAI (DeepSeek e Alibaba Cloud Bailian/DashScope). I nomi dei modelli, gli snapshot fissati e le impostazioni delle richieste si trovano in MODELS in sgv/evidence.py. Le chiavi API vengono lette dall'ambiente (SGV_API_KEY per DeepSeek, SGV_QWEN_KEY per DashScope) oppure da ~/.sgv_deepseek_key / ~/.sgv_qwen_key. Non vengono mai scritte nel repository.
# 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
Opzioni principali: --conditions (C0–C5), --presentation (plain, quote, alarms, reframe, provenance,
verify, verify-show, commit, commit-verify), --heldout (coppie disgiunte dal set di studio),
--max-lines, --seed. I set di dati del paper sono
| Set | Split di origine | Selezione |
|---|---|---|
| Studio | primevul_test_paired | CWE strutturali, ≤150 righe, tutte le coppie idonee |
| Held-out | primevul_test_paired | --heldout --max-lines 300 (tutti i CWE, disgiunti dal set di studio) |
| Sviluppo | primevul_valid_paired | tutte le coppie idonee |
| Test (registrato) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 esegue la replica H3 registrata (sette modelli, C2/C4/C5, presentazione plain).
La codifica comportamentale è stata annotata da due LLM (Claude e deepseek-v4-pro). L'autore ha verificato 20 elementi manualmente.
Il paper riporta questo.
Codice: MIT (vedi LICENSE). PrimeVul e i set di dati dello studio preliminare mantengono le proprie licenze.
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}