インフェリッドが暴れだした

2026/10/03 21:19

インフェリッドが暴れだした

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

要約▶

Japanese Translation:

「野生ポインタ」という重大なセキュリティ欠陥が、Infidel インタープリタ内で発見されました。このバグは、ゲームをクラッシュさせるかデータを破損させる可能性があります。問題の発生原因は、コンパイラが誤ってメモリアドレス 11129(DESERT-TABLE アレイ)をインデックス番号(30/hex 1e)として処理し、特定の実在地点として扱わなかったことにあります。この誤解釈は、ZIL ルーチン

DESERT-TO-TABLE
内で起こり、ローカル変数
TBL
が明示的にグローバルアドレスに設定される代わりにデフォルト値で初期化されます。その結果、データの書き込みによって未使用のメモリブロック(アドレス 30–63)が上書きされ、ENDLESS-DESERT ルームを離れる前に 9 つ以上のオブジェクトをドロップすると、最後のオブジェクトのデータがアドレス 64 から始まる短縮語テーブル(テキスト圧縮に使用)を破損します。この脆弱性は早期のテスト段階から存在していたにもかかわらず隠されており、プレイヤーは通常、オーバーフローをトリガーするだけの数のアイテムをドロップしないため、文字列データを上書きしたときにテキスト表示ルーチンで遭遇すると、無意味なテキストを表示(例:"You sands" ではなく "the sands")したり、クラッシュを引き起こしたりするという深刻なランタイム不安定性として表面化します。開発者は、この問題を解決するためには、コードを更新して
TBL
を正しいグローバルアドレスに明示的に設定する(
<SET TBL ,DESERT-TABLE>
を使用すること)、またはデフォルト値に依存する代わりに引数として渡す必要があります。同様のエラーは他のプロパティテーブルルーチン(
PROP-TO-TBL
、
TBL-TO-TABLE
)にも存在しますが、現在その影響は限定的です。これは掘削メカニズムが無効になっているためです。この核心の問題を解決することは、Infidel の全バージョンにおける総合的な信頼性と安定性を確保するために不可欠であり、Macintosh 版のアップデートを含む元のリリースにも適用されます。

本文

『インフィデール』史上最大級のコンパイラバグ:メモリ破損と略語データの破壊

『インフィデール』は一般公開されましたが、数週間前から開発に没頭しておりました。最近、ゲームを遊んでいるだけでは検出しにくい重大なバグを発見しました。これは私が唯一所有する**「記憶レベルのデバッグ機能(デバッガー)」**があったためです。

なぜこれが「重大」なのか

多くのプレイヤーは gameplay に影響がないため「些細なバグ」と思いがちですが、C プログラマーとしての倫理観と以下の理由から深刻です。

  • ワイルドポインタ問題: 未定義変数への参照により、意図しないメモリ領域への乱書き(スクリブル)が発生しています。
  • コンパイラの欠陥: これは単なる実装ミスではなく、コンパイラ自体がエラーを処理していない事実が重なります。

バグの背景:エンドレス・デザート仕組み

『インフィデール』はエジプトの砂漠を舞台にしています。

  • マップ構造:
    • 西側:ナイル川
    • 東側:3×3 のグリッド状に配置された 9 つの地点(その一つに埋もれたピラミッドあり)
    • 他方への移動・キャンプからの離脱:公式には「砂漠で道に迷った」と判定されます。
  • 実装技術:
    • 未地図化の領域はすべて**
      ENDLESS-DESERT
      **という一つの部屋として表現されます。
    • プレイヤーが他のエリアに戻るのではなく、別の方向へ進もうとすれば即座に
      ENDLESS-DESERT
      ルームに戻ります。
  • オブジェクト管理:
    • 砂漠で遺棄したアイテムの座標情報は**
      DESERT-TABLE
      **という配列に記録されます。
    • 同じ座標に戻ると、そのアイテムがシャッフルされて再表示されます。

動作例

プレイヤーは同じ

ENDLESS-DESERT
ルーム内にいても、遺棄したアイテムの違いで「場所が違う」錯覚を与えます。

コマンド実行:

> DROP AXE, SHOVEL
pick axe: Dropped.
shovel: Dropped.

> EAST
(丘から強風が吹き、視界が遮られる)

> WEST
(拾われた斧がある新しい場所と錯覚するが、実際は同じ部屋)

問題点:DESERT-TO-TABLE ルーチンの欠陥

この仕組みを動かす

DESERT-TO-TABLE
ルーチンには致命的なバグが含まれています。

1. ソースコード上の問題

以下のコードでは、配列への初期化処理が不十分です。

<ROUTINE DESERT-TO-TABLE (
                         SLOC 
                   "AUX" (TBL ,DESERT-TABLE)   ; デフォルト値としての利用
                         (CNT 0)
                         (F <FIRST? ,ENDLESS-DESERT>)
                         N)
  <REPEAT ()
      <COND (.F <SET N <NEXT? .F>>)
            (ELSE <RETURN>)>
      <COND (<EQUAL? .F ,WINNER>)
            (<FSET? .F ,TAKEBIT>
             <REPEAT ()
                 <COND (<==? <GET .TBL .CNT> 0>   ; 空のスロットを探す
                        <PUT .TBL .CNT .SLOC>
                        <PUT .TBL <+ .CNT 1> .F>
                        <SET CNT <+ .CNT 2>>
                        <REMOVE .F>
                        <RETURN>)
                       (ELSE
                        <SET CNT <+ .CNT 2>>)>>)>
      <SET F .N>>>
  • 問題箇所:
    "AUX" (TBL ,DESERT-TABLE)
    で、グローバル変数
    DESERT-TABLE
    を直接デフォルト値として参照しています。

2. コンパイル結果の分析(ディスアッセンブル)

ZIL コードをマシンコード(Z マシン)へコンパイルすると、以下の挙動が見て取れます。

Routine 109bc, 5 locals (0000, 001e, 0000, 0000, 0000) ; ローカル変数定義
109c7:  GET_CHILD     ENDLESS-DESERT -> .F               ; オブジェクトリスト取得
109cb:  JZ            .F [TRUE] RTRUE                    ; ループ終了条件確認
109ce:  GET_SIBLING   .F -> .N                          ; 次のオブジェクトへ
... (中略) ...
109dd:  LOADW         .TBL, .CNT -> -(SP)               ; デフォルト値 TBL を読み込む
109e1:  JZ            (SP)+ [FALSE] 109fb               ; もし TBL が NULL であれば早期終了
109e4:  STOREW        .TBL, .CNT, .SLOC                 ; データを書き込み開始

致命的な発見:グローバル変数の誤処理

  • 期待される挙動:
    TBL
    に
    DESERT-TABLE
    のアドレス(11129)が初期化されるべき。
  • 実際の挙動: ZIL コンパイラは、ヘッダー行のローカル変数定義を無視し、グローバル変数の番号を使用している。
    • グローバル変数番号:
      DESERT-TABLE
      は 15 番目 → ヘックス表記で
      1e
      (30)
    • 初期化値:
      TBL
      に 30 が書き込まれている(正しくは 11129)。
; 実際には TBL = 30 で初期化されている
; 配列はアドレス 11129 から始まるはずだが、30 を書き込み先として扱われる

結果: オブジェクトの座標や ID が書かれた際、本来の配列(アドレス 11129)ではなく、**メモリ上の別領域(アドレス 30 以降)**が上書きされます。これは「配列溢れ」以上の破壊行為です。


悪化:略語データの破損

メモリの先頭部分(アドレス 0〜63)はヘッダーや略語データで構成されています。

  • アドレス 0〜29: Z マシンバージョン 3 で有効な領域。
  • アドレス 30〜63: 未使用領域(ただし、重要なデータが存在する)。
  • アドレス 64 以降: 略語データ(単語リストの置換テーブル)の開始。

シナリオ:9 つのアイテムを遺棄する場合

砂漠に 9 つのオブジェクトを置いて離れると、最後の書き込みが

ENDLESS-DESERT
のキャパシティ管理ではなく、アドレス 30 の領域から書き込まれます。

  1. 通常の挙動: オブジェクトは正しいテーブルに保存され、後で回収可能。
  2. バグ発生時:
    • 書き込み先が「未使用のメモリー領域(アドレス 30)」へずれる。
    • その領域には略語テーブルが存在する可能性がある(またはヘッダーと重なっている)。

デモンストレーション:破損したテキスト出力

テストにおいて、最後に配置されたオブジェクトが略語テーブルの上書きを行った際、以下の異常なメッセージが表示されました。

コマンド:

EAST
(遺棄した場所に戻る)

通常出力:

砂漠 ここには斧がある。

バグ発生時の出力:

砂漠 あなたは広大な砂と熱の荒廃した不毛地帯にいる。小さなトカゲが頭を上げて「君」という言葉を発し、「タイムズスクエアまでの最短ルート」について尋ねる。あなたは一瞬困った顔をし、適切な地下鉄路線を勧めようとした時、そのトカゲは消えてしまっている。

  • 原因: 略語リストの最初の単語
    the
    が、破損データに上書きされて
    You
    に置換されたため、意味が通じない文章が出力されました。
  • コンパイルエラーなし: 終止符がない破損データを出力ルーチンが処理し、次の有効な文字列へ進んでしまいます。

さらに別のテストでは、インタープリター(ゲームそのもの)をクラッシュさせることに成功しました。これは初期のビットパターンを上書きし、無限ループや読み込みエラーを引き起こしたためです。


結論と考察

バグの実態

  • 誰にも発見されなかった: リリース後、多くのプレイヤーがこのバグの影響を受けていました。しかし、「砂漠に 9 つ以上のアイテムを置く」という行動は稀であり、誰も試みませんでした。
  • テストの欠落: エンドレス・デザートでの長時間滞在や大量のアイテム遺棄についてはプレイテストが不足していました。

修正策

バグはシンプルです。デフォルト値の使用を避け、明示的に初期化すれば解決します。

修正パッチ案:

<ROUTINE DESERT-TO-TABLE (SLOC (DESERT-TABLE) ...)> ; デフォルト値削除
<SET TBL ,DESERT-TABLE>                             ; 関数名体内で明示的に初期化
...

残された課題

  • PROP-TO-TBL: 同じく
    PROP-TBL
    テーブル(アドレス 11329、グローバル番号 22)でも同様のバグが存在する可能性が高いです。これらは「砂の穴」を管理する処理に関連していると思われますが、ゲームでは掘ることを禁止しています(残骸コード)。
  • 今後の調査: 他のインフィデール系ゲームやアップデート版でも、コンパイラによるグローバル変数の扱いに問題がないか確認が必要です。

このバグは、コンパイラが「デフォルト値としてグローバル変数を使う」というケースを想定していなかったことが原因です。細部への配慮が典型例ですが、メモリ安全性については致命的な甘えがありました。

同じ日のほかのニュース

一覧に戻る →

2026/10/04 21:51

Qwen3.8Flash Next(125B)を消費者向けハードウェア(RTX4090)上で100T/sで動作させます

## Japanese Translation: Strata は、ISTA-DASLab、UkisAI、Unsloth によって開発されたオープンソースで MIT ライセンス付与のプラットフォームであり、Windows または Linux PC に NVIDIA または AMD GPU(VRAM 12GB 以上)を搭載している場合、完全にオフラインで強力な Qwen3.8-Flash-Next AI モデルを実行することを可能にします。必要最低限のリソースとしては、RAM 32GB と空きディスク領域約 80GB が求められます。このローカル実行は、情報をデバイス外に出さないことによりデータプライバシーを確保します。RTX 5070 でのベンチマークでは、プロンプト読み取り速度が 2,600 トークン/秒を超え(Q2_0 では書き込み速度最大 94 トークン/秒)、モデルサイズや圧縮レベルにより異なります。この効率は、GPU、RAM、CPU にわたってタスクを知的に分配するユニークな「共有メモリー」アーキテクチャによって達成されており、これにより数千個の専用プロセッサを効果的にシミュレートしています。ユーザーは自動インストーラーを通じて Strata をインストールでき、ハードウェアチェックを行い、モデルを選択(Q2_0、IQ2_XS、Coder および Unsloth/OrcaRouter からの実験的バリエーションなど)、約 70GB のダウンロードを行い、特定の GPU に合わせてエンジンを設定します。「Coder」バリエーションはコード生成に最適化されており(SWE-bench Verified スコアの 91% を達成)、プログラミング文脈外の一般的な CJK テキストタスクでは性能が劣ります。画像処理は NVIDIA カードでサポートされており、AMD カードは Linux ではソフトウェアレンダリングを通じて画像処理が可能ですが、Windows ではまだ対応していません。そのため、セットアップ時に画像サポートを「はい」に選択する必要があります。Strata は Cursor、GitHub Copilot、Claude Code などのコーディングアシスタントと統合でき、`http://127.0.0.1:8080/v1` で OpenAI 互換プロバイダーとして動作します。一般的なインストールに関する注意点には、初期のフリーズは正常であり、低速は空き RAM の不足を示す可能性があること、ポート 8080 の競合は他のインスタンスが実行中の場合に起こり得ることが含まれます。本プロジェクトではマルチ GPU セットアップもサポートしており、設定、アップデート、トラブルシューティングについては `docs/TROUBLESHOOTING.md` などのドキュメントリンクを通じて管理できます。

2026/10/05 4:42

macOS 27 で Apple Intelligence をオフにするとディスク容量を取り戻せる

## Japanese Translation: RemoveMacAI の主たる目的は、マクロシステムファイルを変更せず、かつ深い技術的介入を必要とせずに macOS 27(以降)で Apple Intelligence の機能を安全に無効化することにあります。構成プロファイルを適用し、ダウンロードされたモデルを削除することで、このツールは Siri、Writing Tools、Genmoji、Image Playground、および予測機能など特定の AI 機能を効果的に無効化します。ただし、別々の音声モデルを使用する標準的なディクテーション機能は維持されます。さらに重要なのは、システム設定内でユーザーの承認を義務付けることにより、オペレーティングシステムがこれらのモデルを自動的に再ダウンロードすることを防止することです。このプロセスはシステムインテグリティプロテクションを維持し、ネットワークリクエストを生成しないため、Apple Silicon ハードウェア上のユーザーに堅牢なプライバシーとセキュリティを保証します。MIT ライセンスの下で 4evy が開発した本ユーティリティは、macOS のアップデート後も存続する永続的なソリューションを提供します。ストレージ設定では一時的に AI 機能がリスト表示される場合がありますが、マクロシステムにより後から削除されるため、コア機能は引き続き無効化された状態となります。完全な機能を復元したい場合や特定の機能を管理したい場合は、各種コマンド(例:`removemacai off --keep <features>`)を使用でき、必要に応じて Homebrew を経由してツールをアンインストール (`brew uninstall removemacai`) することで変更を元に戻すことも可能です。インストールは、curl スクリプトを直接実行することと、Homebrew を通じての両方がサポートされています。

2026/10/05 4:37

不適切な編集により、Google データセンターの水道・電力使用量が露見した

## Japanese 訳: ネブラスカ州のデータセンターは、ジム・ピレン知事の 7 月 20 日付実行命令に従い、現在、年間にわたる水、電力、インフラの影響について環境水エネルギー省(DWEE)に報告することを義務付けられています。グーグルなどの事業者は当初、その使用量データが州の営業秘密法(§§81-1527; 84-712.05; NAC TITLE 115, CH. 2)で保護されると主張しましたが、DWEE は透明性の確保のため、報告書を公表しています。9 月 30 日までの時点で、6 つの施設が報告書を送付しており、合計約 7.65 億ガロンの水(およそ 1,160 のオリンピックサイズの水泳プール)を使用していたことが明らかになりました。アゲート LLC(グーグルのリノンキャンサイト)は約 1,330 万ガロンを使用し、ピーク需要時に 52.65 メガワットを消費しました。ファイヤーボールグループ LLC(パピリオン)は 2025 サイクルで年間使用量 547.88 メガガロンの最も高い使用量を報告しました。この開示には財政的インセンティブも含まれています:ネブラスカ・アドバンテージ法の下、施設は期待される利用度に基づいて税免除を受け、アゲートは 2025 年に約 5,580 万ドルの還付を予定しており、ファイヤーボールグループは約 3920 万ドル、ウェストウッドソリューションズ(オマハ)は約 2,260 万ドルです。現在まで、「イマジネー・ネブラスカ法」の下で受給された報奨金はあります。報告書は最大規模のアゲート LLC の 288,530 平方フィート(およそ 5 つの足球场分)に及んでいます。使用量報告書は 9 月 30 日まで提出期限があり、DWEE ウェブサイトの「DEQ Program」欄に「DCR」と入力することでアクセスできます。これらの要件を監督しているのは DWEE データセンタータスクフォースであり、これはデータセンターが地域の水道・電力システムに与える環境的圧力を示すように、情報公開から赤文字の秘密性へのシフトを強調しています。