マジックナンバー(プログラミング)

コンピュータプログラミングにおいて、マジックナンバーまたはファイルシグネチャとは、ソースコード内の数値リテラルであり、読者には明確ではない特別な意味を持ちます。また、コンピューティング(プログラミングに限らず)においても、この用語は特定の概念を識別するものの、追加の知識がなければその意味が明確ではない数値を指すために使用されます。例えば、一部のファイル形式は、ファイルに埋め込まれたマジックナンバーによって識別されます。また、ユニバーサルユニーク識別子など、特定の概念と比較的一意に関連付けられた数値も、マジックナンバーに分類される場合があります。

数値リテラル

マジックナンバーまたはマジック定数とは、ソースコード内に存在する数値リテラルで、文脈から見て必ずしも明確ではない特別な意味を持ちます。これはアンチパターンとみなされ、1960年代のCOBOLFORTRANPL/1のマニュアルにまで遡る、最も古いプログラミングルールの一つに違反しています。[ 1 ]

たとえば、税込価格を計算する次のコードでは、1.05値が消費税率 5% をわかりにくい方法でエンコードしているため、マジック ナンバーになります。

税引後価格 = 1.05 × 価格 

コード内でマジックナンバーを使用すると、開発者がその数字を選んだ意図が不明瞭になり、[ 2 ]微妙なエラーが発生する可能性が高まり、将来的にプログラムの適応や拡張が困難になります。[ 3 ]例えば、すべての数字が正しく入力されているか、または円周率3.14159265358979323846の定数が精度を落としてプログラムの機能に影響を与えずにに切り捨てられるかを判断するのは困難です。すべての重要なマジックナンバーを名前付き定数(説明変数とも呼ばれる)に置き換えることで、プログラムの読みやすさ、理解しやすさ、保守性が向上します。[ 4 ]3.14159

上記の例は、説明的な名前の変数を追加することで改善できます。

税金 = 0.05 税引後価格 = (1.0 + 税金) * 価格 

適切な名前を付けると、元の作者ではないメンテナーや、時間が経てば元の作者自身でさえも理解しやすくなるコードを作成できます。[ 5 ]情報量の少ない名前の定数の例としては がありますがint SIXTEEN = 16、 の方int NUMBER_OF_BITS = 16が便利かもしれません。

数値以外のデータもマジックナンバーと同様の魔法の特性を持つ可能性があり、そのためマジックナンバーと同様の問題が発生することがあります。[ 1 ]そのため、リテラルを直接使用するよりも宣言しconst string testUserName = "John"て使用する方がよい場合があります。 testUserName"John"

たとえば、標準的なトランプのパックを表す配列内の値をランダムにシャッフルする必要がある場合、次の疑似コードは、 Fisher–Yates シャッフルアルゴリズムを使用してその処理を実行します。

i1から52まで j := i + ランダム整数(53 - i) - 1 a.swapEntries(i, j) 

が配列オブジェクトである場合a、関数は1からxrandomInt(x)まで(両端を含む)のランダムな整数を選択し、配列のi番目とj番目の要素を入れ替えます。前の例では、とがマジックナンバーであり、互いに明確な関連性はありません。より適切なプログラミングスタイルとして、次のように記述します。 swapEntries(i, j)5253

int deckSize:= 52、 i1からdeckSizeまで j := i + ランダム整数(デッキサイズ + 1 - i) - 1 a.swapEntries(i, j) 

これはいくつかの理由から好ましいです:

  • 読みやすさの向上。最初の例を読んだプログラマーは、「ここでの数字52は何を意味しているのだろう?なぜ52なのだろう?」と疑問に思うかもしれません。プログラマーはコードを注意深く読んだ後、意味を推測できるかもしれませんが、それは明白ではありません。[ 5 ]マジックナンバーは、同じ数字がコードの1つのセクションで異なる目的で使用されている場合に特に混乱を招きます。
  • メンテナンスが容易。数値の値は重複しないため、変更が容易です。マジックナンバーの値を変更すると、プログラム内の異なる場所で同じ値が複数回使用されることが多いため、エラーが発生しやすくなります。[ 5 ]また、意味的に異なる2つの変数または数値が同じ値を持つ場合、誤って一緒に編集される可能性があります。[ 5 ]最初の例を78枚のタロットカードのデッキをシャッフルするように変更する場合、プログラマーはプログラム内の52のすべてのインスタンスを単純に78に置き換えてしまう可能性があります。これは2つの問題を引き起こします。まず、例の2行目の値53が抜け落ちてしまい、アルゴリズムが微妙な形で失敗する可能性があります。次に、デッキのサイズを指しているか、グレゴリオ暦の週数など全く別の何かを指しているか、あるいはより巧妙に「1523」のような数値の一部であるかにかかわらず、あらゆる場所で「52」という文字が置き換えられてしまう可能性があり、これらはすべてバグを引き起こします。対照的に、2 番目の例の変数の値を変更するのはdeckSize、単純な 1 行の変更になります。
  • ドキュメント化を推奨します[ 5 ]名前付き変数が宣言されている単一の場所は、その値の意味と、なぜその値を持つのかをドキュメント化するのに適しています。同じ値を複数の場所で宣言すると、コメントが重複する(そして、一部を更新しても一部が欠落している場合に発生する問題が発生する)か、作成者が値を自然に説明でき、かつ読者が説明を探す可能性が高い箇所がなくなるかのいずれかになります。
  • 情報を統合します。「マジックナンバー」変数の宣言は、通常、関数やファイルの先頭にまとめて配置することができ、確認や変更が容易になります。[ 5 ]
  • タイプミスを検出します。リテラルではなく変数を使用すると、コンパイラのチェックを活用できます。誤って「52」ではなく「62」と入力しても検出されませんが、「dekSize」ではなく「deckSize」と入力すると、宣言されていないというコンパイラの警告が表示されますdekSize
  • 入力の手間が省けます。IDEコード補完をサポートしている場合は、変数名の最初の数文字を入力すると、そのほとんどが自動的に入力されます。
  • パラメータ化を容易にします。例えば、上記の例を任意の枚数のカードのデッキをシャッフルする手順に一般化するには、 をdeckSizeその手順のパラメータに変換するだけで十分ですが、最初の例ではいくつかの変更が必要になります。
関数shuffle ( int deckSize) i を1からdeckSizeまで変化させます。 j := i + ランダム整数(デッキサイズ + 1 - i) - 1 a.swapEntries(i, j) 

デメリットは次のとおりです。

  • 局所性が損なわれます。名前付き定数が使用箇所の近くで定義されていない場合、コードの局所性が損なわれ、ひいてはコードの理解しやすさも損なわれます。52 をおそらく遠い場所に置くと、「for」ループの動作を完全に理解するために(例えばループの実行時間を見積もるために)、定義を追跡し、それが期待される数値であることを確認する必要があります。定数がコードの一部でのみ使用されている場合は、宣言を再配置することで簡単にこれを回避できます。一方、名前付き定数がコードのさまざまな部分で使用されている場合、その離れた場所にあることは、読者にとって同じ値がコードの他の場所に出現する手がかりとなり、調査する価値があるかもしれません。
  • 冗長性が生じます。定数の宣言は1行追加されます。定数名が値よりも長い場合、特に1行に複数の定数が出現する場合は、コードの1つの論理ステートメントを複数行に分割する必要がある可能性があります。冗長性の増加は、定数について混乱が生じる可能性がある場合、または他のカードゲームでシャッフルルーチンを再利用するなど、定数を変更する必要がある可能性がある場合に正当化される場合があります。同様に、表現力の向上として正当化される場合もあります。
  • パフォーマンスに関する考慮事項deckSize + 1。実行時に式を処理する方が、値「53」よりも遅くなる可能性があります。とはいえ、最近のコンパイラのほとんどは、定数畳み込みループ最適化などの手法を用いてコンパイル時に加算を解決するため、コード内でマジックナンバーを使用する場合と比べて、速度の低下は通常、全くないか、ごくわずかです。特に、デバッグにかかる​​コストや、説明のつかないコードを理解するのにかかる時間は、わずかな計算コストと比べるべきです。

承認された使用

数値リテラルに特別な意味がない場合、その使用は魔法とは分類されませんが、何が特別な意味を持つかは主観的なものです。魔法と見なされないことが多いリテラルの例としては、以下のものがあります。

  • forループで0と1を初期値または増分値として使用する。例:for(inti=0;i<max;i+=1)
  • 2 を使って数が偶数か奇数かを調べます。は剰余演算子isEven = (x % 2 == 0)です。%
  • 10 の累乗を使用してメートル法の値を変換する (例: グラムとキログラムの間)、またはパーセンテージとパーミル値を計算します。
  • (f(x) ** 2 + f(y) ** 2) ** 0.5次のような式における指数f×2+fy2{\displaystyle {\sqrt {f(x)^{2}+f(y)^{2}}}}
  • リテラルの1と0は、ブール値のtrueとfalseを表すために使用されることがあります。これらの値には、TRUEやFALSEなどの名前を割り当てる方が適切かもしれません。
  • C および C++ では、C 標準ライブラリがマクロを定義し、最新の C++ にキーワード が含まれているにもかかわらず、0 はnull ポインターを意味するためによく使用されます。NULLnullptr

フォーマットインジケーター

起源

フォーマット インジケーターは、初期のバージョン 7 Unixソース コードで初めて使用されました。

Unixはメモリ保護を持たない初期のDEC PDP-11 /20に移植された。そのため、初期のUnixでは再配置可能メモリ参照モデルが使用されていた。[ 6 ]第6版より前のUnixバージョンでは、実行可能ファイルをメモリに読み込み、プログラムの最初の下位メモリアドレス(相対アドレス0)にジャンプしていた。ページングバージョンのUnixの開発に伴い、実行可能イメージのコンポーネントを記述するヘッダーが作成された。また、ヘッダーの最初のワードとして分岐命令が挿入され、ヘッダーをスキップしてプログラムを開始できるようになった。このようにして、プログラムは従来の再配置可能メモリ参照(通常)モードまたはページングモードで実行できた。より多くの実行可能形式が開発されるにつれて、分岐オフセットを増分することで新しい定数が追加された。[ 7 ]

Unix プログラム ローダーの第6 版のソース コードでは、exec() 関数がファイル システムから実行可能 (バイナリ) イメージを読み取ります。ファイルの最初の 8バイトは、プログラム (テキスト) と初期化された (グローバル) データ領域のサイズを含むヘッダーです。また、ヘッダーの最初の 16 ビット ワードは 2 つの定数と比較され、実行可能イメージに再配置可能なメモリ参照(通常)が含まれているか、新しく実装されたページ化された読み取り専用の実行可能イメージが含まれているか、命令とデータが分離されたページ化されたイメージが含まれているかが判断されます。[ 8 ]ヘッダー定数の 2 つの役割については触れられていませんが、定数の上位バイトは実際にはPDP-11 分岐命令の操作コード(8進数で 000407、16 進数で0107 ) でした。プログラム カウンタに 7 を追加すると、この定数が実行されると、Unix exec() サービスが実行可能イメージの 8 バイト ヘッダーを介して分岐し、プログラムが起動することが示されました。

Unixの第6版および第7版ではページングコードが採用されていたため、ヘッダー定数の二重の役割は隠蔽されていました。つまり、exec() サービスは実行ファイルのヘッダー(メタ)データをカーネル空間バッファに読み込みますが、実行イメージはユーザー空間に読み込むため、定数の分岐機能は使用されませんでした。マジックナンバーの生成はUnixのリンカーローダーに実装されており、マジックナンバーによる分岐は、第6版および第7版に付属していたスタンドアロン診断プログラム群では依然として使用されていたと考えられます。したがって、ヘッダー定数は確かに錯覚を引き起こし、マジックナンバーの基準を満たしていました。

バージョン7のUnixでは、ヘッダー定数は直接テストされず、 ux_mag [ 9 ]という変数に割り当てられ、その後マジックナンバーと呼ばれるようになりました。おそらくその独自性から、マジックナンバーという用語は実行可能フォーマットの種類を意味するようになり、その後ファイルシステムの種類を意味するようになり、さらにあらゆる種類のファイルを意味するようになりました。

ファイル内

マジックナンバーは、多くのオペレーティングシステムのプログラムでよく使用されます。マジックナンバーは、厳密に型指定されたデータを実装し、プログラム実行時にデータ型を読み取る制御プログラムへの帯域内シグナリングの一種です。多くのファイルには、含まれるデータを識別するこのような定数が含まれています。ファイル内のこのような定数を検出することは、多くのファイル形式を区別するためのシンプルで効果的な方法であり、実行時の詳細情報も得ることができます。

  • コンパイルされたJavaクラスファイルバイトコード)とMach-Oバイナリは、16進数で始まりますCA FE BA BE。Pack200で圧縮すると、バイトは に変更されますCA FE D0 0D
  • GIF画像ファイルのASCIIコードは「GIF89a」(47 49 46 38 39 61)または「GIF87a」(47 49 46 38 37 61)です。
  • JPEG画像ファイルは で始まりFF D8で終わりますFF D9。JPEG/ JFIFファイルには、ヌルで終了する文字列「JFIF」( 4A 46 49 46 00) が含まれます。JPEG/ Exifファイルには、ヌルで終了する文字列「Exif」( 45 78 69 66 00) と、それに続くファイルに関するメタデータが含まれます。
  • PNG画像ファイルは、ファイルがPNGファイルであることを示す8バイトの89 50 4E 47 0D 0A 1A 0A署名で始まり、一般的なファイル転送の問題を検出することができます: "\211PNG\r\n\032\n" ( )。この署名には様々な改行文字が含まれており、 FTPでバイナリモードではなくASCII転送モードでファイルを転送するなど、不必要な自動改行変換を検出することができます。[ 10 ]
  • 標準MIDIオーディオ ファイルには、「MThd」( M IDI T rack h ea d er ) のASCIIコードがあり、その後にさらにメタデータが続きます。4D 54 68 64
  • UnixまたはLinux のスクリプトは、スクリプトが呼び出されたインタープリタと異なる可能性がある場合、シェバン("#!" )で始まり、その後にインタープリタ23 21へのパスが続くことがあります。
  • ELF7F実行ファイルは、"ELF" ( ) が続くバイトで始まります7F 45 4C 46
  • PostScriptファイルおよびプログラムは「%!」 ( 25 21) で始まります。
  • PDFファイルは「%PDF」(16 進数25 50 44 46) で始まります。
  • DOS MZ実行ファイルおよびMicrosoft Windows PE (Portable Executable)ファイルのEXEスタブは、ファイル形式の設計者であるMark Zbikowskiのイニシャルである「MZ」( )という文字で始まります。定義では、PE以外のEXEであるdosZMXPには、珍しい「ZM」( )という文字も許容されています。[ 11 ]4D 5A5A 4D
  • Berkeley Fast File Systemスーパーブロック フォーマットは、バージョンに応じて19 54 01 19またはとして識別されます01 19 54。どちらも作成者であるMarshall Kirk McKusickの誕生日を表しています。
  • ほぼすべてのIA-32 IBM PC 互換機上の起動可能なストレージ デバイスのマスターブート レコードには、最後の 2 バイトとしてのコードが入っています。55 AA
  • ゲームボーイおよびゲームボーイアドバンス携帯型ビデオゲームシステムの実行ファイルには、ヘッダー内の固定位置にそれぞれ48バイトまたは156バイトのマジックナンバーが存在します。このマジックナンバーは、任天堂ロゴのビットマップをエンコードしています。
  • Amiga クラシック68000マシンで実行されるAmigaソフトウェア実行可能Hunkファイルはすべて、16 進数 $000003f3 で始まり、「Magic Cookie」というニックネームが付けられています。
  • Amiga では、システム内の唯一の絶対アドレスは 16 進 $0000 0004 (メモリ位置 4) であり、ここには SysBase と呼ばれる開始位置 (Amiga のいわゆるカーネルである exec.library へのポインタ) が含まれています。
  • 従来の Mac OSおよびBeOS for PowerPC実行可能ファイルで使用されるPEFファイルには、プレフィックスとして「Joy!」 ( ) のASCIIコードが含まれています。4A 6F 79 21
  • TIFFファイルは「II」または「MM」で始まり、その後にリトルエンディアンまたはビッグエンディアンバイト順序の 2 バイト整数42が続きます。「II」はリトルエンディアンバイト順序を使用する Intel 用なので、マジックナンバーは です。「MM」はビッグエンディアンバイト順序を使用する Motorola 用なので、マジックナンバーは です。49 49 2A 004D 4D 00 2A
  • UTF-16でエンコードされたUnicodeテキストファイルは、多くの場合、エンディアン(ビッグエンディアン用とリトルエンディアン用)を識別するためのバイトオーダーマークで始まります。また、 Microsoft Windowsでは、UTF-8テキストファイルは、多くの場合、同じ文字のUTF-8エンコードで始まります。FE FFFF FEEF BB BF
  • LLVMビットコード ファイルは「BC」( 42 43) で始まります。
  • WADファイルは、「IWAD」または「PWAD」(Doomの場合)、「WAD2」(Quakeの場合)、「WAD3」(Half-Lifeの場合)で始まります。
  • Microsoft Compound File Binary Format ( Microsoft Officeドキュメントの古い形式の 1 つとしてよく知られています) ファイルは で始まりD0 CF 11 E0、視覚的には「DOCFILE0」という単語を連想させます。
  • ZIPファイルのヘッダーは、テキスト エディターでは「PK♥♦」( ) と表示されることがよくあります。ここで、「PK」はDOS圧縮ユーティリティPKZIPの作者Phil Katz50 4B 03 04のイニシャルです。
  • 7zファイルのヘッダーは「7z」(完全なマジックナンバー: 37 7A BC AF 27 1C) で始まります。
検出

Unixユーティリティプログラムはfile、ファイルからマジックナンバーを読み取って解釈することができ、その情報を解析するために使用されるファイルはmagicと呼ばれます。WindowsユーティリティTrIDも同様の目的を持っています。

プロトコルでは

  • AIM / ICQで使用されるOSCAR プロトコルは、リクエストに というプレフィックスを付けます。2A
  • VNCで使用されるRFB プロトコルでは、クライアントは「RFB」(「Remote Frame Buffer」の略)に続けてクライアントのプロトコル バージョン番号を送信することで、サーバーとの会話を開始します。52 46 42
  • Microsoft Windows で使用されるSMBプロトコルでは、各 SMB 要求またはサーバー応答はFF 53 4D 42、または\xFFSMBSMB 要求の先頭で始まります。
  • Microsoft Windows で使用されるMSRPCプロトコルでは、TCP ベースの各リクエストは、05リクエストの先頭に (Microsoft DCE/RPC バージョン 5 を表す)で始まり、その直後にマイナーバージョンを表す00または が続きます01。UDP ベースの MSRPC リクエストでは、最初のバイトは常に です04
  • COMおよびDCOMのマーシャリングされたインターフェース(OBJREF)は、常にバイトシーケンス「MEOW」(4D 45 4F 57)で始まります。デバッグ拡張機能(DCOMチャネルフックに使用される)は、バイトシーケンス「MARB」(4D 41 52 42)で始まります。
  • 暗号化されていないBitTorrent トラッカー要求は、ヘッダーの長さを表す値を含む 1 バイトで始まり19、その直後にバイト位置 1 に「BitTorrent プロトコル」というフレーズが続きます。
  • eDonkey2000 / eMuleトラフィックは、クライアントバージョンを表す1バイトで始まります。現在は、E3eDonkey クライアント、C5eMule、D4圧縮された eMule を表します。
  • ビットコインブロックチェーンのブロックの最初の4バイトには、ネットワーク識別子として機能するマジックナンバーが含まれています。値は でD9 B4 BE F9、メインネットワークを示し、 はDA B5 BF FAテストネットを示します。
  • SSLトランザクションは常に「client hello」メッセージで始まります。すべてのSSLパケットのプレフィックスとして使用されるレコードカプセル化方式は、2バイトと3バイトのヘッダー形式で構成されています。通常、SSLバージョン2のclient helloメッセージには がプレフィックスとして付加され、80SSLv3のclient helloメッセージに対するサーバー応答は で始まります16(ただし、これは異なる場合があります)。
  • DHCP63 82 53 63パケットは、パケットのオプションセクションの先頭に「マジッククッキー」値を使用します。この値は、すべてのDHCPパケットタイプに含まれています。
  • HTTP/2接続は 24 文字の文字列で始まりますPRI * HTTP/2.0\r\n\r\nSM\r\n\r\n。これは、HTTP 2.0 ではなく、以前のバージョンの HTTP をサポートするサーバーや中継サーバーによるフレーム処理を回避するように設計されています。
  • WebSocketのオープニング ハンドシェイクでは、 UUIDv4 を含む文字列が使用されます258EAFA5-E914-47DA-95CA-C5AB0DC85B11

インターフェースでは

マジック ナンバーは、 DOSWindowsNetWareなど、多くのオペレーティング システムのAPI 関数およびインターフェイスでよく使用されます。

  • IBM PC互換機のBIOSは、マジック値とを使用して00 0012 34システムが再起動時にメモリをカウントアップするかどうかを決定し、コールドブートまたはウォームブートを実行します。これらの値は、EMM386メモリマネージャがブート要求を傍受する際にも使用されます。[ 12 ]55 AA BIOSは、ディスクがブート可能かどうかを判断するためにもマジック値を使用します。 [ 13 ]
  • MS -DOSディスクキャッシュSMARTDRV(コードネーム「Bambi」)はマジック値BA BEEB ABAPI関数を使用します。[ 12 ]
  • 英国の旧ヨーロッパ開発センターで開発された多くのDR-DOSNovell DOSOpenDOSドライバは、(エミュレートされた)標準DOS関数の上に追加の機能を呼び出したり提供したりするときに、この値をマジックトークンとして使用します。NWCACHEはその一例です。[ 12 ]0E DC

その他の用途

GUID

グローバル一意識別子(GUID)を覚えやすいように作成または変更することは可能ですが、ほぼ一意の識別子としての強度が損なわれるため、これは強く推奨されません。 [ 15 ] [ 16 ] GUIDとUUIDを生成するための仕様は非常に複雑であり、適切に実装されていれば、それらは事実上一意になります。[ 17 ]

Microsoft Office製品の Microsoft Windows 製品 ID 番号は、("OFFICE")で終わる場合があります0000-0000-0000000FF1CE。たとえば90160000-008C-0000-0000-0000000FF1CE、「Office 16 Click-to-Run Extensibility Component」の製品 ID は です。

Javaでは、で始まるいくつかのGUIDが使用されますCAFEEFAC[ 18 ]

GPTパーティションスキームのGUIDパーティションテーブルでは、 BIOSブートパーティションはGUID定義に従わない特別なGUID 21686148-6449-6E6F-744E-656564454649[ 19 ]を使用します。代わりに、文字列のASCIIHah!IdontNeedEFIコードを部分的にリトルエンディアン順序で使用して形成されます。[ 20 ]

デバッグ値

マジックデバッグ値とは、メモリの割り当て時または解放時に書き込まれる特定の値です。これにより、後でメモリが破損しているかどうかを確認したり、初期化されていないメモリから取得された値が使用されている場合、そのことが明確になります。メモリは通常16進数で表現されるため、記憶に残りやすい繰り返し値や16進数で表現される値が一般的です。バイトアドレス指定に対応していないプロセッサがポインタ(偶数アドレスに指定する必要がある)として使用しようとした場合にエラーが発生するため、数値的に奇数値が推奨されます。値は、プログラムコード、静的データ、ヒープデータ、スタックなどのアドレスから離れた場所を選択する必要があります。同様に、特定のアーキテクチャの命令セットにおいて有効なコードではない値を選択することもできます。

32 ビット整数がこの特定の値を取る可能性は非常に低いですが、デバッガーメモリ ダンプにこのような数値が表示される場合は、バッファー オーバーフローや初期化されていない変数などのエラーが発生している可能性が高くなります。

有名で一般的な例としては次のようなものがあります。

コード 説明
00008123MS Visual C++で使用されます。削除されたポインタはこの値に設定されるため、その後使用されると例外がスローされます。これはゼロアドレスのより分かりやすい別名です。セキュリティ開発ライフサイクル(/sdl)オプションで有効化されます。[ 21 ]
..FACADE「Facade」は、多くのRTOSで使用されます。
1BADB002「1 bad boot」マルチブートヘッダーのマジックナンバー。[ 22 ]
8BADF00D「まずいものを食べた」は、ウォッチドッグタイムアウトが発生したためにApple iOSアプリケーションが終了したことを示します。[ 23 ]
A5A5A5A5交互のビットパターン (1010 0101) により、オシロスコープロジック アナライザで簡単に認識できるパターンが作成されるため、組み込み開発で使用されます。
A5この値は NULL ポインターまたは ASCII NUL 文字ではないため、/etc/malloc.conf が "-J" にシンボリックリンクされている場合に、 FreeBSDの PHK malloc(3)でデバッグのために使用されます。
ABABABABマイクロソフトのデバッグHeapAlloc()で使用され、割り当てられたヒープメモリの後に「無人地帯」ガードバイトをマークします。[ 24 ]
ABADBABE「A bad babe」 、 Appleが「Boot Zero Block」マジックナンバーとして 使用。
ABBABABEABBAベイブ」、ドライバーによって使用される: Parallel Linesメモリ ヒープ。
ABADCAFE「A bad cafe」、割り当てられていないすべてのメモリを初期化するために使用されます (Mungwall、AmigaOS )。
B16B00B5「Big Boobs」は、以前はMicrosoftHyper-VハイパーバイザーでLinuxゲストの「ゲストID」の上位半分として使用するために必要とされていました。[ 25 ]
BAADF00D「Bad food」は、 MicrosoftのデバッグHeapAlloc()で使用され、初期化されていない割り当てられたヒープメモリをマークします。 [ 24 ]
BAAAAAAD「Baaaaaad」はApple iOSのログがクラッシュレポートではなく、システム全体のスタックショットであることを示します。[ 23 ]
BAD22222「頻繁に再開しすぎる」は、Apple iOS VoIPアプリケーションが頻繁に再開したために終了したことを示します。[ 23 ]
BADBADBADBAD「悪い、悪い、悪い、悪い」バローズの大規模システムの「初期化されていない」メモリ(48 ビット ワード)。
BADC0FFEE0DDF00D「Bad coffee odd food」 、 IBM RS/6000 64 ビット システム で、初期化されていない CPU レジスタを示すために使用されます。
BADDCAFE「Bad cafe」はSun MicrosystemsSolarisでは、初期化されていないカーネル メモリ (KMEM_UNINITIALIZED_PATTERN) をマークします。
BBADBEEF「Bad beef」はWebKitで使用され、特に回復不可能なエラーを指します。[ 26 ]
BEBEBEBEAddressSanitizerによって、割り当てられたが初期化されていないメモリを埋めるために使用されます。[ 27 ]
BEEFCACE「ビーフ ケーキ」は、 Microsoft .NETによってリソース ファイル内のマジック ナンバーとして使用されます。
C00010FF「クールオフ」は、Apple iOSアプリが熱イベントに反応してオペレーティングシステムによって強制終了されたことを示します。[ 23 ]
CAFEBABE「Cafe babe」Javaによってクラス ファイルに使用されます。

マルチアーキテクチャMach-Oバイナリで使用されます。

CAFED00D「Cafe dude」Javaのpack200圧縮に使用されます。
CAFEFEED「カフェ フィード」は、 Sun MicrosystemsSolarisデバッグ カーネルによって使用され、kmemfree() メモリをマークします。
CCCCCCCCマイクロソフトのC++デバッグランタイムライブラリや多くのDOS環境で初期化されていないスタックメモリをマークするために使用されます。x86プロセッサのINT 3デバッグブレークポイント割り込みCCのオペコードです。 [ 28 ]
CDCDCDCDMicrosoftのC/C++デバッグmalloc()関数で、初期化されていないヒープメモリをマークするために使用されます。通常はから返されますHeapAlloc[ 24 ]
0D15EA5E「Zero Disease」は、 GameCubeおよびWiiコンソールで通常の起動を示すフラグとして使用されます。
DDDDDDDDMicroQuillのSmartHeapとMicrosoftのC/C++デバッグのfree()関数で、解放されたヒープメモリをマークするために使用されます。[ 24 ]
DEAD10CC「デッドロック」とは、Apple iOSアプリケーションがバックグラウンドで実行中にシステムリソースを保持していたために終了したことを示します。[ 23 ]
DEADBABE「Dead babe」は、 Silicon GraphicsIRIXアリーナ ファイルの先頭で使用されます。
DEADBEEF「デッドビーフ」は、 RS/6000などのIBMシステムでよく使用され、クラシックなMac OSオペレーティングシステムOPENSTEP EnterpriseCommodore Amigaでも使用されています。Sun MicrosystemsSolarisでは、解放されたカーネルメモリ(KMEM_FREE_PATTERN)をマークします。
DEADCAFE「Dead cafe」は、 Microsoft .NETによってDLL内のエラー番号として使用されます。
DEADC0DE「デッド コード」は、 OpenWRTファームウェアのマーカーとして使用され、静的ファームウェアの最後に作成される jffs2 ファイル システムの開始を示します。
DEADFA11「Dead fail」は、Apple iOSアプリケーションがユーザーによって強制終了されたことを示します。[ 23 ]
DEADF00D「デッドフード」は、コモドールアミガのMungwallが割り当て済みだが初期化されていないメモリをマークするために使用しました。[ 29 ]
DEFEC8ED「Defecated」OpenSolarisコア ダンプに使用されます。
DEADDEAD「Dead Dead」は、ユーザーがカーネルデバッガーまたはMicrosoft Windowsのキーボードから意図的にクラッシュダンプを開始したことを示します。[ 30 ]
D00D2BAD「おい、残念だ」、 Safariで使用されているアプリがmacOS Big Surでクラッシュする。[ 31 ]
D00DF33D「Dudeフィード」は、デバイスツリーによってヘッダーの開始を示すために使用されます。[ 32 ]
EBEBEBEBMicroQuill の SmartHeap から。
FADEDEAD「Fade dead」は、すべてのAppleScriptスクリプトを識別するために最後に表示されます。
FDFDFDFDマイクロソフトのC/C++デバッグmalloc()関数で、割り当てられたヒープメモリの前後に「無人地帯」ガードバイトをマークするために使用され、 [ 24 ]マイクロソフトによって実装されたいくつかのデバッグセキュアCランタイム関数(例:strncat_s)でも使用されます。[ 33 ]
FEE1DEAD「Feel dead」Linux のreboot() システムコールによって使用されます。
FEEDFACE「フィード面」はApple社のMac OSXプラットフォームのMach-Oバイナリで見られます。Sun Microsystems社のSolarisでは、レッドゾーン(KMEM_REDZONE_PATTERN)を示します。

VLCプレーヤーと一部のIPカメラRTP / RTCPプロトコルでこのマジックナンバーを使用します。VLCプレーヤーはシステムのエンディアン順序に従って4バイトを送信します。一部のIPカメラは、プレーヤーからのこのマジックナンバーの送信を期待しており、受信されない場合、ストリームを開始しません。

FEEEFEEE「Fee fee」はMicrosoftのデバッグ用HeapFree()で、解放されたヒープメモリをマークするために使用されます。一部の内部ブックキーピング値にも、上位ワードがFEEEに設定されている場合があります。[ 24 ]

これらのほとんどは 32ビット長で、これはほとんどの 32 ビット アーキテクチャ コンピュータの ワード サイズです。

これらの価値観がマイクロソフトのテクノロジーに広く浸透しているのは偶然ではありません。Microsoft PressSteve Maguire氏の著書『Writing Solid Code』で詳しく解説されています。彼はこれらの価値観について、以下のような様々な基準を挙げています。

  • これらは有用ではないはずです。つまり、これらを処理するアルゴリズムのほとんどは、通常とは異なる動作をすることが想定されます。ゼロのような数はこの基準に当てはまりません。
  • これらは、デバッガー内で無効な値としてプログラマーによって簡単に認識される必要があります。
  • バイトアラインメントを持たないマシンでは、奇数である必要があるため、それらをアドレスとして逆参照すると例外が発生します。
  • コードとして実行されると、例外が発生したり、場合によってはデバッガーが中断される可能性があります。

これらは本質的に空であるメモリ領域をマークするためによく使用されるため、これらの用語の一部は「メモリから消えた、中止された、フラッシュされた」という意味のフレーズで使用されるようになりました。たとえば、「Your program is DEADBEEF」などです。

参照

参考文献

  1. ^ a b c Martin, Robert C. (2009). 「第17章 匂いとヒューリスティック - G25 マジックナンバーを名前付き定数に置き換える」. Clean Code - アジャイルソフトウェアクラフトマンシップハンドブック. ボストン: Prentice Hall. p.  300. ISBN 978-0-13-235088-4
  2. ^ Martin, Robert C. (2009). 「第17章 匂いとヒューリスティックス - G16 隠された意図」. Clean Code - アジャイルソフトウェアクラフトマンシップハンドブック. ボストン: Prentice Hall. p.  295. ISBN 978-0-13-235088-4
  3. ^ Maguire, James (2008年12月9日). 「Bjarne Stroustrupによるソフトウェア開発者の教育について」 . Datamation.com . 2018年6月23日時点のオリジナルよりアーカイブ
  4. ^ Vogel, Jeff (2007年5月29日). 「より分かりやすいコードを書くための6つの方法」 . IBM Developer . 2018年9月26日時点のオリジナルよりアーカイブ
  5. ^ a b c d e f Paul, Matthias R. (2002-04-09). "[fd-dev] CuteMouse 2.0 alpha 1" . freedos-dev . 2022年4月7日時点のオリジナルよりアーカイブ。 2022年8月4日閲覧
  6. ^ 「Odd Comments and Strange Doings in Unix」ベル研究所2002年6月22日. 2006年11月4日時点のオリジナルよりアーカイブ。
  7. ^ Dennis M. Ritchie との個人的なコミュニケーション。
  8. ^ “The Unix Tree V6/usr/sys/ken/sys1.c” . The Unix Heritage Society . 2023年3月26日時点のオリジナルよりアーカイブ。
  9. ^ “The Unix Tree V7/usr/sys/sys/sys1.c” . The Unix Heritage Society . 2023年3月26日時点のオリジナルよりアーカイブ。
  10. ^ 「PNG (Portable Network Graphics) 仕様バージョン 1.0: 12.11. PNG ファイル署名」 . MIT . 1996年10月1日. 2023年3月26日時点のオリジナルよりアーカイブ。
  11. ^ Chen, Raymond (2008年3月24日). 「COM拡張機能とEXE拡張機能の違いは何ですか?」 The Old New Thing . 2019年2月18日時点のオリジナルよりアーカイブ
  12. ^ a b c Paul, Matthias R. (2002-04-03). "[fd-dev] Ctrl+Alt+Del" . freedos-dev . 2017年9月9日時点のオリジナルよりアーカイブ。 2017年9月9日閲覧(注: IBM PC互換BIOS (0000h、1234h)、EMM386 (1234h)などのDOSメモリ マネージャ、およびSMARTDRV (EBABh、BABEh) や NWCACHE (0EDCh、EBABh、6756h) などのディスクキャッシュで使用されるいくつかのマジック値について言及しています。)
  13. ^ 「BIOS/MBRブートプロセス」 . NeoSmart Knowledgebase . 2015年1月25日. 2023年3月26日時点のオリジナルよりアーカイブ2019年2月3日閲覧。
  14. ^ 「TI E2Eコミュニティ:MCP CLIツールで以下の設定ができるかご存知の方はいらっしゃいますか?」 Texas Instruments . 2011年8月27日. 2022年10月7日時点のオリジナルよりアーカイブ。
  15. ^ Newcomer, Joseph M. (2001-10-13). 「メッセージ管理:一意性の保証」 . Developer Fusion . 2005-04-21時点のオリジナルよりアーカイブ。2007-11-16閲覧
  16. ^ Osterman, Larry (2005-07-21). 「UUIDは生成した場合にのみ一意となる…」Larry OstermanのWebLog - Confessions of an Old Fogey . MSDN.オリジナルから2023年3月28日アーカイブ。 2007年11月16日閲覧
  17. ^ 「RFC 9562 - ユニバーサルユニークID(UUID)」 . ietf.org . 2024年5月. 2024年8月9日閲覧
  18. ^ 「Java Plug-in for Internet ExplorerでファミリJREバージョンのJavaアプレットをデプロイする」 Oracle . 2022年11月30日時点のオリジナルよりアーカイブ。 2023年3月28日閲覧
  19. ^ 「GNU GRUBのインストール、セクション3.4:BIOSインストール」。Gnu.org 。 2023年3月15時点のオリジナルよりアーカイブ。 2014年6月26日閲覧
  20. ^ Heddings, Lowell (2014年11月3日). 「マジックナンバー:プログラマーがあなたのPCに隠す秘密コード」 How -To Geek . 2023年3月26日時点のオリジナルよりアーカイブ。 2017年10月3日閲覧
  21. ^ Cavit, Doug (2012-04-24). 「古いオブジェクト参照の再利用を防ぐ」 . Microsoft Secure . 2018年7月26日時点のオリジナルよりアーカイブ。 2018年7月26日閲覧
  22. ^ Boleyn, Erich Stefan (1995年4月4日). 「『マルチブート標準』提案に関するコメント」 . Uruk.org . 2023年3月26日時点のオリジナルよりアーカイブ。
  23. ^ a b c d e f「テクニカルノート TN2151: アプリケーションクラッシュレポートの理解と分析」。Apple Developer Documentation。2009年1月29日。 2018年12月13日時点のオリジナルよりアーカイブ。
  24. ^ a b c d e f Birkett, Andrew. 「Win32 デバッグ CRT ヒープ内部」 . Nobugs.org .
  25. ^ McNamara, Paul (2012年7月19日). 「Microsoftのコードには『巨乳』というフレーズが含まれている…本当だ」 . Network World .
  26. ^ WebKit、WebKitオープンソースプロジェクト、2023年1月6日、 2023年1月6日取得
  27. ^ 「AddressSanitizer - FAQ」 . GitHub . 2022年5月18日閲覧
  28. ^ 「INTEL 80386 プログラマーズ・リファレンス・マニュアルMIT
  29. ^ Scheppner, Carolyn. 「Amiga Mail Vol.2 ガイド」 . Cataclysm.cx . 2011年7月18日時点のオリジナルよりアーカイブ。 2010年8月20日閲覧
  30. ^ 「バグチェック0xDEADDEAD MANUALLY_INITIATED_CRASH1」。Microsoftドキュメント。2023年6月19日。
  31. ^ 「Safari バージョン 14.0.1 が予期せず終了する」
  32. ^ 「デバイスツリー仕様」
  33. ^ "strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l" . Microsoftドキュメント. 2019年1月16日閲覧。