Replikationspaket, das untersucht, wie LLM-Sicherheitsprüfer statische Analysebelege berücksichtigen, mit einem tree-sitter-C/C++-Frontend, kontrollierten Belegbedingungen und Code für die statistische Analyse.
Replikationspaket für das gleichnamige Paper von ZhiHong Liu.
LLM-Schwachstellenprüfern wurde Evidenz aus der statischen Analyse über verwundbare und gepatchte C/C++-Funktionen aus PrimeVul vorgelegt. Die Evidenz war entweder wahr oder erfunden, während der Code und das Modell unverändert blieben. Falsche Zusicherungen (es wird behauptet, eine fehlende Prüfung existiere) senkten die Erkennung echter Schwachstellen. Falsche Alarme (es wird behauptet, eine hinzugefügte Prüfung fehle) senkten die Genauigkeit nie, und die Modelle widersprachen ihnen weit häufiger. Eine registrierte Replikation an sieben neuen Modellen bestätigte die Asymmetrie. Die Überprüfung jeder Behauptung in einem separaten Aufruf und das Anzeigen der widerlegten Behauptungen (verify-show) verringerte die Deferenz in einem registrierten Test.
Dieses Repository enthält den Analysator, den Experiment- und Analysecode, die Registrierungen, die Annotationen und die Zusammenfassungsberichte. Die vollständigen Laufprotokolle (jede Evidenznotiz und Modellantwort) und der LLM-Antwort-Cache sind separat archiviert (siehe Vollständige Ergebnisse).
| Pfad | Inhalt |
|---|---|
sgv/cfront.py | Intraprozedurales C/C++-Frontend (tree-sitter): sensible Operationen, dominierende Guards, Beweisverpflichtungen |
sgv/evidence.py | Die kontrollierte Studie: Evidenzbedingungen C0–C5, Präsentationsstrategien, Modellkonfigurationen, Runner |
sgv/vuln.py | Audit-Prompt, Urteilsanalyse und PrimeVul-Laden (auch die vorläufige Schwachstellenstudie) |
sgv/contrasts.py | Genauigkeiten pro Version und gematchte Kontraste (C4 vs. C2, C5 vs. C2, …) |
sgv/direction.py | Richtungsbewusstes Deferenzmaß (H3) |
sgv/deference.py | Deferenz und der lexikalische „Dispute“-Hinweis |
sgv/mitigation.py | Vergleich der Präsentationsstrategien mit gepaarten McNemar-Tests und Holm-Korrektur |
sgv/pooled.py | Post-hoc-gepoolte Analyse von H2 und Datensatz-Deskriptiva |
sgv/annotate.py | Annotationsbögen und Übereinstimmung (Cohen's kappa) für die Verhaltenskodierung |
sgv/figures.py, sgv/diagrams.py | Alle Abbildungen des Papers, berechnet aus den Laufprotokollen |
sgv/stats.py | Wilson-Intervalle, exakter McNemar-Test, gepaartes Bootstrap |
sgv/llm.py | OpenAI-kompatibler Client mit einem SQLite-Antwort-Cache |
sgv/analysis.py, claims.py, verifier.py, methods.py, run.py, trace.py, labeling.py, … | Vorläufige Studie zu Python (CRUXEval, REval): Claim-Extraktion und strukturbasierte Verifikation |
preregistration/ | Registrierung von H3 und die Hashes des vor den Läufen festgelegten Analysecodes |
annotation/ | Annotationsleitfaden, Bögen beider LLM-Annotatoren, die 20-Item-Prüfung des Autors |
results/*.md | Zusammenfassungsberichte der Studie, der Hold-out-, Entwicklungs-, Test- und H3-Sets |
tests/ | Unit-Tests (python -m unittest discover -s tests -t .) |
Python 3.12 oder neuer (entwickelt mit 3.14).
pip install -r requirements.txt
PrimeVul wird hier nicht weitergegeben. Lade die gepaarten Splits aus dem PrimeVul-Repository herunter und lege sie ab als
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
Die Paarauswahl ist deterministisch gegeben die Datei, --pairs, --max-lines und --seed. Die Daten für die vorläufige
Studie werden mit python -m sgv.data --dest data/cruxeval.jsonl und python -m sgv.reval --dest data/reval heruntergeladen.
Das Verzeichnis mit den vollständigen Ergebnissen, mit evidence.jsonl (den unter jeder Bedingung angezeigten Notizen) und records.jsonl (jeder
Modellantwort und jedem Urteil) für jeden Lauf, zusammen mit llm_cache.sqlite (allen API-Antworten), ist auf
Zenodo archiviert. Entpacken Sie es im Repository-Stammverzeichnis, sodass es results/ erzeugt. Mit dem Cache an Ort und Stelle lässt sich jeder der folgenden Läufe
aus dem Cache ohne jeglichen API-Aufruf erneut abspielen, und jede Analyse reproduziert die Zahlen des Papers.
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
Die Modelle werden über OpenAI-kompatible APIs aufgerufen (DeepSeek und Alibaba Cloud Bailian/DashScope). Modellnamen, festgelegte Snapshots und Anfrageeinstellungen befinden sich in MODELS in sgv/evidence.py. API-Schlüssel werden aus der Umgebung gelesen (SGV_API_KEY für DeepSeek, SGV_QWEN_KEY für DashScope) oder aus ~/.sgv_deepseek_key / ~/.sgv_qwen_key. Sie werden niemals im Repository gespeichert.
# 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
Hauptoptionen: --conditions (C0–C5), --presentation (plain, quote, alarms, reframe, provenance,
verify, verify-show, commit, commit-verify), --heldout (Paare, die disjunkt zum Studien-Set sind),
--max-lines, --seed. Die Datensätze des Papers sind
| Set | Quell-Split | Auswahl |
|---|---|---|
| Study | primevul_test_paired | strukturelle CWEs, ≤150 Zeilen, alle geeigneten Paare |
| Held-out | primevul_test_paired | --heldout --max-lines 300 (alle CWEs, disjunkt zum Studien-Set) |
| Development | primevul_valid_paired | alle geeigneten Paare |
| Test (registriert) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 führt die registrierte H3-Replikation aus (sieben Modelle, C2/C4/C5, plain-Darstellung).
Die Verhaltenskodierung wurde von zwei LLMs (Claude und deepseek-v4-pro) annotiert. Der Autor hat 20 Einträge manuell geprüft.
Das Paper berichtet dies.
Code: MIT (siehe LICENSE). PrimeVul und die Datensätze der Vorstudie behalten ihre eigenen Lizenzen.
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}