AI生成コードで起きやすいバグと確認ポイント
はじめに
AI が生成したコードには典型的なバグパターンがあります。本記事では、よく起きるバグと確認方法を説明します。
よくあるバグパターン 5 つ
バグ1:型チェック漏れ
❌ AI が生成しやすいコード:
def process_data(items): # 型がない
return sum(item['price'] for item in items)
問題:
- items が None で呼ばれたら、実行時エラー
- item に 'price' キーがなかったら、実行時エラー
確認ポイント:
□ 型注釈があるか
□ None チェックはあるか
□ mypy でエラーが出ないか
バグ2:エッジケース未対応
❌ AI が見落としやすいエッジケース:
def get_average(numbers):
return sum(numbers) / len(numbers)
問題:
- numbers が空の場合、ZeroDivisionError
- numbers に None が含まれる場合のハンドリング
確認ポイント:
□ 空の入力をテストしたか
□ None / 0 をテストしたか
□ 大規模データでテストしたか
□ 型が違う入力をテストしたか
バグ3:ループの初期化漏れ
❌ AI が生成しやすいコード:
def find_max(items):
max_value = items[0]
for item in items:
if item > max_value:
max_value = item
return max_value
問題:
- items が空の場合、IndexError
- 最初の要素より小さい値が全て見落とされる
バグ4:リソース管理漏れ
❌ AI が見落としやすい例:
def read_file(filename):
f = open(filename)
data = f.read()
return data
問題:
- ファイルが閉じられない
- メモリリークの原因
正しいパターン:
def read_file(filename):
with open(filename) as f:
return f.read()
バグ5:副作用のある修正
❌ AI が修正時に混入させやすい:
def process(data):
data.sort() # 元のリストを変更
return sum(data)
問題:
- 呼び出し元の data が変更される
- 予期しない動作
正しいパターン:
def process(data):
sorted_data = sorted(data)
return sum(sorted_data)
バグを検出するためのテスト項目
レベル1:単体テスト
□ 正常系をテスト
□ 空の入力をテスト
□ None をテスト
□ 型が違う入力をテスト
□ 大規模データをテスト
□ 境界値をテスト
レベル2:統合テスト
□ 複数の関数を組み合わせてテスト
□ 実際のデータで動作確認
□ パフォーマンスをテスト
□ 並行実行をテスト
レベル3:手動テスト
□ 実際のユースケースで動作確認
□ エラーメッセージが適切か
□ ログが出力されているか
□ 副作用がないか
実装例:バグ検出
例1:型チェック
❌ AI の出力:
def divide(a, b):
return a / b
✅ 改善後:
def divide(a: float, b: float) -> float:
if b == 0:
raise ValueError("divisor cannot be zero")
return a / b
テスト:
def test_divide():
assert divide(10, 2) == 5
assert divide(10, 4) == 2.5
with pytest.raises(ValueError):
divide(10, 0)
よくある確認漏れ
1. エッジケース
空、None、型違い、大規模データ
2. エラーハンドリング
例外処理、デフォルト値、ユーザーメッセージ
3. パフォーマンス
O(n^2) アルゴリズム、メモリリーク
4. 副作用
元のデータ変更、グローバル変数変更
5. ドキュメント
docstring、型注釈、使用例
まとめ
AI 生成コードのバグパターンと確認方法:
よくあるバグ:
- 型チェック漏れ
- エッジケース未対応
- ループの初期化漏れ
- リソース管理漏れ
- 副作用のある修正
確認方法:
- 型チェック(mypy)
- エッジケーステスト
- 実装レビュー
- パフォーマンステスト
Claude Codeでテストを増やしながら開発する流れと合わせることで、バグの少ない実装が実現します。