Hexspeak
Hexspeakとは、リートスピークと類似の、英語の変わった表記法の一種である。
プログラマは、メモリやデータに「未使用」や「異常データ」といった印をつけるために分かりやすいマジックナンバーを必要としており、この際にHexspeakが作り出された。数字の"0"をアルファベットの"O"に、数字の"1"をアルファベットの"I"に、数字の"5"をアルファベットの"S"に読み替えるといった方法を利用し、16進数の表記に使われる文字 (0123456789ABCDEF) しか使えない条件下で短い単語を表現している。
特記すべきマジックナンバー
多くのプロセッサ、オペレーティングシステム (OS)、デバッガでHexspeakに基づくマジックナンバーが使用されている。特にデバッグ用の値として用いられている場合が多い。
- 0xABADBABE ("a bad babe") — Appleが"Boot Zero Block"を表す値として使っている。
- 0xBAADF00D ("bad food") — Microsoft WindowsのLocalAlloc関数の第一引数にLMEM_FIXEDを渡して呼び出してメモリを確保した場合に、ヒープに確保されたメモリが初期化されていないことを表す値として使用されている。
- 0xBADDCAFE ("bad cafe") — OpenSolarisのwatchmallocライブラリが、確保したメモリが初期化されていないことを表す値として使用している。
- 0xCAFEBABE ("cafe babe") — Mach-O(68kとPowerPCの両方で動くファットバイナリ版)において、オブジェクトファイルを表す値として使用されている。また、JavaにおいてJavaバイトコードで記述されたJavaクラスファイルを表す値として使用されている[1]。
- 0xDEADBEEF ("dead beef") — IBM RS/6000システム[2]、32ビットPowerPC用Mac OS、コモドール Amigaでデバッグ用のマジックナンバーとして使用されている。サン・マイクロシステムズのSolarisでは、開放されたカーネルメモリを表す値として使用されている。Alphaプロセッサで動作しているOpenVMSでは、CTRL-Tを押下するとDEAD_BEEFが表示される。
- 0xDEFEC8ED ("defecated") — OpenSolarisのコアダンプで使用されている[3]。
- 0xFACEFEED ("face feed") — Alphaサーバで動作するWindows NTで使用されている。AlphaのHardware Abstraction Layer (HAL) がハードウェア障害を検出した場合、エラーメッセージとしてこの値が表示される[4]。
- 0xFEE1DEAD ("feel dead") — Linuxのrebootシステムコールでマジックナンバーとして使用されている。
- 0xC0ED ("coed") — Linuxのmountシステムコールでマジックナンバーとして使用されている。
- 0xBADCAB1E ("bad cable") — Microsoft eVCデバッガにおいて、コネクションが切断されたときにデバッガに返されるエラーコードとして使用されている。
- 0xFEEDFACE ("feed face") — Mach-Oバイナリのヘッダとして使用されている。また、OpenSolarisのwatchmallocで不正なポインタを示す値として使用されている。
- 0xDEADDEAD ("dead dead") — Windows NTベースのOSで、専用のキーストロークによって強制的にブルースクリーンを発生させた際のSTOPコードとして使用されている。
- 0xBEADFACE ("bead face"または"face bead") — モトローラ68HCS12DP256マイクロコントローラのシミュレータSimHC12において、未使用のメモリを埋めておく値として使用されている。
- 0x0000000ff1ce ("Office") — Microsoft OfficeのコンポーネントのGUIDの末尾に使用されている。
マジックナンバーの作成方法
限られた文字("a", "b", "c", "d", "e", "f", "o", "i", "s")だけで作ることのできる英単語は少なくとも数百あることを考えると、Hexspeakを使ったマジックナンバーを作成するのはさほど難しいことではない。例えば、0xD15EA5ED ("diseased")、0xBED51DE5 ("bedsides")といった値を簡単に作ることができる。
また、上に挙げたような既存のHexspeakで使用されているパターンを参考にするのもよい。これらの定数はすべてワード長と等しく(32ビット環境の場合)、また"1"および"5"で始まるものはない。 これは、定数が符号付き整数値として解釈された場合に、大きな負数として扱われるようにするためである。 例えば、0xBAADF00Dを符号付き32ビット整数値として解釈すると-1163005939となるが、多くのプログラムではこのような大きな負数が現れるケースは稀である。 マイクロソフトが使用している0xBAADF00Dという値も、初期化されていないメモリへのアクセスの検知に適している。
その他の文字
- C言語で数値が16進数であることを示す際には数値の先頭に"0x"を付けるが、この"0x"はHexspeakとして読む際には無視される。
- x86アセンブリ言語では、数値の末尾に"h"を付けて16進数であることを示す(例:FEEDADEADF15h ("feed a dead fish"))。なお、この表記法では数値がA〜Fで始まる場合、変数名と認識されないように頭に"0"をつける必要がある。そのため、"FEEDADEADF15h"は実際には"0FEEDADEADF15h"となる。
- Pascalでは、数値の先頭に"$"を付けて16進数であることを示す。これを利用すると、"S"で始まる単語を作ることができる(例:$EED ("seed"))。