Пакет для воспроизведения исследования того, как аудиторы уязвимостей на основе LLM полагаются на данные статического анализа, с фронтендом на tree-sitter для C/C++, контролируемыми условиями подачи данных и кодом статистического анализа.
Пакет для воспроизведения статьи с тем же названием автора ZhiHong Liu.
LLM-аудиторам уязвимостей были предоставлены свидетельства статического анализа об уязвимых и исправленных функциях C/C++ из PrimeVul. Свидетельства были либо истинными, либо сфабрикованными, при этом код и модель оставались неизменными. Ложные заверения (утверждается, что отсутствующая проверка существует) снижали обнаружение реальных уязвимостей. Ложные тревоги (утверждается, что добавленная проверка отсутствует) никогда не снижали точность, и модели оспаривали их гораздо чаще. Зарегистрированная репликация на семи новых моделях подтвердила асимметрию. Проверка каждого утверждения в отдельном вызове и показ опровергнутых утверждений (verify-show) снизили подчинение в зарегистрированном тесте.
Этот репозиторий содержит анализатор, код эксперимента и анализа, регистрации, аннотации и сводные отчёты. Полные записи прогонов (каждое свидетельство и ответ модели) и кэш ответов LLM архивированы отдельно (см. Полные результаты).
| Путь | Содержимое |
|---|---|
sgv/cfront.py | Внутрипроцедурный фронтенд C/C++ (tree-sitter): чувствительные операции, доминирующие проверки, обязательства доказательства |
sgv/evidence.py | Контролируемое исследование: условия свидетельств C0–C5, стратегии представления, конфигурации моделей, раннер |
sgv/vuln.py | Промпт аудита, разбор вердикта и загрузка PrimeVul (а также предварительное исследование уязвимостей) |
sgv/contrasts.py | Точность по версиям и сопоставленные контрасты (C4 vs C2, C5 vs C2, …) |
sgv/direction.py | Направленно-зависимая мера подчинения (H3) |
sgv/deference.py | Подчинение и лексический признак «оспаривания» |
sgv/mitigation.py | Сравнение стратегий представления с парными тестами МакНемара и поправкой Холма |
sgv/pooled.py | Пост-хок объединённый анализ H2 и описательные статистики набора данных |
sgv/annotate.py | Листы аннотации и согласие (каппа Коэна) для поведенческого кодирования |
sgv/figures.py, sgv/diagrams.py | Все рисунки статьи, вычисленные по записям прогонов |
sgv/stats.py | Интервалы Уилсона, точный тест МакНемара, парный бутстрэп |
sgv/llm.py | Клиент, совместимый с OpenAI, с кэшем ответов в SQLite |
sgv/analysis.py, claims.py, verifier.py, methods.py, run.py, trace.py, labeling.py, … | Предварительное исследование на Python (CRUXEval, REval): извлечение утверждений и верификация на основе структуры |
preregistration/ | Регистрация H3 и хэши кода анализа, зафиксированные до прогонов |
annotation/ | Руководство по аннотации, листы обоих LLM-аннотаторов, проверка автора из 20 пунктов |
results/*.md | Сводные отчёты исследования: held-out, development, test и H3 наборы |
tests/ | Модульные тесты (python -m unittest discover -s tests -t .) |
Python 3.12 или новее (разработано с 3.14).
pip install -r requirements.txt
PrimeVul здесь не распространяется. Загрузите парные разбиения из репозитория PrimeVul и разместите их как
data/primevul/primevul_train_paired.jsonl
data/primevul/primevul_valid_paired.jsonl
data/primevul/primevul_test_paired.jsonl
Выбор пар детерминирован при заданных файле, --pairs, --max-lines и --seed. Данные для предварительного
исследования загружаются командами python -m sgv.data --dest data/cruxeval.jsonl и python -m sgv.reval --dest data/reval.
Каталог с полными результатами, содержащий evidence.jsonl (заметки, отображаемые при каждом условии) и records.jsonl (каждый
ответ модели и вердикт) для каждого запуска, вместе с llm_cache.sqlite (все ответы API), архивирован на
Zenodo. Распакуйте его в корне репозитория, чтобы он создал results/. При наличии кэша каждый запуск ниже
воспроизводится из кэша без каких-либо вызовов API, а каждый анализ воспроизводит числа из статьи.
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
Модели вызываются через API, совместимые с OpenAI (DeepSeek и Alibaba Cloud Bailian/DashScope). Названия моделей,
закреплённые снимки и настройки запросов находятся в MODELS в sgv/evidence.py. Ключи API считываются из окружения
(SGV_API_KEY для DeepSeek, SGV_QWEN_KEY для DashScope) или из ~/.sgv_deepseek_key / ~/.sgv_qwen_key.
Они никогда не записываются в репозиторий.
# 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
Основные параметры: --conditions (C0–C5), --presentation (plain, quote, alarms, reframe, provenance,
verify, verify-show, commit, commit-verify), --heldout (пары, не пересекающиеся с набором исследования),
--max-lines, --seed. Наборы данных из статьи:
| Набор | Исходное разбиение | Отбор |
|---|---|---|
| Study | primevul_test_paired | структурные CWE, ≤150 строк, все подходящие пары |
| Held-out | primevul_test_paired | --heldout --max-lines 300 (все CWE, не пересекаются с набором исследования) |
| Development | primevul_valid_paired | все подходящие пары |
| Test (зарегистрированный) | primevul_train_paired | --pairs 300 --seed 7 |
run_h3.ps1 запускает зарегистрированную репликацию H3 (семь моделей, C2/C4/C5, presentation plain).
Поведенческое кодирование выполнялось двумя LLM (Claude и deepseek-v4-pro). Автор вручную проверил 20 элементов.
Статья сообщает об этом.
Код: MIT (см. LICENSE). PrimeVul и наборы данных предварительного исследования сохраняют собственные лицензии.
@misc{liu2026trusting,
title = {Trusting the Tool: Asymmetric Deference of {LLM} Vulnerability Auditors to Static-Analysis Evidence},
author = {Liu, ZhiHong},
year = {2026},
note = {Preprint}
}