Hexspeakとは
Hexspeak(ヘックススピーク)は、プログラミングの世界で使われる、ちょっと変わった言葉遊びのようなものです。数字の「0」をアルファベットの「O」に、数字の「1」を「I」に、数字の「5」を「S」にといった具合に読み替えて、16進数で意味のある単語を作ることを指します。これは、メモリやデータに特定の印をつけたい時に、
プログラマがよく使うテクニックです。
Hexspeakが生まれた背景
プログラマは、メモリやデータ領域に「未使用」や「異常データ」といった目印を付けたい場合があります。このような場合に、覚えやすく、かつ16進数として有効な「マジックナンバー」が必要となります。そこで、Hexspeakのテクニックを使い、16進数の文字(0~9、A~F)だけで意味のある単語を作り出す試みが生まれました。
特筆すべきマジックナンバーの例
多くのプロセッサやOS、
デバッガで、Hexspeakを使ったマジックナンバーが使われています。特にデバッグ用途でよく見られます。
`0xABADBABE` ("a bad babe"):Appleが「Boot Zero Block」を表す値として使用。
`0xBAADF00D` ("bad food"):
Microsoft Windowsで、`LocalAlloc`関数で確保されたメモリが初期化されていないことを示す。
`0xBADDCAFE` ("bad cafe"):OpenSolarisの`watchmalloc`ライブラリで、確保されたメモリが初期化されていないことを示す。
`0xCAFEBABE` ("cafe babe"):
Javaのクラスファイルや、
Mach-O形式のオブジェクトファイルを表す。
`0xDEADBEEF` ("dead beef"):IBM RS/6000システムや、macOS、Amigaなどでデバッグ用のマジックナンバーとして使用。Solarisでは、解放されたカーネルメモリを表す。
`0xDEFEC8ED` ("defecated"):
OpenSolarisの
コアダンプで使用。
`0xFACEFEED` ("face feed"):Alphaサーバで動作するWindows NTで使用。ハードウェア障害時にエラーメッセージとして表示。
`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"):モトローラ製マイクロコントローラのシミュレータで、未使用メモリを埋める値として使用。
`0x0000000ff1ce` ("Office"):
Microsoft Officeコンポーネントの
GUIDの末尾に使用。
マジックナンバーの作り方
利用できる文字が限られているとはいえ、"a", "b", "c", "d", "e", "f", "o", "i", "s"だけで作れる英単語はたくさんあります。そのため、Hexspeakを使ったマジックナンバーを作るのは、意外と簡単です。例えば、`0xD15EA5ED` ("diseased")や`0xBED51DE5` ("bedsides")といった値も簡単に作れます。
既存のHexspeakパターンを参考にするのも良いでしょう。既存のものはワード長と等しく、"1"や"5"で始まるものはありません。これは、符号付き整数として解釈された場合に大きな負の数になるようにするためです。例えば、`0xBAADF00D`は符号付き
32ビット整数として`-1163005939`となりますが、プログラムでこのような大きな負の数が現れることは稀です。Microsoftが使用している`0xBAADF00D`は、初期化されていないメモリへのアクセスを検知するのに役立ちます。
その他の表記
C言語では、16進数であることを示すために`0x`を先頭に付けますが、Hexspeakとして読む際には無視されます。x86
アセンブリ言語では、末尾に`h`を付けます(例:`0FEEDADEADF15h`)。
Pascalでは、先頭に`$`を付けます(例:`$EED`)。
関連項目
Leet
マジックナンバー (プログラム)
* file (UNIX)