
AArch64命令エンコーディング全43億通りの網羅的差分検証。
AArch64デコーダがアーキテクチャとどこで食い違うかの完全な地図。
Silicaは、4,294,967,296個のすべての可能なA64命令ワードを走査し、 Capstone、LLVM、UnicornをArmの機械可読仕様と比較し、 その差異を再現可能な証拠へと変える。
逆アセンブラが「有効」と言うのは簡単だ。それが正しいかどうかを知るのはもっと難しい。 ほとんどの差分テストは、ツール間で意見が食い違うことを明らかにできるが、 独立したオラクルなしには正しい答えを特定できない。SilicaはArmのXMLリリースを そのオラクルとして使用する。
A64は異常に徹底した実験を可能にする。命令はちょうど32ビット幅なので、 エンコーディング空間全体が有限であり、列挙することが実用的だ。 Silicaはこの特性を活用している。以下の有効性の結果は推定でも ファジングキャンペーンでもない。すべての可能なワードが検査されている。
これらの結果は(Armv9.6-A)を使用している。走査は 2³²個のエンコーディングすべてをカバーする256個の独立して検証されたシャードに 分割された。
ISA_A64_xml_A_profile-2026-06_mc| 結果 | 件数 | 空間全体に占める割合 |
|---|---|---|
| Arm仕様により割り当て済み | 1,799,435,776 | 41.9% |
| Arm仕様により未割り当て | 2,495,531,520 | 58.1% |
| 発見された有効性の不一致 | 723,801,678 | 16.9% |
| 最小のupstream-ready再現プログラム | 10 | — |
エンコーディングが有効かどうかに関する仕様との一致:
| デコーダ | 一致率 | 視覚化 |
|---|---|---|
| Capstone | 84.8% | █████████████████████████░░░░░ |
| LLVM | 87.6% | ██████████████████████████░░░░ |
| Unicorn | 88.3% | ██████████████████████████░░░░ |
この大きな有効性のギャップには特定可能な原因がある。Unicornは命令を実行して
トラップを観測することで有効性をテストするが、他のオラクルは実行せずにデコードする。
少数の領域は、コンパイル済み仕様オラクルが評価しないデコード時のUNDEFINED
条件の影響も受けている。Silicaはこれらの制限を結果から平滑化するのではなく
記録する。
レンダリングされたニーモニックとオペランドの比較は、有効性ビットの記録よりも はるかに高コストである。そのためSilicaは、4つのオラクルすべてがエンコーディングを 有効とみなす1,266,064,016個の候補から抽出した1,000,000ワードの決定論的サンプルで テキストを評価する。これはサンプリング結果であり、網羅的な有効性の数値とは 意図的に分けて扱われる。
| サンプル内の分類 | レコード数 | 割合 |
|---|---|---|
| オペランドのレンダリングが異なる | 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で書かれており、各デコーダをインプロセスで呼び出す。 オラクルごとにエンコーディングあたり1ビットを格納することで、網羅的な比較を コンパクトに保ち、不一致を直接的なビットマップ演算にする。クラッシュは 正確な命令ワードまで二分探索される。
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結果ハッシュを生成する。
7つの独立した検証器が、生のアーティファクトからプロジェクトの主張を再計算する。 それらは生成されたサマリーを信頼せず、各検証器には、それが防ぐ欠陥を検出する ことを証明するフィクスチャがある。スキップされた状態や暫定的な状態は存在しない。
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を参照