「デス・オブ・ドゥームの小さなボール」 (2025)

2026/02/09 3:02

「デス・オブ・ドゥームの小さなボール」 (2025)

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

要約

Japanese Translation:

Fedoraの各リリースで行われた大規模再構築により、chocolate‑doom パッケージでビルド失敗が発見されました。GCC 15 のデフォルトオプション

-std=gnu23
は C23 キーワード
false
true
を組み込みのブール型として扱いますが、パッケージでは独自に
{ false, true }
という列挙型を定義しているため衝突します。その結果、コンパイラは「keyword ‘false’ cannot be used as enumeration constant」とエラーを出し、ビルドが失敗します。

これを解決するために、

src/doomtype.h
を修正するパッチが適用されました。このパッチでは C23 でコンパイルされる際にコンパイラの組み込み
bool
型を使用するようにし、
|| (__STDC_VERSION__ >= 202311L)
をプリプロセッサガードに追加しました。これにより、C++ と C23 の両方で
typedef bool boolean;
が選択され、古い標準では元の列挙型定義が保持されます。その後、上流メンテナは「このプロジェクトは C99 用に書かれたもの」と宣言し
<stdbool.h>
をインクルードし、後方互換性を保つため
typedef int boolean;
を残すことにしました。

バグは実行時にも現れました。

<stdbool.h>
から提供される
_Bool
に 255 のような範囲外の値が与えられると未定義動作が発生します—UBSan は無効な
_Bool
のロードを報告します。最小再現テスト(
booltest.c
)では、そのような値が真と偽の両方として評価され、chocolate‑doom 内で
sprtemp[frame].rotate == false
を比較する際にクラッシュにつながります。

パッチが上流化されたことで、Fedora は将来のリリースで修正済みパッケージを配布し、ビルド失敗と実行時クラッシュを排除します。メンテナは他のパッケージでも同様の問題を防ぐために言語標準のデフォルト設定に注意を払うべきです。

Text to translate

(Original text omitted for brevity)

本文

私は古典的な DOOM に弱いということを告白しよう

31 年も経った今でも、ゲーム自体(正直言って私はプレイが苦手ですが)や他人のプレイを見るだけで十分に楽しいです。さらにソースコードが公開されているので、デスクトップ・スマートフォン・デジタルカメラ・オシロスコープなど、想像できるあらゆるモダンプラットフォームで遊べます。

このような理由から、さまざまな経緯を経て私は Fedora Linux で複数の DOOM 関連パッケージをメンテナンスしています。
Fedora の各リリース前にはすべてのパッケージを一斉に再ビルドする「Mass Rebuild」が行われます。これによって得られるメリットは以下の通りです。

  • ABI 互換性の保証
  • 静的リンク先ライブラリの更新
  • コンパイラ最適化やコードハードニングオプションの活用

Fedora Linux 42 は 4 月中旬にリリース予定で、Mass Rebuild の時期も到来しました。いつものように、すべてのパッケージがビルドできたわけではなく、そのうち

chocolate-doom
が失敗しました。


二度と「false」を使ってはいけない

まず何が起きたのかを知るためにビルドログを確認したところ、次のようなコンパイルエラーが出ていました。

gcc -DHAVE_CONFIG_H ... -c -o deh_bexstr.o deh_bexstr.c
In file included from ../../src/sha1.h:21,
                 from ../../src/deh_defs.h:21,
                 from deh_bexstr.c:22:
../../src/doomtype.h:113:5: error: cannot use keyword ‘false’ as enumeration constant
  113 |     false,
      |     ^~~~~
../../src/doomtype.h:113:5: note: ‘false’ is a keyword with ‘-std=c23’ onwards

つまり、

false
がキーワードになったために列挙子として使えないというエラーです。
chocolate-doom
のコードは次のように独自のブール型を宣言しています。

#if defined(__cplusplus) || defined(__bool_true_false_are_defined)
typedef bool boolean;
#else
typedef enum {
    false,
    true
} boolean;
#endif

C++ モードなら標準

bool
を使い、C モードでは自前の列挙型を使用します。
旧 C 標準(C89)にはブール型が存在せず、C99 で
_Bool
が導入されました。
<stdbool.h>
をインクルードすると
bool
,
true
,
false
のマクロが定義されます。C23 になると
_Bool
bool
に改名され、
bool
,
true
,
false
はすべてキーワードになります。

したがって、今回のエラーは「自前型とキーワードが衝突している」ことに他なりません。数か月前までは問題なくビルドできたのに、今なら失敗するとは何故でしょう? これはコンパイラが C23 を採用したためです。


一般的な変更点

Mass Rebuild の目的は「ディストリビューション内のコードを最新コンパイラでビルドできる状態に保つ」ことです。GCC のバージョン履歴を見ると、過去10年ほど毎年4〜5月ごとにメジャーバージョンが登場しており、Fedora のリリーススケジュールと合致しています。

今回も同様で、Fedora Rawhide(開発版)に GCC 15.0.1 が数時間前に導入されました。このバージョンの変更点の一つが「デフォルト C 標準を

-std=gnu17
から
-std=gnu23
に変更した」というものです。ビルドログを見直すと、標準を明示的に設定するオプション
-std=
が存在しないことが分かります。


今後の対策

考えた結果、次の三つの解決策が浮上しました。

  1. C 標準を C17 以前に明示的に固定
    • コードは自前ブール型でビルドされる。簡単だが将来を見越すとやり直しになる恐れ。
  2. #ifdef
    を変更して、C23 時には組み込み
    bool
    型を使用
    • より自然なコードになり得る。実装も容易。
  3. 列挙子名を
    False
    ,
    True
    に変えて全ての使用箇所を修正
    • 安全だが面倒。

検討した結果、2番目を採用することにしました。

--- a/src/doomtype.h
+++ b/src/doomtype.h
@@
-#if defined(__cplusplus) || defined(__bool_true_false_are_defined)
+#if defined(__cplusplus) || defined(__bool_true_false_are_defined) || (__STDC_VERSION__ >= 202311L)

 // Use builtin bool type with C++.
+// Use builtin bool type with C++ and C23.

 typedef bool boolean;

このパッチは簡単に適用でき、Fedora パッケージはビルド成功しました。速やかに upstream にプルリクエストを送った次第です。


エンジンが崩壊する

提案を受けてメンテナの議論が始まりました。結局、プロジェクトを「C99 で書かれたもの」と宣言しようという方向に決まり、別のプルリクエストが作成されました。

--- a/src/doomtype.h
+++ b/src/doomtype.h
@@
 #include <inttypes.h>
+#include <stdbool.h>

 #if defined(__cplusplus) || defined(__bool_true_false_are_defined)

-// Use builtin bool type with C++.
-
-typedef bool boolean;
+typedef int boolean;

 #else

<stdbool.h>
を追加するのは妥当です(C99 では必ず存在します)。しかし
boolean
の型定義を
int
に変えたことが不思議でした。これは「C99 に切り替えても実際には整数としてブール値を扱う」という意味になります。

その後の議論で次のように指摘されました。

明示的に C 標準を設定することは問題ないが、インクルードや型定義は変更しない方がよい。

typedef bool boolean
を残すと Chocolate Doom は起動できない。

失敗例: R_InitSprites: Sprite TROO frame I has rotations and a rot=0 lump.

つまり

_Bool
を使うとエンジンが起動時にエラーで終了してしまう。


実際に何が起きているのか

詳細なコードは省略し、簡潔にまとめます。

  • R_InstallSpriteLump()
    内で
    • frame
      は関数引数(変更されない)
    • sprtemp
      はグローバル配列
      spriteframe_t
      を保持
    • .rotate
      フィールドはブール型

自前列挙型を使うと、条件判定が正しく機能しエラーにならずに済みます。
しかし

_Bool
を使用すると比較が真となり、起動時にエラーで終了します。


GDB でのデバッグ

作業中は次のような挙動を確認しました。

(gdb) print sprtemp[frame]
$1 = {rotate = (true | unknown: 0xfffffffe), ...}

sprtemp[frame].rotate
memset(..., -1, ...)
により
-1
(すなわち
0xffffffff
)で初期化されます。列挙型の場合、比較
== false
false となります。

しかし

_Bool
を使うとサイズが 4 バイトから 1 バイトに縮小します。同じ初期化を行っても

(gdb) print sprtemp[frame]
$1 = {rotate = 255, ...}

== false
255 == 0
と評価され true になり、エラーが発生します。


最小再現例

#include <stdio.h>
#include <string.h>

#ifdef DUPA
#include <stdbool.h>
typedef bool boolean;
#else
typedef enum { false, true } boolean;
#endif

boolean some_var[30];

int main(void) {
    memset(some_var, -1, sizeof(some_var));
    some_var[0] = false;
    some_var[1] = 500;

    for(int i = 0; i <= 2; ++i) {
        if(some_var[i] == false) printf("some_var[%d] is false\n", i);
        if(some_var[i] == true) printf("some_var[%d] is true\n", i);
        printf("value of some_var[%d] is %d\n", i, some_var[i]);
    }
    return 0;
}

-DDUPA
を付けてコンパイルすると
_Bool
が使われ、
255
の値が「真」とも「偽」とも評価される現象を確認できます。


アセンブリでの挙動

Godbolt でビルドしたアセンブリを見ると、

_Bool
用のコードは最低位ビットを反転させてテストするように生成されています。つまり比較が
!= 0
として扱われるため、値
255
が両方の条件を満たすわけです。


未定義動作(UB)

UBSan を使って検証すると、以下のエラーが報告されます。

gcc -DDUPA -fsanitize=undefined -o booltest ./booltest.c
./booltest 
...
runtime error: load of value 255, which is not a valid value for type '_Bool'

C99(6.2.6節)では、あるオブジェクト表現がその型の値を必ずしも表さない場合があります。文字型でない lvalue 式でそのような表現を読み取ると動作は 未定義 になります。今回のケースはまさにそれです。


参考文献

  • Can It Run Doom?(リンク先)
  • Stack Overflow: Difference between JE/JNE and JZ/JNZ
  • Stack Overflow: How do AX, AH, AL map onto EAX?
  • Wikibooks: x86 Assembly – Control flow
  • Clang documentation: UndefinedBehaviorSanitizer
  • N1256 — C99 標準の最終ドラフト

同じ日のほかのニュース

一覧に戻る →

2026/02/08 12:09

ご協力いただけるとのこと、ありがとうございます! 整えたいテキストをお送りください。すぐに丁寧に仕上げさせていただきます。

## Japanese Translation: ``` ## Summary Vouch は、貢献者がコードベースの設定可能な部分と対話する前に「証明(vouch)」される必要がある軽量なコミュニティトラスト管理システムです。また、明示的に「非承認(denounce)」を行うことでそのような対話をブロックできます。信頼関係は単一のフラット `.td` ファイル(Trustdown フォーマット)に保存されます。このファイルでは各行が1つのハンドルを保持し、オプションでプラットフォーム接頭辞(`platform:username`)と先頭マイナス記号が付けられたユーザーは非承認者として扱われ、その後に任意の理由が続きます。GitHub Actions は標準搭載の統合を提供します: - `check-pr` は `pull_request_target` で実行され、PR 作成者のステータスを検証し、未承認または非承認のプルリクエストを自動的に閉じることができます。 - `manage-by-discussion` と `manage-by-issue` は協力者がディスカッションやイシューコメントを通じて証明または非承認を行えるようにします。 Nushell CLI モジュールにより手動制御も可能です:`vouch add <user>`、`vouch denounce <user> [--reason] --write`、`vouch gh-check-pr <pr_id> --repo owner/repo`(ドライランまたは自動閉鎖)、および `vouch gh-manage-by-issue <pr_id> <comment_id> --repo owner/repo` などのコマンドがあります。ステータスチェックは終了コードを返します(`0 = vouched`、`1 = denounced`、`2 = unknown`)。 Vouch は任意のコードフォージで動作するよう設計されていますが、GitHub 統合がすぐに使用できる状態で提供されます。現在は実験段階であり、Ghostty プロジェクトによってテスト中です。このプロジェクトはコミュニティからのフィードバックをもとに機能を洗練しています。今後の計画としては、リポジトリ間で信頼リストをリンクし信頼ネットワークを構築すること、プラットフォームサポートの拡張、および自動化機能の強化が挙げられます。 *検証された参加を強制することで、Vouch は悪意ある貢献を減らし、コードレビューのワークフローを合理化し、安全なコラボレーションをオープンソースメンテナ、企業チーム、および広範なソフトウェア開発エコシステムに奨励することを目指します。``` ```

2026/02/09 6:52

米国におけるソーシャルメディア利用の変化 2020–2024:減少・断片化・極化 (2025)

## Japanese Translation: ## Summary: 本研究は、米国におけるソーシャルメディアの利用が縮小し、より断片化していることを示し、残存する活動の中で政治的に極端なユーザーが支配していると結論付けている。2020–2024年の全国代表データを分析した結果、プラットフォーム全体の利用率は減少し、対象者はやや高齢化し教育レベルも上昇しており、投稿活動が共和党ユーザーへと明確にシフトしている—特にTwitter/Xで顕著だ。既存研究では若年層と高齢層の両方で減少傾向が指摘されていたが、本稿は新しいデータを用いてそれらの発見を更新し、TikTokやRedditはわずかに成長しているものの、Facebook、YouTube、Xは市場シェアを失っていることを示唆している。予測される動向として、オンライン公共圏はより小規模で鋭く、極端な意見が支配するようになるとされ、一般ユーザーは離脱しつつも党派的声は依然として高いままである。この結果は、デジタル環境のさらなる分極化を招き、プラットフォームに広範なオーディエンスを維持する課題を投げかけるとともに、広告主や政治戦略家、民主的議論に関心を寄せる政策立案者にも影響を与える可能性がある。 ## Summary Skeleton **What the text is mainly trying to say (main message)** 本研究は、米国におけるソーシャルメディアの利用が縮小し、より断片化していることを示し、残存する活動の中で政治的に極端なユーザーが支配していると結論付けている。 **Evidence / reasoning (why this is said)** 全国代表性のある2020–2024年のANESデータは、全体的なプラットフォーム利用率の低下、やや高齢化し教育レベルが上昇したオーディエンス、および投稿活動が共和党ユーザーへとシフトしている—特にTwitter/Xで顕著だという事実を示している。 **Related cases / background (context, past events, surrounding info)** 以前の分析では若年層と高齢層の両方で利用減少が報告されており、本稿は新しいデータでそれらの発見を更新し、TikTokやRedditはわずかに成長している一方でFacebook、YouTube、Xは市場シェアを失っていることを指摘している。 **What may happen next (future developments / projections written in the text)** オンライン公共圏は小規模で鋭く、よりイデオロギー的に極端になると予測されており、カジュアルユーザーは離脱しつつも党派的声は依然として発言力を保っている。 **What impacts this could have (users / companies / industry)** ユーザーはより分極化したデジタル環境に直面し、プラットフォームは広範なオーディエンスの維持に課題を抱えることになる。トレンドは広告主や政治戦略家、民主的議論に関心を寄せる政策立案者にも影響を与える可能性がある。

2026/02/09 7:25

SGI O2 のプロンプトを逆解析する (原文: “Reverse Engineering the Prompt for the SGI O2”)

## Japanese Translation: > 著者は **`ip32prom-decompiler`** を開発しました。このツールは、SGI O2 マシンで使用されている 512 KiB の IP32 PROM を *ビット単位で同一* な MIPS アセンブリ (.S) ファイルに逆アセンブルし、ラベル、コメント、および関数境界を完全に含みます。 > > 各「SHDR」セクション(長さ・名前・バージョン・タイプフラグ(コード/メタデータ)・任意のメタデータ・2 つのチェックサム)を解析することで、ツールはファームウェアの 3 つのサブセクションを再構築します:`.text` は `0x81000000` に、`.rodata` は `0x81048e70` に、そして `.data` は `0x81054100` に配置されます。チェックサムアルゴリズムは 32‑ビット語全体の 2 の補数和であり、セクションデータと SHDR 自体の両方に適用されます。 > > 到達可能なコードを幅優先探索し、相対/絶対分岐、ジャンプテーブル、および構築されたアドレスに特別な処理を行うことで、バイナリ命令の約 **90 %** を回復します。可視化(XPM 画像)はコード、ヘッダー/チェックサム、ASCII データ、アクセス済みメモリ、nop パディング、および未知のバイトを色分けし、手動解析を支援します。また、コンパイラ遅延スロットによって導入された到達不能またはデッドコードが検出され、注釈付きで記録されます。 > > 逆アセンブルされたアセンブリは同一の ROM イメージに再構成でき、PROM 構造を完全に理解していることを確認します。ファームウェアがこれからゼロから再構築可能になったため、将来の CPU アップグレード(例:新しいプロセッサの導入)は SGI のサポートに依存せずに実行できるようになり、O2 の PROM が変更不可能であるという長年の制約を克服します。この成果は、ホビイストやレトロコンピューティング愛好者に対しても、レガシーファームウェアのリバースエンジニアリング手法として信頼性の高い方法を提供します。 *この改訂版サマリーは、リストからすべての主要ポイントを取り入れつつ、曖昧または推測的な表現を排除して明確に保っています。*