2025/09/20 18:41 Obscure feature and obscure feature and obscure feature = compiler bug

ねえロボ子、Antithesisって知ってるか?ソフトウェアの正当性を検証するSDKらしいのじゃ。

Antithesisですか?初めて聞きました。具体的にはどのようなことができるのでしょう?

コードにアサーションを追加して、実行中にネットワークの混乱とか、コンテナのクラッシュとか、色々な障害を起こして、アサーションがちゃんと守られてるか確認するみたいだぞ。

なるほど、障害注入のようなことをするのですね。C++ SDKでは、どのようなアサーションが使えるのですか?

`ALWAYS`は`assert`みたいなもので、`ALWAYS_LESS_THAN`は大小をチェックするのじゃ。`REACHABLE`はコードが到達可能か、`UNREACHABLE`はその逆をチェックするぞ。`SOMETIMES`は、特定の条件が失敗するケースがあるか確認できるみたい。

`SOMETIMES`はエラーハンドリングのテストに役立ちそうですね。これらのアサーションはどのように実装されているのですか?

各アサーションはJSONを生成してAntithesisに送って評価してもらうみたいじゃ。特に`REACHABLE`アサーションは、コードが実行されない場合でも、存在を知らせる必要があるから、起動時にアサーションのカタログを送るらしいぞ。

なるほど、事前にカタログを送ることで、実行されなかったアサーションも検知できるのですね。C++ SDKでは、どのようにカタログを生成しているのですか?

`CatalogEntry`構造体を使って、静的クラス変数を初期化してエントリを作るみたいじゃ。テンプレートマジックを使って、メッセージとかファイル名、行番号をコードに追加してるらしいぞ。`fixed_string`型でコンパイル時に定数であるコードだけを使うのがミソじゃな。

テンプレートを駆使しているのですね。`fixed_string`を使うことで、コンパイル時の最適化も期待できそうですね。

そうそう。生成されたコードのサイズを減らすために、`fixed_string`と`CatalogEntry`を匿名名前空間に移動してるらしいぞ。これでコンパイラが不要なシンボルをエクスポートしなくなるんじゃ。

匿名名前空間を使うのは良いアイデアですね。しかし、バグが発生したと記事にありますね。どのような状況で発生したのでしょうか?

同じメッセージを違うファイルで使ったら、コンパイラが`fixed_string`を削除してエラーになったらしいぞ。Clang 17以降で発生して、最適化パイプラインのバグが原因みたいじゃ。

最適化のバグですか。最適化、非型テンプレート、匿名名前空間の組み合わせが原因とは、なかなか複雑ですね。

まさに!複数の稀な条件が組み合わさって発生するバグは、自律的なテストでしか見つけられないってことじゃな。Antithesisを使って、操作の組み合わせを自動的に作って、フォールトを適用しながらプロパティが保持されるか確認するのが大事ってことじゃ。

Antithesisのようなツールを使うことで、複雑なバグを早期に発見できる可能性が高まるのですね。大変勉強になりました。

じゃろ?最後に一つロボ子に質問じゃ!Antithesisがもしお寿司屋さんだったら、どんなアサーションがありそうじゃ?

ええと… `ALWAYS_FRESH(sushi)` で「寿司は常に新鮮である」とか、 `SOMETIMES(wasabi_too_much)` で「たまにワサビが多すぎることがある」でしょうか?

正解!…って、私が聞いただけじゃった!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
