バグの発生要因
思いつく物を順不同で書く。
経験不足
基本的にはまだ存在しないものを作ることが多いため、参考になるものが少ない。
未知 (元々誰も経験したことがない)
無知 (情報はあるが、それを知らない)
外部資料の記述ミス (情報が間違ってる)
伝達ミス
思い込み、勘違い
手順ミス
確認漏れ
忘れ、漏れ(=あるはずのものがない)
間違い(=あるが正しくない)
考慮不足、検討不足
要件の漏れ
要件の間違い
打ち間違い(typo, 勘違い)
引数などの順序の間違い
コピーペーストによるコードの流用時の変更忘れ。
タイミング系
競合
デッドロック
アルゴリズムのミス
考え方自体の間違い
特例条件の見逃し
エラートラップの漏れ
初期化忘れ
リソースリーク
解放忘れ
多重取得
多重解放
処理順序の間違い
計算ミス
計算式が違う
式の立て方が間違っている
typoによるもの
計算結果が違う(手計算で間違っている)
不正な計算
0除算
オーバーフロー
精度不足
アンダーフロー
仕様の理解不足、勘違い
インターフェース不一致
バージョンの食い違い
判定ミス
true と false の入れ違え
Off-by-one エラー
起点の間違い(0起点、1起点)
等号の有無の間違い (「< と <=」または「>と >=」)
番兵の有無の間違い
終端符号の有無の間違い(C言語では文字列の終端にNUL文字が必要。)
植木算エラー(100mの間に10mごとに支柱を立てる場合、何本立てなければならないか?)
件数の考慮不足
0件ケースの考慮不足
1件ケースの考慮不足
複数件ケースの考慮不足
バッファと件数の不一致(バッファオーバーフロー)
ループ脱出条件のミス
脱出忘れ
カウンタ計数忘れ(インクリメント、デクリメントを忘れている。あるいは意図せず飛ばした。)
性能不足
データの作成ミス
文字列の取り扱いの問題
空白の有無
後方空白の有無
空白文字による意図しない分割
切り出し位置の不正
分割不能文字列の分割
文字コード
文字コードの種別の食い違い
プログラミング言語の違いによる誤解
同じように書いても異なる動作をする
インターフェース不整合
思い違いによるインターフェース不整合
仕様変更によるインターフェース不整合