
Paquete de replicación que estudia cómo los auditores de vulnerabilidades de LLM se someten a la evidencia del análisis estático, con un front end de C/C++ basado en tree-sitter, condiciones de evidencia controladas y código de análisis estadístico.
Paquete de replicación del artículo del mismo título de ZhiHong Liu.
A los auditores de vulnerabilidades LLM se les proporcionó evidencia de análisis estático sobre funciones C/C++ vulnerables y parcheadas de PrimeVul. La evidencia era verdadera o fabricada, mientras que el código y el modelo permanecían fijos. Las falsas garantías (se afirma que existe una comprobación ausente) redujeron la detección de vulnerabilidades reales. Las falsas alarmas (se afirma que falta una comprobación añadida) nunca redujeron la precisión, y los modelos las impugnaron con mucha más frecuencia. Una replicación registrada en siete modelos nuevos confirmó la asimetría. Verificar cada afirmación en una llamada separada y mostrar las afirmaciones refutadas (verify-show) redujo la deferencia en una prueba registrada.
Este repositorio contiene el analizador, el código del experimento y del análisis, los registros, las anotaciones y los informes resumen. Los registros completos de ejecución (cada nota de evidencia y respuesta del modelo) y la caché de respuestas del LLM están archivados por separado (véase Resultados completos).
| Ruta | Contenido |
|---|---|
sgv/cfront.py | Front end intraprocedimental de C/C++ (tree-sitter): operaciones sensibles, guardas dominantes, obligaciones de prueba |
sgv/evidence.py | El estudio controlado: condiciones de evidencia C0–C5, estrategias de presentación, configuraciones de modelos, ejecutor |
sgv/vuln.py | Prompt de auditoría, análisis de veredictos y carga de PrimeVul (también el estudio preliminar de vulnerabilidades) |
sgv/contrasts.py | Precisiones por versión y contrastes emparejados (C4 vs C2, C5 vs C2, …) |
sgv/direction.py | Medida de deferencia sensible a la dirección (H3) |
sgv/deference.py | Deferencia y la señal léxica de "disputa" |
sgv/mitigation.py | Comparación de estrategias de presentación con pruebas de McNemar emparejadas y corrección de Holm |
sgv/pooled.py | Análisis agrupado post-hoc de H2 y descriptivos del conjunto de datos |
sgv/annotate.py | Hojas de anotación y concordancia (kappa de Cohen) para la codificación conductual |
sgv/figures.py, sgv/diagrams.py | Todas las figuras del artículo, calculadas a partir de los registros de ejecución |
sgv/stats.py | Intervalos de Wilson, prueba exacta de McNemar, bootstrap emparejado |
sgv/llm.py | Cliente compatible con OpenAI con una caché de respuestas SQLite |
sgv/analysis.py, claims.py, verifier.py, methods.py, run.py, trace.py, labeling.py, … | Estudio preliminar sobre Python (CRUXEval, REval): extracción de afirmaciones y verificación fundamentada en la estructura |
preregistration/ | Registro de H3 y los hashes del código de análisis fijados antes de las ejecuciones |
annotation/ | Guía de anotación, hojas de ambos anotadores LLM, la comprobación de 20 elementos del autor |
results/*.md | Informes resumen del estudio, conjuntos held-out, de desarrollo, de prueba y de H3 |
tests/ | Pruebas unitarias (python -m unittest discover -s tests -t .) |
Python 3.12 o posterior (desarrollado con 3.14).
pip install -r requirements.txt
PrimeVul no se redistribuye aquí. Descargue los splits emparejados desde el repositorio de PrimeVul y colóquelos como
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
La selección de pares es determinista dado el archivo, --pairs, --max-lines y --seed. Los datos para el estudio preliminar se descargan mediante python -m sgv.data --dest data/cruxeval.jsonl y python -m sgv.reval --dest data/reval.
El directorio de resultados completos, con evidence.jsonl (las notas mostradas bajo cada condición) y records.jsonl (cada respuesta del modelo y veredicto) para cada ejecución, junto con llm_cache.sqlite (todas las respuestas de la API), está archivado en Zenodo. Descomprímelo en la raíz del repositorio para que cree results/. Con la caché en su lugar, cada ejecución a continuación se reproduce desde la caché sin ninguna llamada a la API, y cada análisis reproduce las cifras del artículo.
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
Los modelos se invocan a través de APIs compatibles con OpenAI (DeepSeek y Alibaba Cloud Bailian/DashScope). Los nombres de los modelos, las instantáneas fijadas y la configuración de las solicitudes están en MODELS en sgv/evidence.py. Las claves de API se leen del entorno (SGV_API_KEY para DeepSeek, SGV_QWEN_KEY para DashScope) o de ~/.sgv_deepseek_key / ~/.sgv_qwen_key. Nunca se escriben en el repositorio.
# 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
Opciones principales: --conditions (C0–C5), --presentation (plain, quote, alarms, reframe, provenance,
verify, verify-show, commit, commit-verify), --heldout (pares disjuntos del conjunto de estudio),
--max-lines, --seed. Los conjuntos de datos del artículo son
| Conjunto | División de origen | Selección |
|---|---|---|
| Estudio | primevul_test_paired | CWEs estructurales, ≤150 líneas, todos los pares elegibles |
| Retenido | primevul_test_paired | --heldout --max-lines 300 (todas las CWEs, disjunto del conjunto de estudio) |
| Desarrollo | primevul_valid_paired | todos los pares elegibles |
| Prueba (registrado) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 ejecuta la replicación H3 registrada (siete modelos, C2/C4/C5, presentación simple).
La codificación conductual fue anotada por dos LLMs (Claude y deepseek-v4-pro). El autor verificó 20 elementos manualmente.
El artículo reporta esto.
Código: MIT (ver LICENSE). PrimeVul y los conjuntos de datos del estudio preliminar conservan sus propias licencias.
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}