
Исчерпывающая дифференциальная валидация всех 4,3 млрд кодировок инструкций AArch64.
Полная карта расхождений декодеров AArch64 с архитектурой.
Silica перебирает все 4 294 967 296 возможных 32-битных слов инструкций A64, сравнивает Capstone, LLVM и Unicorn с машиночитаемой спецификацией Arm и превращает различия в воспроизводимые доказательства.
Дизассемблеру легко сказать «valid». Гораздо сложнее узнать, прав ли он. Большинство методов дифференциального тестирования может показать, что инструменты расходятся во мнениях, но не может определить правильный ответ без независимого оракула. Silica использует XML-релиз Arm в качестве такого оракула.
A64 делает возможным необычайно тщательный эксперимент: инструкции имеют ровно 32 бита в ширину, поэтому всё пространство кодировок конечно и его практически реально перебрать. Silica пользуется этим свойством. Приведённые ниже результаты проверки валидности — это не оценка и не кампания фаззинга; было проверено каждое возможное слово.
Эти результаты получены с использованием ISA_A64_xml_A_profile-2026-06_mc (Armv9.6-A). Перебор был
разбит на 256 независимо проверенных фрагментов, охватывающих все 2³² кодировок.
| Результат | Количество | Доля от полного пространства |
|---|---|---|
| Выделено спецификацией Arm | 1 799 435 776 | 41,9% |
| Не выделено спецификацией Arm | 2 495 531 520 | 58,1% |
| Обнаружено расхождений по валидности | 723 801 678 | 16,9% |
| Минимальных воспроизводимых примеров, готовых к отправке в upstream | 10 | — |
Согласие со спецификацией в вопросе о том, является ли кодировка валидной:
| Декодер | Согласие | Визуально |
|---|---|---|
| Capstone | 84,8% | █████████████████████████░░░░░ |
| LLVM | 87,6% | ██████████████████████████░░░░ |
| Unicorn | 88,3% | ██████████████████████████░░░░ |
У большого разрыва по валидности есть идентифицируемые причины. Unicorn
проверяет валидность путём выполнения инструкции и наблюдения за ловушками,
тогда как другие оракулы декодируют без выполнения. На небольшое число
областей также влияют условия UNDEFINED времени декодирования, которые
скомпилированный оракул спецификации не вычисляет. Silica фиксирует эти
ограничения, а не сглаживает их в результате.
Сравнение отрендеренных мнемоник и операндов обходится гораздо дороже, чем запись бита валидности. Поэтому Silica оценивает текст на детерминированной выборке из 1 000 000 слов, взятых из 1 266 064 016 кандидатов, где все четыре оракула считают кодировку валидной. Это выборочный результат, и он намеренно держится отдельно от исчерпывающих данных по валидности.
| Классификация внутри выборки | Записей | Доля |
|---|---|---|
| Различается отрисовка операндов | 862 648 | 86,3% |
| Нормализация требует проверки | 137 352 | 13,7% |
Выборка полезна для выявления работы по нормализации и представлению; она не претендует на исчерпывающий охват всех текстовых отрисовок.
Движок перебора создаёт большой исследовательский набор данных. silica-scope — это сопутствующее терминальное приложение, делающее этот набор данных доступным. Оно открывает готовый каталог артефактов Silica и позволяет просматривать ключевые метрики, изучать карту кодировок из 256 фрагментов, фильтровать расхождения, искать любое 32-битное слово и читать готовые к отправке воспроизводимые примеры.
Установите его из PyPI с Python 3.11 или новее:
pipx install silica-scope
Затем запустите его из рабочей копии Silica или укажите каталог артефактов:
silica-scope
silica-scope /path/to/silica/artifacts
silica-scope --report
silica-scope — это чистый Python-ридер без зависимостей от нативных
декодеров. Он не запускает исчерпывающий перебор и корректно обрабатывает
меньший опубликованный набор артефактов репозитория. См. руководство по
терминальному ридеру для описания панелей, управления с
клавиатуры и параметров обнаружения артефактов.
flowchart LR
XML["Arm XML specification"] --> SPEC["compiled spec oracle"]
SPEC --> SWEEP["parallel 32-bit sweep"]
CAP["Capstone"] --> SWEEP
LLVM["LLVM"] --> SWEEP
UNI["Unicorn"] --> SWEEP
SWEEP --> MAP["validity bitmaps"]
MAP --> DIFF["exhaustive XOR comparison"]
DIFF --> CORPUS["classified disagreement corpus"]
CORPUS --> OUT["metrics · reproducers · result hash"]Высоконагруженный путь написан на Rust и вызывает каждый декодер в своём процессе. Он хранит один бит на кодировку для каждого оракула, что делает исчерпывающее сравнение компактным, а расхождение — прямой операцией над битовой картой. Падения бисекцируются до точного слова инструкции.
Python отвечает за компиляцию спецификации, нормализацию, отчётность и независимый слой верификации. Схемы артефактов, правила выборки и известные ограничения описаны в docs/formats.md.
Создайте зафиксированное окружение и проверьте, что необходимые локальные входные данные доступны:
micromamba create -y -p ./.venv -f environment.yml
micromamba run -p ./.venv silica doctor
XML-спецификация Arm не включена в репозиторий из-за её лицензии. silica doctor
сообщает, где Silica ожидает её найти, и о любых других отсутствующих
предварительных требованиях.
Чтобы запустить полный конвейер из подготовленной рабочей копии:
make all
Это полный перебор 2³², а не быстрый дымовой тест. Он создаёт скомпилированный оракул, записи фрагментов, битовые карты валидности, корпус расхождений, опубликованные метрики, воспроизводимые примеры и стабильный хеш результата SHA-256.
Семь независимых верификаторов пересчитывают утверждения проекта из сырых артефактов. Они не доверяют сгенерированной сводке, и у каждого верификатора есть фикстура, доказывающая, что он обнаруживает дефект, от которого защищает. Нет пропущенного или предварительного состояния.
micromamba run -p ./.venv silica verify
Зафиксированные версии декодеров и заново вычисленный хеш результата делают отдельные запуски сравнимыми. Цели верификации и их текущий статус записаны в GOALS.yml.
В настоящее время Silica охватывает декодирование базового A64 и Advanced SIMD. SVE, SVE2, SME, A32/T32, RISC-V, круговые проверки ассемблера и общее тестирование выполнения находятся за пределами исследования v1.
Ближайший источник вдохновения — Sandsifter, который исследует пространство инструкций переменной длины x86. Silica применяет тот же дух систематического скептицизма к AArch64, где кодировки фиксированной ширины и независимая спецификация позволяют провести полное, выверенное сравнение.
Apache 2.0 — см. LICENSE