一张完整的 AArch64 解码器与架构规范不一致之处的地图。
Silica 遍历全部 4,294,967,296 个可能的 A64 指令字, 将 Capstone、LLVM 和 Unicorn 与 Arm 的机器可读规范进行比对, 并将差异转化为可复现的证据。
反汇编器说“有效”很容易。知道它是否正确则更难。 大多数差分测试可以揭示工具之间存在分歧,但如果没有独立的判定基准, 就无法确定正确答案。Silica 使用 Arm 的 XML 发布版本作为该判定基准。
A64 使一项异常彻底的实验成为可能:指令宽度恰好为 32 位,因此整个编码空间是有限的,并且可以实际枚举。 Silica 利用了这一点。下面的有效性结果不是估计值或模糊测试活动; 每一个可能的字都经过了检查。
这些结果使用 ISA_A64_xml_A_profile-2026-06_mc(Armv9.6-A)。扫描被
拆分为 256 个独立验证的分片,覆盖全部 2³² 个编码。
在编码是否有效方面与规范的一致程度:
| 解码器 | 一致程度 | 可视化 |
|---|---|---|
| Capstone | 84.8% | █████████████████████████░░░░░ |
巨大的有效性差距有可识别的原因。Unicorn 通过
执行指令并观察陷阱来测试有效性,而其他判定基准在不执行的情况下进行解码。
少数区域还受到解码时 UNDEFINED 条件的影响,而编译后的规范判定基准
不会对这些条件进行求值。Silica 记录这些局限性,而不是将它们从结果中抹平。
比较渲染后的助记符和操作数比记录一个有效性位要昂贵得多。 因此,Silica 在一个确定性样本上评估文本,该样本包含 1,000,000 个字, 取自 1,266,064,016 个所有四个判定基准都认为编码有效的候选字。 这是一个抽样结果,并且被有意与穷举的有效性数据分开。
| 样本内的分类 | 记录数 | 占比 |
|---|---|---|
| 操作数渲染不同 | 862,648 | 86.3% |
| 规范化需要审查 | 137,352 | 13.7% |
该样本有助于定位规范化和呈现方面的工作; 它并不声称穷举覆盖了每一种文本渲染。
扫描引擎会生成一个大型研究数据集。silica-scope 是配套的终端应用,用于让该数据集易于使用。它打开一个 已完成的 Silica 产物目录,让你可以浏览核心指标、查看 256 分片编码图、筛选分歧、查询任意 32 位字,以及 阅读可直接提交的复现用例。
使用 Python 3.11 或更高版本从 PyPI 安装:
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
Arm 的 XML 规范因其许可证而未随仓库提供。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
| 结果 | 数量 | 占整个空间的比例 |
|---|
| 由 Arm 规范分配 | 1,799,435,776 | 41.9% |
| 未由 Arm 规范分配 | 2,495,531,520 | 58.1% |
| 发现的有效性分歧 | 723,801,678 | 16.9% |
| 最小化的可上游复现用例 | 10 | — |
| LLVM | 87.6% | ██████████████████████████░░░░ |
| Unicorn | 88.3% | ██████████████████████████░░░░ |