防衛的プログラミング
誤った使用方法を常に検出してエラー処理を行うプログラミングのこと。
これを行うには、通常のプログラミングの何倍もの労力を必要とする。
防衛的プログラミングのポイント
可能な入力の全体
正しい入力
正しく処理する
誤った入力
誤りとして処理する
想定していない入力
どうなるか不明
想定していない入力を最小にする
処理の例
正しい入力
正しく処理する
それ以外
誤りとして処理する
処理の例(間違い)
誤った入力
誤りとして処理する
それ以外
正しい入力として処理する
想定していない入力が、正しい入力として処理される
どうなるか不明
プログラミングテクニックによる信頼性向上(プログラム中に十分なチェック文を挿入)
スタックサイズを超えた時の処置
ファイルの扱いでのエラーチェックとエラー時の処置
メモリ確保でのエラーのチェック、後処理での確保されたメモリ領域の開放
手続きの入り口でのパラメータ値のチェック
手続き呼出し後の戻り値のチェック
システム設計での冗長処理追加による信頼性向上
一方のファイルがおかしくなっても、もう一方のファイルでリカバー
誤り発生時に、元の状態に復帰できるよう、必要な中間状態を覚える(チェックポイントリスタート)
誤りやすいコードの一覧
初期値の設定漏れ
出力パラメータの値の設定漏れ(モジュールの途中脱出時)
データが空のときの処理漏れ
0回の繰返し処理の誤り
繰返し終了条件の1回違い
配列のサイズの設定ミス(1つ少ない)
浮動小数演算での比較の誤り
論理和や論理積や否定が複雑に入り込んだときの論理誤り
手続き呼出しでのパラメータ属性の誤り
n次元配列の各次元のとらえ違い
ポインタでの、*(内容)や&(アドレス)のつけ間違い(C言語の場合)
途中脱出での後処理(メモリ開放等)の漏れ