コンピュータプログラミングにおいて、マジックナンバーとは次のいずれかを指します。
- 説明されていない意味を持つ一意の値、または複数回出現し、(できれば)名前付き定数に置き換えることができる値
- ファイル形式またはプロトコルを識別するために使用される定数数値またはテキスト値を参照してください)
- 他の意味と間違われる可能性が低い、特徴的な一意の値(例:グローバル一意識別子)
名前のない数値定数
マジックナンバーまたはマジック定数という用語は、ソースコードで直接数字を使用するアンチパターンを指します。これは、1960年代のCOBOL、FORTRAN、PL/1のマニュアルにまで遡る、プログラミングの最も古いルールの1つに違反していると言われています。 [1]コードで名前のないマジックナンバーを使用すると、開発者がその数字を選択した意図がわかりにくくなり、[2]微妙なエラーが発生する可能性が高まり(例:3.14159265358979323846のすべての桁が正しく、3.14159に丸めることができるか?[3])、将来的にプログラムを適応および拡張することが難しくなります。[4]すべての重要なマジックナンバーを名前付き定数(説明変数とも呼ばれる)に置き換えると、プログラムが読みやすく、理解しやすく、保守しやすくなります。[5]
プログラムの文脈で意味のある名前を選択すると、元の作者ではないメンテナー(または一定期間後に元の作者であっても)が理解しやすいコードになります。[6]情報に乏しい名前の定数の例としては がありますint SIXTEEN = 16が、 はint NUMBER_OF_BITS = 16より説明的です。
上で説明したマジックナンバーに関連する問題は数値型に限定されず、この用語は名前付き定数を宣言する方が柔軟性と伝達性が高くなる他のデータ型にも適用されます。[1]したがって、テストスイートでconst string testUserName = "John"「マジック値」を複数回出現させるよりも宣言する方が優れています。
"John"
たとえば、標準的なトランプのパックを表す配列内の値をランダムにシャッフルする必要がある場合、次の疑似コードは、 Fisher-Yates シャッフルアルゴリズムを使用してその作業を実行します。
iは1から52まで
j := i + ランダム整数(53 - i) - 1
a.swapEntries(i, j)
が配列オブジェクトである場合a、関数は1 からxrandomInt(x)まで (両端を含む)のランダムな整数を選択し、配列内のi番目とj番目のエントリを交換します。前の例では、と はマジックナンバーであり、互いに明確に関連していません。次のように記述する方が、より良いプログラミングスタイルであると考えられています。
swapEntries(i, j)5253
int deckSize:= 52、
iは1からdeckSizeまで
j := i + randomInt(デッキサイズ + 1 - i) - 1
a.swapEntries(i, j)
これはいくつかの理由から望ましいです:
- 読みやすく、理解しやすい。最初の例を読んだプログラマーは、「ここでの数字52は何を意味するのか?なぜ52なのか?」と疑問に思うかもしれない。プログラマーはコードを注意深く読んだ後、意味を推測できるかもしれないが、それは明白ではない。[6]マジックナンバーは、同じ数字がコードの1つのセクションで異なる目的で使用されている場合に特に混乱を招きます。
- 数字の値は重複しないので、変更が容易です。マジックナンバーの値を変更すると、同じ値がプログラム内の異なる場所で何度も使用されることが多いため、エラーが発生しやすくなります。[6]また、意味的に異なる 2 つの変数または数値が同じ値を持つ場合、誤って両方が一緒に編集される可能性があります。[6]最初の例を変更して、 78 枚のカードがあるタロットデッキをシャッフルする場合、プログラマーはプログラム内のすべての 52 を単純に 78 に置き換える可能性があります。これにより、2 つの問題が発生します。まず、例の 2 行目の値 53 が失われ、アルゴリズムが微妙な方法で失敗する可能性があります。次に、デッキのサイズを参照しているか、グレゴリオ暦の週数などまったく別の何かを参照しているかに関係なく、文字 "52" がどこでも置き換えられる可能性があり、さらに巧妙に "1523" などの数字の一部である可能性があり、これらはすべてバグを引き起こします。対照的に、
deckSize2 番目の例の変数の値を変更するのは、単純な 1 行の変更になります。 - それはドキュメント化を促進し、容易にします。[6]名前付き変数が宣言される単一の場所は、その値が何を意味するのか、そしてなぜその値を持つのかをドキュメント化するのに適した場所です。多数の場所で同じ値を持つと、コメントが重複する(および一部を更新して一部が欠落しているという付随的な問題が発生する)か、作成者が値を説明するのが自然で、読者が説明を探す可能性が高い場所が1つもなくなります。
- 「マジックナンバー」変数の宣言は、通常関数またはファイルの先頭にまとめて配置され、確認と変更が容易になります。[6]
- これはタイプミスの検出に役立ちます。リテラルの代わりに変数を使用すると、コンパイラのチェックを活用できます。誤って「52」の代わりに「62」と入力しても検出されませんが、
dekSize「」の代わりに「」と入力すると、宣言されていないdeckSizeというコンパイラの警告が表示されますdekSize。 - 一部のIDEでは、入力の手間が省けます。IDE がコード補完をサポートしている場合は、変数名の最初の数文字からほとんどの部分が入力されます。
- パラメータ化が容易になります。たとえば、上記の例を、任意の数のカードのデッキをシャッフルする手順に一般化するには、 を
deckSizeその手順のパラメータにするだけで十分ですが、最初の例ではいくつかの変更が必要になります。
関数shuffle ( int deckSize)
はiを1からdeckSizeまで変化させます。
j := i + randomInt(デッキサイズ + 1 - i) - 1
a.swapEntries(i, j)
デメリットは次のとおりです。
- 名前付き定数が使用場所の近くで定義されていない場合、コードの局所性が損なわれ、したがってコードの理解しやすさも損なわれます。52 をおそらく離れた場所に置くということは、"for" ループの動作を完全に理解するために (たとえば、ループの実行時間を見積もるために)、定義を追跡して、それが期待される数値であることを確認する必要があることを意味します。定数がコードの一部でのみ使用されている場合、これは簡単に回避できます (宣言を再配置することによって)。一方、名前付き定数がさまざまな部分で使用されている場合、離れた場所にあることは、同じ値がコードの他の場所に出現することを示す手がかりとなり、これも調べる価値がある場合があります。
- コードが冗長になる場合があります。定数の宣言によって 1 行が追加されます。定数の名前が値よりも長い場合、特にそのような定数が 1 行に複数ある場合は、コードの 1 つの論理ステートメントを複数の行に分割する必要がある可能性があります。定数について混乱が生じる可能性がある場合、または他のカード ゲームのシャッフル ルーチンを再利用するなど、定数を変更する必要がある可能性がある場合は、冗長性の増加が正当化される場合があります。表現力の向上として正当化される場合もあります。
deckSize + 1実行時に式を処理する方が値「53」よりも遅くなる可能性がありますが、ほとんどの最新のコンパイラとインタープリタはdeckSize、が定数として宣言されていることに気づき、コンパイルされたコードで値 53 を事前に計算します。それがオプションでない場合でも、ループの最適化により、加算がループの前に実行されるように移動されます。したがって、コードでマジックナンバーを使用する場合と比較して、通常は速度の低下はありません (または無視できる程度です)。特に、デバッグのコストと説明のないコードを理解するために必要な時間は、わずかな計算コストと比較する必要があります。
承認された用途
いくつかの状況では、名前のない数値定数の使用は一般的に受け入れられています (そして「魔法ではない」とも言えます)。このような受け入れは主観的であり、多くの場合、個々のコーディング習慣に依存しますが、一般的な例を以下に示します。
- forループで0と1を初期値または増分値として使用する。例:
for (int i = 0; i < max; i += 1) - 2を使用して数が偶数か奇数かを調べる。 は剰余演算子である
isEven = (x % 2 == 0)。% - 単純な算術定数の使用、例えば、のような式での使用
circumference = 2 * Math.PI * radius、[1]または二次方程式の判別式の計算での使用d = b^2 − 4*a*c - 10の累乗を使用してメートル法の値を変換する(例:グラムとキログラムの間)か、パーセンテージとパーミルの値を計算する
(f(x) ** 2 + f(y) ** 2) ** 0.5などの式の指数
定数 1 と 0 は、古いバージョンのCなど、ブール型を持たないプログラミング言語で、ブール値 true と false を表すために使用されることがあります。最近のプログラミング言語のほとんどはまたはプリミティブ型を提供しているため、0 と 1 の使用はお勧めできません。0 はプログラム上の成功 (-1 は失敗を意味する) を意味することもあれば、失敗 (1 は成功を意味する) を意味することもあるため、混乱を招く可能性があります。
booleanbool
C および C++ では、0 はヌル ポインターを表します。ブール値と同様に、C 標準ライブラリにはNULL使用が推奨されるマクロ定義が含まれています。他の言語では特定のnullornil値が提供されており、その場合は代替手段を使用しないでください。型付きポインター定数はnullptrC++11 で導入されました。
フォーマットインジケーター
起源
フォーマットインジケータは、初期のバージョン 7 Unixソースコードで初めて使用されました。[引用が必要]
Unixは、メモリ保護のない初期のDEC PDP-11 /20に移植されました。そのため、初期のUnixバージョンでは、再配置可能メモリ参照モデルが使用されていました。[7]第6版より前のUnixバージョンでは、実行可能ファイルをメモリに読み込み、プログラムの最初の低位メモリアドレス(相対アドレス0)にジャンプしました。ページングバージョンのUnixの開発により、実行可能イメージコンポーネントを記述するヘッダーが作成されました。また、ヘッダーの最初のワードとして分岐命令が挿入され、ヘッダーをスキップしてプログラムが起動されました。このようにして、プログラムは、古い再配置可能メモリ参照(通常)モードまたはページングモードで実行できました。より多くの実行可能形式が開発されるにつれて、分岐オフセットを増分することによって新しい定数が追加されました。[8]
Unix プログラム ローダーの第 6 版の ソース コードでは、exec() 関数がファイル システムから実行可能 (バイナリ) イメージを読み取ります。ファイルの最初の 8バイトは、プログラム (テキスト) と初期化された (グローバル) データ領域のサイズを含むヘッダーです。また、ヘッダーの最初の 16 ビット ワードは 2 つの定数と比較され、実行可能イメージに再配置可能なメモリ参照(通常)、新しく実装されたページ化された読み取り専用の実行可能イメージ、または分離された命令とデータのページ化されたイメージが含まれているかどうかが判断されます。[9]ヘッダー定数の 2 つの役割については言及されていませんでしたが、定数の上位バイトは、実際にはPDP-11 分岐命令の操作コード( 8 進数000407 または16 進数0107) でした。プログラム カウンターに 7 を追加すると、この定数が実行されると、Unix exec() サービスが実行可能イメージの 8 バイト ヘッダーに分岐し、プログラムが起動することが示されました。
Unix の第 6 版および第 7 版ではページング コードが採用されていたため、ヘッダー定数の 2 つの役割は隠されていました。つまり、 exec() サービスは実行可能ファイルのヘッダー (メタ) データをカーネル空間バッファーに読み込みますが、実行可能イメージはユーザー空間に読み込むため、定数の分岐機能は使用されません。マジック ナンバーの作成は Unixリンカーとローダーに実装されており、マジック ナンバーの分岐は、第 6 版および第 7 版に付属していたスタンドアロン 診断プログラムのスイートでまだ使用されていた可能性があります。したがって、ヘッダー定数は錯覚を引き起こし、マジックの基準を満たしていました。
バージョン7のUnixでは、ヘッダー定数は直接テストされず、ux_mag [10]という変数に割り当てられ、その後マジックナンバーと呼ばれるようになりました。おそらくその独自性のため、マジックナンバーという用語は実行可能フォーマットタイプを意味するようになり、次にファイルシステムタイプを意味するように拡張され、さらに任意のタイプのファイルを意味するように拡張されました。
ファイル内
マジック ナンバーは、多くのオペレーティング システムのプログラムでよく使用されます。マジック ナンバーは、厳密に型指定されたデータを実装し、プログラム実行時にデータ型を読み取る制御プログラムへのインバンド シグナリングの形式です。多くのファイルには、含まれているデータを識別するこのような定数があります。ファイル内のこのような定数を検出することは、多くのファイル形式を区別するシンプルで効果的な方法であり、実行時の詳細情報を得ることができます。
- 例
- コンパイルされた Java クラス ファイル(バイトコード) とMach-Oバイナリは 16 進数 で始まります。Pack200
CAFEBABEで圧縮すると、バイトは に変更されます。CAFED00D - GIF画像ファイルのASCIIコードは「GIF89a」(
474946383961)または「GIF87a」(474946383761)です。 - JPEG画像ファイルは で始まり
FFD8で終わりますFFD9。JPEG/ JFIFファイルには、ヌルで終了する文字列「JFIF」(4A46494600) が含まれます。JPEG/ Exifファイルには、ヌルで終了する文字列「Exif」( )が含まれ、その後にファイルに関する4578696600追加のメタデータが続きます。 - PNG画像ファイルは、ファイルがPNGファイルであることを識別し、一般的なファイル転送の問題を検出できる8バイトの
89504E470D0A1A0A署名で始まります: "\211PNG\r\n\032\n" ( )。この署名にはさまざまな改行文字が含まれており、 FTPを使用してバイナリモードではなくASCII 転送モードでファイルを転送するなど、不当な自動改行変換を検出できます。[11] - 標準MIDIオーディオ ファイルには、「 MThd」( M IDI Tラックヘッダー)のASCIIコードがあり、その後にさらにメタデータが続きます。
4D546864 - UnixまたはLinuxスクリプトは、スクリプトが呼び出されたインタープリタと異なる可能性がある場合、シェバン("#!" )で始まり、その後にインタープリタ
2321へのパスが続くことがあります。 - ELF実行ファイルは、バイトで始まり
7F、その後に「ELF」(7F454C46) が続きます。 - PostScriptファイルとプログラムは「%!」 (
2521) で始まります。 - PDFファイルは「%PDF」(16 進数
25504446) で始まります。 - DOS MZ実行ファイルとMicrosoft Windows PE (Portable Executable)ファイルのEXEスタブは、ファイル形式の設計者であるMark Zbikowskiの頭文字である「MZ」()という文字で始まります。定義では、非PE EXEであるdosZMXPには珍しい「ZM」()も許可されています。 [12]
4D5A5A4D - Berkeley Fast File Systemスーパーブロック形式は、バージョンに応じて
19540119またはとして識別されます011954。どちらも、作成者であるMarshall Kirk McKusickの誕生日を表しています。 - ほぼすべてのIA-32 IBM PC 互換機上の起動可能なストレージ デバイスのマスター ブート レコードには、最後の 2 バイトとしてというコードがあります。
55AA - Game BoyおよびGame Boy Advance携帯型ビデオ ゲーム システムの実行ファイルには、ヘッダーの固定位置にそれぞれ 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コードが含まれています。
4A6F7921 - TIFFファイルは、「II」または「MM」で始まり、その後にリトル エンディアンまたはビッグエンディアンバイト順序の 2 バイト整数42が続きます。「II」は、リトル エンディアンバイト順序を使用する Intel 用なので、マジック ナンバーは です。「MM」は、ビッグ エンディアンバイト順序を使用する Motorola 用なので、マジック ナンバーは です。
49492A004D4D002A - UTF-16でエンコードされたUnicodeテキスト ファイルは、多くの場合、エンディアン(ビッグ エンディアンの場合は 、リトルエンディアンの場合は )を検出するためにバイト オーダー マークで始まります。また、Microsoft Windowsでは、UTF-8テキスト ファイルは、多くの場合、同じ文字の UTF-8 エンコードで始まります。
FEFFFFFEEFBBBF - LLVMビットコード ファイルは「BC」(
4243) で始まります。 - WADファイルは、「IWAD」または「PWAD」( Doomの場合)、「WAD2」( Quakeの場合)、「WAD3」( Half-Lifeの場合) で始まります。
- Microsoft Compound File Binary Format (主にMicrosoft Officeドキュメントの古い形式の 1 つとして知られています) ファイルは で始まり
D0CF11E0、視覚的には「DOCFILE0」という単語を連想させます。 - ZIPファイルのヘッダーは、テキスト エディターでは「PK♥♦」( ) と表示されることがよくあります。ここで、「PK」はDOS圧縮ユーティリティPKZIPの作者であるPhil Katz
504B0304のイニシャルです。 - 7zファイルのヘッダーは「7z」(完全なマジックナンバー:
377ABCAF271C) で始まります。
- 検出
Unix ユーティリティ プログラムは、fileファイルからマジック ナンバーを読み取って解釈することができ、情報を解析するために使用されるファイルはmagicと呼ばれます。Windows ユーティリティ TrID も同様の目的を持っています。
プロトコルでは
- 例
- AIM / ICQで使用されるOSCAR プロトコルでは、要求の前に が付けられます。
2A - VNCで使用されるRFB プロトコルでは、クライアントは「RFB」(「Remote Frame Buffer」の略)に続いてクライアントのプロトコル バージョン番号を送信することで、サーバーとの会話を開始します。
524642 - Microsoft Windows で使用されるSMBプロトコルでは、各 SMB 要求またはサーバー応答は '
FF534D42' で始まり、"\xFFSMB"SMB 要求の先頭で始まります。 - Microsoft Windows で使用されるMSRPCプロトコルでは、各 TCP ベースの要求は、
05要求の開始時に (Microsoft DCE/RPC バージョン 5 を表す)で始まり、その直後にマイナー バージョンを表す00またはが続きます01。UDP ベースの MSRPC 要求では、最初のバイトは常に です04。 - COMおよびDCOMマーシャリング インターフェイス( OBJREFと呼ばれる)では、常にバイト シーケンス "MEOW" (
4D454F57) で始まります。デバッグ拡張機能 (DCOM チャネル フックに使用される) の前には、バイト シーケンス "MARB" ( ) が付きます4D415242。 - 暗号化されていないBitTorrent トラッカー要求は、ヘッダーの長さを表す値を含む 1 バイトで始まり
19、その直後にバイト位置 1 に「BitTorrent プロトコル」というフレーズが続きます。 - eDonkey2000 / eMuleトラフィックは、クライアント バージョンを表す 1 バイトで始まります。現在は
E3eDonkey クライアントを表し、C5eMule を表し、D4圧縮された eMule を表します。 - Bitcoinブロックチェーンのブロックの最初の 4 バイトには、ネットワーク識別子として機能するマジック ナンバーが含まれています。値は定数で
0xD9B4BEF9、メイン ネットワークを示し、定数は0xDAB5BFFAテストネットを示します。 - SSLトランザクションは常に「クライアント ハロー」メッセージで始まります。すべての SSL パケットのプレフィックスとして使用されるレコード カプセル化スキームは、2 バイトと 3 バイトのヘッダー形式で構成されます。通常、SSL バージョン 2 のクライアント ハロー メッセージには がプレフィックスとして付き
80、クライアント ハローに対する SSLv3 サーバーの応答は で始まります16(ただし、これは異なる場合があります)。 - DHCP
0x630x820x530x63パケットは、パケットのオプション セクションの先頭で「マジック クッキー」値 ' ' を使用します。この値は、すべての DHCP パケット タイプに含まれています。 - HTTP/2接続は、プレファレンス '
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a' または "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" で開かれます。プレファレンスは、HTTP の以前のバージョンをサポートしているが 2.0 をサポートしていないサーバーや仲介者によるフレームの処理を回避するように設計されています。
インターフェースでは
マジックナンバーは、 DOS、Windows、NetWareなど、多くのオペレーティング システムのAPI 関数およびインターフェイスでよく使用されます。
- 例
- IBM PC互換のBIOSはマジック値を使用して
0000、1234再起動時にシステムがメモリをカウントアップするかどうかを決定し、コールドブートまたはウォームブートを実行します。これらの値は、ブート要求を傍受するEMM386メモリマネージャによっても使用されます。 [13]55 AABIOSは、ディスクがブート可能かどうかを判断するためにもマジック値を使用します。 [14] - MS -DOSディスクキャッシュSMARTDRV(コードネーム「Bambi」)は、API関数でマジック値BABEとEBABを使用します。[13]
- 英国の旧欧州開発センターで開発された多くのDR DOS、Novell DOS、OpenDOSドライバは、NWCACHEがその一例である(エミュレートされた)標準DOS関数の上に追加の機能を呼び出したり提供したりするときに、値0EDCをマジックトークンとして使用します。[13]
その他の用途
- 例
データ型の制限
以下はデータ保存タイプの制限の一覧です: [16]
GUID
グローバル一意識別子(GUID)を覚えやすいように作成または変更することは可能ですが、ほぼ一意の識別子としての強度が損なわれるため、これは強く推奨されません。 [17] [18] GUIDとUUIDを生成するための仕様は非常に複雑であり、適切に実装されれば、それらは事実上一意になります。[19]
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。[20]
GPTパーティションスキームのGUIDパーティションテーブルでは、 BIOSブートパーティションはGUID定義に従わない特別なGUID { 21686148-6449-6E6F-744E-656564454649} [21]を使用します。代わりに、文字列 " " のASCIIコードを部分的にリトルエンディアンHah!IdontNeedEFI順序で使用して形成されます。[22]
デバッグ値
マジック デバッグ値は、メモリの割り当てまたは割り当て解除中にメモリに書き込まれる特定の値です。これにより、後で値が破損しているかどうかを確認したり、初期化されていないメモリから取得された値が使用されていることを明らかにしたりできます。メモリは通常 16 進数で表示されるため、覚えやすい繰り返し値や16 進数で表現された値が一般的です。数値的に奇数値が好まれる場合があります。そうすると、バイト アドレス指定のないプロセッサがポインタ (偶数アドレスになければならない) として使用しようとしたときにエラーが発生します。値は、可能性のあるアドレス (プログラム コード、静的データ、ヒープ データ、またはスタック) から離れた場所から選択する必要があります。同様に、特定のアーキテクチャの命令セットで有効なコードではない値を選択することもできます。
32 ビット整数がこの特定の値を取る可能性は非常に低いですが、デバッガーまたはメモリ ダンプにこのような数値が表示される場合は、バッファー オーバーフローや初期化されていない変数などのエラーが発生している可能性が高くなります。
有名で一般的な例としては、次のようなものがあります。
これらのほとんどは 32ビット長で、これはほとんどの 32 ビット アーキテクチャ コンピューターの ワード サイズです。
Microsoft テクノロジでこれらの価値が広く普及しているのは偶然ではありません。これらの価値については、 Microsoft PressのSteve Maguire氏の著書『Writing Solid Code』で詳しく説明されています。同氏は、これらの価値について次のようなさまざまな基準を挙げています。
- これらは役に立つべきではありません。つまり、これらを操作するほとんどのアルゴリズムは、通常とは異なる動作をすることが予想されます。ゼロのような数字はこの基準に適合しません。
- これらは、デバッガー内で無効な値としてプログラマーによって簡単に認識される必要があります。
- バイトアラインメントを持たないマシンでは、それらを奇数にする必要があります。そうしないと、それらをアドレスとして逆参照すると例外が発生します。
- コードとして実行されると、例外が発生したり、場合によってはデバッガーが中断されることもあります。
これらは、本質的に空であるメモリ領域をマークするためによく使用されるため、これらの用語の一部は、「メモリから消えた、中止された、フラッシュされた」という意味のフレーズで使用されるようになりました。たとえば、「あなたのプログラムは DEADBEEF です」などです。[引用が必要]
参照
- 魔法の糸
- ファイル形式 § マジックナンバー
- ファイル署名のリスト
- フォーCC
- ハードコーディング
- マジック(プログラミング)
- NaN (非数)
- 列挙型
- Hexspeak、別の魔法の値のリスト
- 暗号アルゴリズムにおける魔法の定数について、私の秘密の数字は何も明かさない
- 時間のフォーマットと保存のバグ、マジックによって引き起こされる問題
- センチネル値(別名フラグ値、トリップ値、不正値、信号値、ダミーデータ)
- カナリア値、バッファオーバーフローを検出するための特別な値
- XYZZY(魔法の言葉)
- 高速逆平方根、定数0x5F3759DFを使用するアルゴリズム
参考文献
- ^ abc Martin, Robert C. (2009). 「第 17 章: 匂いとヒューリスティック - G25 マジックナンバーを名前付き定数に置き換える」。Clean Code - アジャイルソフトウェアクラフトマンシップのハンドブック。ボストン: Prentice Hall。p. 300。ISBN 978-0-13-235088-4。
- ^ Martin, Robert C. (2009)。「第 17 章: 匂いとヒューリスティック - G16 隠された意図」。クリーン コード - アジャイル ソフトウェア クラフトマンシップのハンドブック。ボストン: Prentice Hall。p. 295。ISBN 978-0-13-235088-4。
- ^ Contieri, Maxi (2020-10-20). 「コードスメル 02 - 定数とマジックナンバー」Maximiliano Contieri - ソフトウェア設計. 2024-03-21閲覧。
- ^ Maguire, James (2008-12-09). 「Bjarne Stroustrup によるソフトウェア開発者の教育について」Datamation.com . 2018-06-23 時点のオリジナルよりアーカイブ。
- ^ Vogel, Jeff (2007-05-29). 「よりわかりやすいコードを書くための 6 つの方法」IBM Developer。2018 年 9 月 26 日時点のオリジナルよりアーカイブ。
- ^ abcdef Paul, Matthias R. (2002-04-09). "[fd-dev] CuteMouse 2.0 alpha 1". freedos-dev . 2022-04-07時点のオリジナルよりアーカイブ。2022-08-04閲覧。
- ^ 「Odd Comments and Strange Doings in Unix」。ベル研究所。2002-06-22。2006-11-04 のオリジナルからアーカイブ。
- ^ Dennis M. Ritchie との個人的なコミュニケーション。
- ^ “The Unix Tree V6/usr/sys/ken/sys1.c”. The Unix Heritage Society . 2023年3月26日時点のオリジナルよりアーカイブ。
- ^ “The Unix Tree V7/usr/sys/sys/sys1.c”. The Unix Heritage Society . 2023年3月26日時点のオリジナルよりアーカイブ。
- ^ 「PNG (Portable Network Graphics) 仕様バージョン 1.0: 12.11. PNG ファイル署名」。MIT。1996年10 月 1 日。2023 年 3 月 26 日時点のオリジナルよりアーカイブ。
- ^ Chen, Raymond (2008-03-24). 「COM 拡張機能と EXE 拡張機能の違いは何ですか?」The Old New Thing。2019-02-18 にオリジナルからアーカイブ。
- ^ abc Paul, Matthias R. (2002-04-03). "[fd-dev] Ctrl+Alt+Del". freedos-dev . 2017-09-09にオリジナルからアーカイブ。 2017-09-09に取得。(注: IBM PC互換BIOS (0000h、1234h)、EMM386 (1234h)などのDOSメモリ マネージャ、およびSMARTDRV (EBABh、BABEh) や NWCACHE (0EDCh、EBABh、6756h) などのディスク キャッシュで使用されるいくつかのマジック値について言及しています。)
- ^ 「BIOS/MBR ブート プロセス」。NeoSmart ナレッジベース。2015 年 1 月 25 日。2023 年 3 月 26 日にオリジナルからアーカイブ。2019年 2 月 3 日に取得。
- ^ 「TI E2E コミュニティ: MCP CLI ツールで次の構成を実行できるかどうか知っている人はいますか?」。Texas Instruments。2011年 8 月 27 日。2022 年 10 月 7 日時点のオリジナルよりアーカイブ。
- ^ Poley, Josh (2009-09-30). 「マジックナンバー: 整数」. Learn . Microsoft . 2023-03-28時点のオリジナルよりアーカイブ。
- ^ Newcomer, Joseph M. (2001-10-13). 「メッセージ管理: 一意性の保証」. Developer Fusion . 2005-04-21 にオリジナルからアーカイブ。2007-11-16に取得。
- ^ Osterman, Larry (2005-07-21). 「UUID は生成した場合にのみ一意になります...」Larry Osterman の WebLog - Confessions of an Old Fogey。 MSDN。 2023-03-28 にオリジナルからアーカイブ。2007-11-16に取得。
- ^ 「RFC 9562 - ユニバーサルユニーク識別子 (UUID)」。ietf.org 2024年5月。 2024年8月9日閲覧。
- ^ 「 Java Plug-in for Internet Explorer でのファミリ JRE バージョンを使用した Java アプレットのデプロイ」。Oracle。2022年 11 月 30 日時点のオリジナルよりアーカイブ。2023年 3 月 28 日閲覧。
- ^ 「GNU GRUB インストール、セクション 3.4: BIOS インストール」。Gnu.org。2023年3 月 15 日時点のオリジナルよりアーカイブ。2014 年 6 月 26 日閲覧。
- ^ Heddings, Lowell (2014-11-03). 「マジックナンバー:プログラマーがあなたのPCに隠す秘密のコード」How-To Geek。2023年3月26日時点のオリジナルよりアーカイブ。2017年10月3日閲覧。
- ^ Cavit, Doug (2012-04-24). 「古いオブジェクト参照の再利用に対する保護」。Microsoft Secure。2018-07-26のオリジナルからアーカイブ。2018-07-26に取得。
- ^ Boleyn, Erich Stefan (1995-04-04). 「「MultiBoot Standard」提案に関するコメント」. Uruk.org . 2023-03-26時点のオリジナルよりアーカイブ。
- ^ abcdef 「テクニカルノート TN2151: アプリケーションクラッシュレポートの理解と分析」。Apple Developer Documentation。2009-01-29。2018-12-13にオリジナルからアーカイブ。
- ^ abcdef Birkett、Andrew。「Win32 デバッグ CRT ヒープ内部」。Nobugs.org。
- ^ McNamara, Paul (2012-07-19). 「Microsoft コードには「巨乳」というフレーズが含まれています... はい、本当です」。Network World。
- ^ WebKit、WebKit オープンソース プロジェクト、2023-01-06、2023-01-06取得
- ^ 「AddressSanitizer - FAQ」。GitHub 。 2022年5月18日閲覧。
- ^ 「INTEL 80386 プログラマーズリファレンスマニュアル」. MIT .
- ^ Scheppner, Carolyn. 「Amiga Mail Vol.2 ガイド」。Cataclysm.cx。2011年 7 月 18 日時点のオリジナルよりアーカイブ。2010 年 8 月 20 日閲覧。
- ^ 「バグ チェック 0xDEADDEAD MANUALLY_INITIATED_CRASH1」。Microsoftドキュメント。2023 年 6 月 19 日。
- ^ 「Safari バージョン 14.0.1 が予期せず終了する」。
- ^ 「デバイスツリー仕様」。
- ^ "strncat_s、_strncat_s_l、wcsncat_s、_wcsncat_s_l、_mbsncat_s、_mbsncat_s_l". Microsoft ドキュメント。2019年 1 月 16 日閲覧。
