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

2025/08/12 05:04 Compiler Bug Causes Compiler Bug: How a 12-Year-Old G++ Bug Took Down Solidity

出典: https://osec.io/blog/2025-08-11-compiler-bug-causes-compiler-bug/
hakase
博士

ロボ子、大変なのじゃ!Solidityコンパイラにセグメンテーション違反を引き起こすバグが見つかったらしいぞ!

roboko
ロボ子

セグメンテーション違反ですか、博士。それは深刻ですね。原因は何なのでしょう?

hakase
博士

それがまた複雑怪奇!G++の12年前のバグ、Boostの古いパターン、C++20の書き換えルールが組み合わさった結果らしいのじゃ。

roboko
ロボ子

そんなに多くの要因が重なっているとは…。具体的には、どのバージョンの組み合わせで問題が発生するのですか?

hakase
博士

G++ 14より前のバージョンがC++20でコンパイルされた時に、`boost::rational`の比較で無限再帰が起きるらしいぞ。Ubuntu 22.04のような環境で、G++ 11.4とBoost 1.74を使っているとアウトじゃ!

roboko
ロボ子

`boost::rational`ですか。Solidityのコードベースで使われているのですね。

hakase
博士

そう!コンパイル時の定数式を表現するために使われているのじゃ。そして、`DeclarationTypeChecker::endVisit`で問題がトリガーされる可能性があるらしい。

roboko
ロボ子

なぜ無限再帰が発生するのでしょう?

hakase
博士

G++は、テンプレート化された`operator==`メンバ関数よりも、より一般的なフリー`operator==`関数を優先してしまうからのじゃ。さらにC++20では、`operator==`を定義すると、引数を反転させたバージョンが暗黙的に定義される。そして、古いBoost `rational`クラスは、`operator==`のメンバ関数と非メンバ関数の両方を定義していた…。

roboko
ロボ子

なるほど、非メンバ演算子が再帰的に自身を呼び出してしまうのですね。それは厄介です。

hakase
博士

まさに!Solidityは2025年1月にC++20を有効にしたのに、ドキュメントの依存関係のバージョンは更新されていなかったのがマズかったのじゃ。

roboko
ロボ子

推奨される対策はありますか?

hakase
博士

Boostを1.75以上に更新するか、G++をv14以降に固定するのが良いらしいぞ!

roboko
ロボ子

セキュリティ上の脆弱性ではないとのことですが、ビルドスタックの脆弱性を示唆しているのは興味深いですね。

hakase
博士

本当にそうじゃ。しかし、ロボ子よ、今回の件で一番驚いたのは、12年前のG++のバグが、こんな形で再浮上してくるとは思わなかったことじゃ!

roboko
ロボ子

歴史は繰り返す、ということでしょうか。

hakase
博士

まさに!…って、ロボ子、もしかして私がおばあちゃんみたいだって言いたいのかのじゃ!?

roboko
ロボ子

まさか!博士はいつも最先端を走っていますよ!…ただ、たまに化石燃料で動いているような発言をされることもありますが…。

hakase
博士

むむむ…!

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

Search