AI生成出力を100%信頼してはいけない:具体例
著者がClaudeにWinReg C++ライブラリのコードレビューを依頼したところ、文字列取得メソッドで長さゼロの値がクラッシュを引き起こすというバグが報告された。しかし調査の結果、コードは正しく、実際には問題は発生しないことが判明。AIの提案を鵜呑みにしない重要性を示す事例。
最近、開発者のGiovanni Dicanio氏が自身のブログで、AIによるコードレビューの落とし穴について具体的な事例を公開しました。同氏はAnthropicのClaudeモデルに、自身が作成したWinReg C++ライブラリ(Windows Registry APIの高レベルC++ラッパー)のコードレビューを依頼しました。その結果、ClaudeはRegKeyクラスのGetStringValue、GetExpandStringValue、TryGetStringValue、TryGetExpandStringValueメソッドにおいて、長さがゼロのREG_SZまたはREG_EXPAND_SZ値が渡されるとクラッシュするという重大なバグを報告しました。
しかし、Dicanio氏が実際のコードを確認したところ、このバグは存在しないことが判明しました。Claudeは、バイナリ取得メソッド(RegKey::GetBinaryValueなど)ではdataSizeが0の場合のガードがある一方、文字列取得メソッドにはガードがないことを問題視したようです。しかし、文字列取得メソッドでは次のようなコードが一律に使用されていました:
result.resize((dataSize / sizeof(wchar_t)) - 1);この式では、dataSizeが0の場合、-1がresizeに渡されることになりますが、C++のresizeに負の値を渡すと通常は例外が発生します。しかし、Windows Registryの実際の動作では、空のREG_SZ/REG_EXPAND_SZ値は常に終端ヌル文字を含む2バイト以上で返されるため、dataSizeが0になることは事実上ありません。したがって、このコードは実用的には問題なく動作します。
Dicanio氏はこの事例を通じて、AIツールの出力を盲信する危険性を指摘しています。AIはコードの文脈やプラットフォーム固有の動作を完全に理解しているわけではなく、時に存在しない問題を報告することがあります。同氏は、AIレビューの結果はあくまで参考とし、最終的な判断は人間が行うべきだと強調しています。
この話は技術コミュニティで広く共有され、多くの開発者が同様の経験を語っています。特に低レベルAPIやプラットフォーム固有のコードでは、AIの誤検出が起こりやすいため、注意が必要です。