概要
- x86命令 「ud2」は、意図的に 無効な命令例外 を発生させるために使われる
- コンパイラ は「到達不能コード」などで「ud2」を生成することがある
- 「ud2」以前には「0F FF」や「0F B9」なども使われていたが、動作が一貫しなかった
- Intel が公式に「ud2」を導入し、常に例外を発生させることを保証
- 「ud2」 はパラメータを持たず、安定した例外発生手段として推奨される
x86命令「ud2」とその歴史
- ud2命令 は、x86アーキテクチャで「無効な命令例外(invalid opcode exception)」を必ず発生させる命令
- 主な用途 は、到達不能なコード(例:[[noreturn]]関数が戻った場合など)で、実行時にクラッシュさせるため
- コンパイラ は、実行が到達してはいけない箇所に「ud2」を挿入し、予期せぬ動作を防止
- 命令名の由来 は、「ud0(0F FF)」や「ud1(0F B9)」と区別するため
- ud0 :0F FF命令列、かつて無効命令例外を発生させていた
- ud1 :0F B9命令列、同様に使われていた
- ud2 :公式に導入された、常に例外を発生させる命令
- Intel は、「0F FF」や「0F B9」が将来的に定義される可能性や動作の不確実性を解消するため、「ud2」を導入
ud2以前の無効命令の課題
- ud0(0F FF) や ud1(0F B9) は、レジスタやメモリオペランドを持つ命令としてデコードされる
- 実際にはパラメータは使われないが、デコード時に参照される
- 命令がページ境界 にまたがる場合、次のページが存在しないと「無効命令例外」ではなく「アクセス違反」になることがある
- このため、動作が一貫しないリスク
- 旧世代CPU では、「0F FF」デコード時に即座に例外を発生させるものもあり、挙動に差異
ud2の利点と推奨理由
- 2バイト命令 でパラメータを持たず、デコードが単純
- どの環境でも一貫して「無効命令例外」 が発生
- メモリ参照や追加バイト を必要とせず、ページ境界問題も発生しない
- 将来的な互換性 や安定動作を重視する場合、必ず「ud2」を使用することが推奨
著者紹介:Raymond
- Raymond はWindowsの進化に30年以上携わるエンジニア
- 2003年からWebサイト「The Old New Thing」を運営
- 同名の書籍(Addison Wesley 2007)も出版
- Windows Dev Docs のTwitterアカウントでも時折登場し、技術的な逸話を紹介
x86には詳しくないけど、他のアーキテクチャではソフトウェアの割り込みや例外を発生させることができるんだよね。x86にはこれがないの?それとも、そういう機能が十分なユースケースをカバーしてないのかな?