なぜ x86 の未定義命令が「ud2」と呼ばれるのか。なぜ「2」なのか。

2026/09/13 21:30

なぜ x86 の未定義命令が「ud2」と呼ばれるのか。なぜ「2」なのか。

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

インテルは、ソフトウェア開発における長年にわたる不安定さを解消するため、信頼性の高いアーキテクチャ定義外のメソッドとして

ud2
命令を導入しました。以前、x86 アーキテクチャには公認の未定義命令が存在しなかったため、開発者は到達不可能なコードを示すために
0F FF
(
ud0
) や
0F B9
(
ud1
) などのバイトシーケンスに依存していました。しかし、インテルは後に
0F FF
の動作を変更し、例外を発生させる代わりにランダムな操作を実行するようになりました。この変化はヒラムの法則(未文書化された挙動が実装の詳細が無警告で変更される際に壊れる)の例証です。また、古いシーケンスは命令の実行が例外によって中断される前に一部だけデコードされていたため、メモリのページ境界でアクセス違反を引き起こすことができましたが、パラメータ付きでない(2 バイトの命令であり、パラメータを持たない)
ud2
は使用されないデコードされたレジスタをなくすことでこれらの問題を完全に回避します。ベテランの開発者であるレイモンドは「The Old New Thing」において、
ud2
の導入は開発者が危険な工作回法を放棄し、予見可能な非対応命令例外によってアプリケーションが失敗するのではなく、偶発的なコードの実行やメモリエラーによるクラッシュを防ぐ一貫性のある堅牢なソリューションを採用することを迫ると述べています。

本文

x86 アーキテクチャの
ud2
命令:なぜ「無効なオペコード」例外に特化したか

コンパイラが生成するコードや、意図せず API データを誤って操作してクラッシュを引き起こすソフトウェアを検討する際、

ud2
という命令に出会うことがあります。この命令とはどのようなものでしょうか。

ud2
の役割と目的

  • 未定義な命令: x86 アーキテクチャ上で正式に未定義であり、必ず**「無効なオペコード」例外**を引き起こします。
  • 到達不可能なコードのマーカー: コンパイラは未使用のコード領域に
    ud2
    を挿入し、「ここには決して到達しない」とマークするために使用します。
    • もし何らかの原因でその領域に制御が飛ぶ場合、ランダムな命令実行(ダンプや不測の挙動)ではなく、意図的にクラッシュさせます。
  • :
    [[noreturn]]
    でマークされた関数が誤ってリターンした際、コンパイラは直後に
    ud2
    を挿入します。これによりプログラムが次の関数へ制御を渡すのではなく、即座にクラッシュします。

「ud2」という名前の由来と歴史的背景

初期の状況:未定義命令の欠如

  • 当初、x86 アーキテクチャにはアーキテクチャ上で明確に未定義の命令は存在しませんでした。
  • そのため、「無効なオペコード」例外を確実に引き起こすバイトシーケンスを探す動きがありました。

2 つの候補と争い

  • 0F FF
    : このシーケンスを実行すると「無効なオペコード」例外が発生することが発見されました。
    • デコーダ側では 2 つのパラメータ(レジスタ宛先・ソース)を持つ命令として解釈されましたが、実際には使用されず、例外発生前の処理はありませんでした。
  • 0F B9
    : こちらも同様の特性を持つことが発見されました。
  • 派閥の形成: 「0F FF」信奉者と「0F B9」信奉者が形成されましたが、互いの手法はどちらも機能しており争う必要はありませんでした。

ヒュラムの法則による問題発覚

  • インテルが次世代プロセッサを開発する過程で、
    0F FF
    無効なオペコード例外を引き起こさなくなる可能性や、ランダムに動作したり新しい命令として扱われたりするリスクが発見されました。
    • これにより、依存していたプログラムが動作停止する事例が発生しました。
  • ヒュラムの法則: 「十分な数のユーザーが存在すれば、すべての観測可能な振る舞いに対して、何らかの人が依存している」。
  • 同じく
    0F B9
    についても同様の問題が発覚しました。

公式な解決策:
ud2
の誕生

  • 信頼できる方法で「無効なオペコード」例外を誘発したいという要望が明確になったため、インテルはこれらを正式に承認しました。
  • ud2
    という名前の命令を永続的に無効として定義し、サポートするようになりました。

命名の理由

後付けでの命名ルールに基づいています:

  1. 0F FF
    版 →
    ud0
  2. 0F B9
    版 →
    ud1
  3. 残りの未定義オペコード →
    ud2

ud2
の技術的な利点

  • パラメータ不要:
    ud2
    はパラメータを持たない2 バイトの命令です。
    • したがって、ランダムなソースアドレスや宛先アドレスをデコードして使用する必要がありません。
  • 一貫性の保証:
    • デコード領域が非存在ページにまたがる場合、
      ud0
      ud1
      のようにアクセス違反(Segmentation Fault)が発生するリスクがあります。
    • ud2
      は動作が一貫しており、アーキテクチャ上**「無効なオペコード」例外が発生することが保証**されています。
  • 古くからの不具合の回避:
    • 一部の古いプロセッサでは、
      0F FF
      をデコードした時点でチェックせず直ちに例外を起こす仕様があり、ページの境界などで挙動が不安定(例外とアクセス違反が混在)なことがありました。
    • ud2
      はこのような不具合に悩まされることなく安全です。

著者紹介

  • レイモンド氏: Windows の進化に 30 年以上関わってきた経験を持つ技術者です。
  • 活動拠点: 2003 年にウェブサイト『The Old New Thing(旧なるもの)』を開始し、現在は書籍『The Old New Thing』(アディソン・ウェズレイ 2007 年)でも知られています。
  • SNS: Windows Dev Docs のツイッターアカウントなどで活躍中。

同じ日のほかのニュース

一覧に戻る →

2026/09/14 6:06

Claude Fable 5.1 が、370年もの間解読されてこなかったシフラル・ディスティッヒを解読しました

## Japanese Translation: Claude AI が、ロイヤリストのトマス・アークハート(*Logopandecteision* および *The Jewel* の作品)から提示された 2 つの歴史的に未解決のカギ合を成功裏に解読し、ブルートフォース計算や人類による事前の解読なしに、王チャールズ 2 世への隠された祈りを明らかにしました。これらのカギ合は、既知の解法が存在せず、CIA などの組織によってこれまで追求されたことがなかったため、特に選ばれました。大規模なデータ処理ではなく、モデルは単純で埋め込まれた構造的ロジックを認識しました:一方のカギ合は、各数字をアークハートの 32 の「Proquiritations」内の単語インデックスにマッピングし、他方は *The Jewel* のページインデックスに数字をマッピングし、それらのページの最初の一語の頭文字を採用します。これにより、「O GOD UPHOLD KING CHARLS THE SECOND / MAKE HIM THE SUPREME RULER OF THIS LAND」という 2 つのロイヤリストの祈りと、「GREAT LORD, MANTAINE THAT REGAL FAMILIE / WHEREOF KING CHARLS THE SECOND IS THE HEAD...」という ottava rima 形式の祈りが得られ、写本エラー、ハイフン接続語、ページシフトオフセット、および *The Jewel* の不読み可能なセグメントによる軽微な不一致を除いて正確です。検証の結果、275 の位置のうち 231 が正確な最初の単語の一致を示しています。1652 年版の *Jewel* のフリーデジタル画像が存在しないため、残りの不明点を解決するには実物コピーまたはジャック&ライアルの 1983 年版が必要です。この成果は、高度な AI が以前見過ごされてきた微妙な構造的パターンを検出することで歴史的真実を明らかにすることを示しており、暗号解析を計算的なブルートフォースからパターン認識へ転換しました。

2026/09/14 2:37

Google はなぜ依然として不適切な広告を表示し続けているのでしょうか?

## Japanese Translation: Google の高度な AI モデルである Gemini は、iOS システムアラートのパロディを用いてユーザーをクリックさせるよう誘導する欺瞞的な YouTube 広告を特定しました。オペレーティングシステムのダイアログを模倣した広告を禁止する厳格なポリシーが存在にもかかわらず、この誤解を招くクリエイティブは複数回のユーザー苦情にもかかわらず人間による審査官によって以前承認されていました。広告は非機能のボタンを用いて緊急のハードウェア故障状態を偽造し、視聴者にデバイスが直ちに技術的危機に直面しているという錯覚を成功裡に抱かせました。この操作は虚偽表示に関する基本的なルールに違反し、プラットフォームの安全メカニズムに対するユーザーの信頼を損ないます。したがって、Google はクリエイティブコンテンツを即座に承認停止するよう推奨し、ポリシー違反警告を発出することを示唆しています。広告主がこの種の欺瞞的な実践を継続した場合、アカウントの完全な停止のリスクに直面します。この事例は、人間による監視と自動検知の間にある重大なギャップを浮き彫りにしており、Google はこれらの洗練された詐欺を特定できる強力な AI を保有していますが、システムはまだ有害コンテンツがユーザーに到達する前に能動的にブロックするためにそれらを完全に活用していないという状況です。

2026/09/10 21:27

Julia 1.13 のハイライト

## Japanese Translation: Julia 1.13 がリリースされ、回帰と課題を特定することに焦点を当てたテスターおよびコントリビューターからの大きな貢献が反映されています。今回のアップデートは、特に起動時間とパッケージの前コンパイルにおいて劇的なパフォーマンス向上をもたらします。ベンチマークによると、パッケージの読み込みはバージョン 1.12 に比べて約 30% 速く(LTS の 1.10 に比べて約 10-20% 速く)、アプリケーションの起動時間は 1.12 に比べて約 20% 向上しており、平均的なスピードアップ率は約 1.22 倍です。これらの改善は、AbstractString および数値型に対して RapidhashNano を採用したことであり、イメージオブジェクトのマーキングをスキップしてフルコレクション時間を短縮した強化された garbage collection、そして新しいデフォルトのハッシュングアルゴリズムという技術的なアップデートによって実現されています。より迅速な開発ワークフローを支援するために、重要なバグ修正により Ctrl-C を通じた割り込み処理がより信頼性高く、タスクのカANCEL mechanisms が改善されました。また、リリースには REPL に直接組み込まれる貴重な開発者ツールが含まれます:内部実装による構文ハイライトは OhMyREPL.jl などの外部パッケージの必要性を排除し、新しい fzf スタイルの履歴検索(Ctrl-R)がファジー検索と複数結果の選択、そして REPL モードの表示をサポートします。また、Windows では効率的なテキスト入力を可能にする括弧付きペースト機能も利用可能です。診断機能をさらに強化するために、「--trace-eval」フラグにより、テストスイートやスクリプトでの停滞を特定しながらトップレベルの評価進捗を監視することができ、新しい「@__FUNCTION__」マクロは「#self#」の代替としてパブリック API として機能します。さらに、イントロスペクションマクロは型の付いた呼び出し式を受け付けるようになり、Time To First X(TTFX)モニタリングは 2026 年 9 月 7 日より稼働開始される新しい CI ジョブを通じて Julia の開発プロセスの一部として統合されました。これらの改善は、テスト時や大規模スクリプト実行時の待ち時間を大幅に削減し、個人のコントリビューターおよびエンタープライズチームの両方に対して全体の生産性を高め、より速いフィードバックループを提供します。 ## Text to translate: Julia version 1.13 has been released with significant contributions from testers and contributors focused on identifying regressions and issues. The update delivers dramatic performance improvements, particularly in startup times and package precompilation. Benchmarks indicate that loading packages is now roughly 30% faster than in version 1.12 (and roughly 10-20% faster than 1.10 LTS), while application startup times have improved by approximately 20% over 1.12, with a mean speedup of ~1.22x. These gains are driven by technical updates including the adoption of RapidhashNano for AbstractString and numeric types, enhanced garbage collection that skips marking image objects to reduce full collection time, and new default hashing algorithms. To support this faster development workflow, critical bug fixes ensure more reliable interrupt handling via Ctrl-C and improved task cancellation mechanisms. The release also introduces valuable developer tools directly into the REPL: built-in syntax highlighting replaces the need for external packages like OhMyREPL.jl, a new fzf-style history search (Ctrl-R) supports fuzzy searching with multiple result selection and REPL mode indication, and bracketed paste functionality is now available on Windows for efficient text input. Further enhancing diagnostics, the `--trace-eval` flag allows users to monitor top-level evaluation progress to identify hangs in test suites or scripts, while a new `@__FUNCTION__` macro serves as a public API alternative to `#self#`. Additionally, introspection macros now accept call expressions with types, and Time To First X (TTFX) monitoring is now an integrated part of Julia's development process through new CI jobs, going live on September 7, 2026. Collectively, these improvements significantly reduce wait times during testing or large-scale script execution, thereby boosting overall productivity and providing faster feedback loops for both individual contributors and enterprise teams.