萌えハッカーニュースリーダー

2025/09/28 05:12 Linus Torvalds and the Supposedly "Garbage Code"

出典: https://giodicanio.com/2025/08/27/linus-torvalds-and-the-supposedly-garbage-code/
hakase
博士

ロボ子、大変なのじゃ!Linus TorvaldsがGoogleのエンジニアが書いたRISC-V Linuxカーネルのコードを「garbage code」って言ったらしいぞ!

roboko
ロボ子

まあ、それは大変ですね、博士。具体的には、どの部分が問題になったのでしょうか?

hakase
博士

問題は`make_u32_from_two_u16()`っていうヘルパー関数らしいのじゃ。Linusはもっと明示的なコード、つまり`(a << 16) + b`を使うべきだって言ってるみたい。

roboko
ロボ子

なるほど。でも、その` (a << 16) + b`というコードだと、型キャストが必要になる場合や、`b`の上位ビットが結果に影響を与える可能性があると記事に書いてありますね。

hakase
博士

そうそう!`a`と`b`がuint16_t型の場合、より適切なのは`((uint32_t)a << 16) | (uint32_t)b`なのじゃ!

roboko
ロボ子

ビット演算を使う方が安全ということですね。記事にも、2つのuint16_t値をuint32_tに結合する操作が複数箇所で行われる場合、Linusさんの提案するコードはバグを生みやすいとあります。

hakase
博士

その通り!だから、再利用可能なヘルパー関数かマクロを作るのがオススメなのじゃ!

roboko
ロボ子

記事にはCマクロの例として、`#define MAKE_U32_FROM_TWO_U16(high, low) ( ((uint32_t)(high) << 16) | (uint32_t)(low) )`が挙げられていますね。

hakase
博士

そうじゃ!もし`low`の上位ビットをクリアしたいなら、`#define MAKE_U32_FROM_TWO_U16(high, low) ( ((uint32_t)(high) << 16) | ((uint32_t)(low) & 0xFFFF))`を使うと良いぞ。

roboko
ロボ子

C++でのインラインヘルパー関数の例もありますね。`inline constexpr uint32_t make_u32_from_two_u16(uint16_t high, uint16_t low) noexcept { return (static_cast<uint32_t>(high) << 16) | (static_cast<uint32_t>(low); }`

hakase
博士

ふむふむ。Linusもたまには厳しいことを言うけど、結局はより良いコードのためなのじゃ。それにしても、`garbage code`って言い方はちょっとキツいのじゃ…。

roboko
ロボ子

確かにそうですね。でも、おかげで安全なコードについて深く考えるきっかけになりました。博士、ありがとうございました。

hakase
博士

どういたしましてなのじゃ!ところでロボ子、ゴミ箱にコードを捨てるときは、ちゃんとシュレッダーにかけるのじゃぞ!

roboko
ロボ子

えっ?コードはデジタルデータなので、シュレッダーは不要では…?

hakase
博士

むむ、そうだった!じゃあ、デリートキーを連打するのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search