Package de réplication étudiant la manière dont les auditeurs de vulnérabilités LLM s'en remettent aux preuves d'analyse statique, avec un front-end C/C++ tree-sitter, des conditions de preuve contrôlées et du code d'analyse statistique.
Paquet de réplication pour l'article du même titre de ZhiHong Liu.
Des auditeurs de vulnérabilités LLM ont reçu des preuves d'analyse statique concernant des fonctions C/C++ vulnérables et corrigées issues de PrimeVul. Les preuves étaient soit vraies, soit fabriquées, tandis que le code et le modèle restaient fixes. De fausses assurances (on prétend qu'une vérification manquante existe) ont réduit la détection de vulnérabilités réelles. De fausses alertes (on prétend qu'une vérification ajoutée est manquante) n'ont jamais réduit la précision, et les modèles les ont contestées bien plus souvent. Une réplication enregistrée sur sept nouveaux modèles a confirmé l'asymétrie. Vérifier chaque affirmation dans un appel séparé et montrer les affirmations réfutées (verify-show) a réduit la déférence dans un test enregistré.
Ce dépôt contient l'analyseur, le code d'expérimentation et d'analyse, les enregistrements, les annotations et les rapports de synthèse. Les enregistrements complets des exécutions (chaque note de preuve et réponse de modèle) et le cache de réponses LLM sont archivés séparément (voir Résultats complets).
| Chemin | Contenu |
|---|---|
sgv/cfront.py | Front-end C/C++ intraprocédural (tree-sitter) : opérations sensibles, gardes dominantes, obligations de preuve |
sgv/evidence.py | L'étude contrôlée : conditions de preuve C0–C5, stratégies de présentation, configurations de modèle, exécuteur |
sgv/vuln.py | Prompt d'audit, analyse des verdicts et chargement de PrimeVul (également l'étude préliminaire sur les vulnérabilités) |
sgv/contrasts.py | Précisions par version et contrastes appariés (C4 vs C2, C5 vs C2, …) |
sgv/direction.py | Mesure de déférence sensible à la direction (H3) |
sgv/deference.py | Déférence et l'indice lexical de « contestation » |
sgv/mitigation.py | Comparaison des stratégies de présentation avec tests de McNemar appariés et correction de Holm |
sgv/pooled.py | Analyse groupée post-hoc de H2 et statistiques descriptives du jeu de données |
sgv/annotate.py | Feuilles d'annotation et accord (kappa de Cohen) pour le codage comportemental |
sgv/figures.py, sgv/diagrams.py | Toutes les figures de l'article, calculées à partir des enregistrements d'exécution |
sgv/stats.py | Intervalles de Wilson, test exact de McNemar, bootstrap apparié |
sgv/llm.py | Client compatible OpenAI avec un cache de réponses SQLite |
sgv/analysis.py, claims.py, verifier.py, methods.py, run.py, trace.py, labeling.py, … | Étude préliminaire sur Python (CRUXEval, REval) : extraction d'affirmations et vérification ancrée dans la structure |
preregistration/ | Enregistrement de H3 et les hachages du code d'analyse fixés avant les exécutions |
annotation/ | Guide d'annotation, feuilles des deux annotateurs LLM, la vérification en 20 points de l'auteur |
results/*.md | Rapports de synthèse de l'étude, des ensembles held-out, de développement, de test et H3 |
tests/ | Tests unitaires (python -m unittest discover -s tests -t .) |
Python 3.12 ou ultérieur (développé avec 3.14).
pip install -r requirements.txt
PrimeVul n'est pas redistribué ici. Téléchargez les splits appariés depuis le dépôt PrimeVul et placez-les comme
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
La sélection des paires est déterministe étant donné le fichier, --pairs, --max-lines et --seed. Les données de l'étude préliminaire sont téléchargées par python -m sgv.data --dest data/cruxeval.jsonl et python -m sgv.reval --dest data/reval.
Le répertoire des résultats complets, avec evidence.jsonl (les notes affichées sous chaque condition) et records.jsonl (chaque réponse de modèle et verdict) pour chaque exécution, ainsi que llm_cache.sqlite (toutes les réponses de l'API), est archivé sur Zenodo. Décompressez-le à la racine du dépôt afin qu'il crée results/. Une fois le cache en place, chaque exécution ci-dessous est rejouée depuis le cache sans aucun appel à l'API, et chaque analyse reproduit les chiffres de l'article.
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
Les modèles sont appelés via des API compatibles OpenAI (DeepSeek et Alibaba Cloud Bailian/DashScope). Les noms de modèles, les snapshots épinglés et les paramètres de requête se trouvent dans MODELS dans sgv/evidence.py. Les clés API sont lues depuis l'environnement (SGV_API_KEY pour DeepSeek, SGV_QWEN_KEY pour DashScope) ou depuis ~/.sgv_deepseek_key / ~/.sgv_qwen_key. Elles ne sont jamais écrites dans le dépôt.
# 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
Options principales : --conditions (C0–C5), --presentation (plain, quote, alarms, reframe, provenance,
verify, verify-show, commit, commit-verify), --heldout (paires disjointes de l'ensemble d'étude),
--max-lines, --seed. Les jeux de données de l'article sont
| Ensemble | Split source | Sélection |
|---|---|---|
| Étude | primevul_test_paired | CWE structurels, ≤150 lignes, toutes les paires éligibles |
| Held-out | primevul_test_paired | --heldout --max-lines 300 (tous les CWE, disjoints de l'ensemble d'étude) |
| Développement | primevul_valid_paired | toutes les paires éligibles |
| Test (enregistré) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 exécute la réplication H3 enregistrée (sept modèles, C2/C4/C5, présentation plain).
Le codage comportemental a été annoté par deux LLM (Claude et deepseek-v4-pro). L'auteur a vérifié 20 éléments manuellement.
L'article en rend compte.
Code : MIT (voir LICENSE). PrimeVul et les jeux de données de l'étude préliminaire conservent leurs propres licences.
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}