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

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

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

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

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

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

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

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

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

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

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); }`

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

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

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

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

むむ、そうだった!じゃあ、デリートキーを連打するのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
