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クラスファイル を表す値として使用されている。
0xDEADBEEF ("dead beef") — IBM RS/6000 システム、32ビット PowerPC 用Mac OS 、コモドール Amiga でデバッグ用のマジックナンバーとして使用されている。サン・マイクロシステムズ のSolaris では、解放されたカーネルメモリを表す値として使用されている。Alpha プロセッサで動作しているOpenVMS では、CTRL-Tを押下するとDEAD_BEEFが表示される。
0xDEFEC8ED ("defecated") — OpenSolaris のコアダンプ で使用されている
0xFACEFEED ("face feed") — Alphaサーバで動作するWindows NT で使用されている。AlphaのHardware Abstraction Layer (HAL) がハードウェア障害を検出した場合、エラーメッセージとしてこの値が表示される
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"))。