[前へ]   [目次へ]   [次へ]

エラーと警告(5)(C/C++)


今回はエラーを受け取った時の処理についてです。
当然エラーを探知した時にその全てを復旧させてプログラムを正常に続行できれば一番いいのですが、
残念ながらそのようなプログラムは実際にはほぼ不可能です。

エラーには状況によって復旧が容易なものもあれば困難なものもあります。
また、実行に必要なファイルが存在しないなど、プログラム上からでは復旧不可能なものや、
管理情報の崩壊など、下手に動かさずに強制終了したほうがいい状況なども存在します。

どの程度のエラーまで復旧させるかはプログラムの種類、要求安定性、方針などによってかなり変わってきます。
よって必ずこうすればいいというようなものはない
ので、
私が作る時の標準方針で書いていきます。

・・・とはいうものの、私は基本的にエラー復旧などあまり考えていません。
再試行でなんとかなりそうなら復旧を試行する場合もありますが、
基本的には中止、終了を指示してしまいます。

エラーの復旧というものは面倒です。
通常の使用時に滅多に発生しないようなエラーの復旧に労力を費やしたくないというか、
そんなエラー発生時はさっさと自身を終了して通常使用時の性能を上げる方に労力を割きたいというのが私の考えです。

とはいえ通常時に頻発するようなタイプのエラーでいちいちプログラムが落ちていては使い物にならないので、
最終的には「発生頻度が高いエラー」を中心に復旧処置をとるようにしています。


エラーの復旧方法にもいろいろな方法がありますが、
プログラムの状態を発生時以前に巻き戻したり、
発生箇所を無視して、そもそもそれ自体がなかったものとして扱うなどの方法が比較的容易な方法と言えるでしょう。
(もちろん、コードの書き方によってはこれらの手法も難しくなるケースもあり、
  エラーの種類によっては無視が不可能な場合もあります)

細かい方法については後々書いていくことにします。


ちなみに冒頭の「管理情報の崩壊」というのは、メモリ保護がかかった言語では通常起こらないのですが、
メモリ保護のないC/C++等の言語では比較的容易に発生させることができます。

これはプログラム自体の管理情報で、プログラムを書く側からは気にする必要はないのですが、
結構ローカル変数の近くにあるので、破壊するのは簡単だったりします。
壊れると大抵は実行コードではないエリアを実行しようとして強制終了されます。
これはいわゆる「バッファオーバーラン」とか「バッファオーバーフロー」という現象の結果として発生することがあります。

脆弱性情報などにしばしば出現するのは、
この現象で管理情報を任意の実行コードを実行するように書き換えてしまえる場合があるということです。

確保しているメモリサイズをしっかり確認していれば発生しないのですが、
確認を怠ったり、間違えたりして確認をすり抜けると問題になることがあります。

また、「バッファオーバーラン」や「バッファオーバーフロー」は管理情報の破壊に至らなかったとしても、
非常に厄介な現象を起こすので、ソースを読んでも分からない時はこれも疑った方がいいでしょう。
(具体的にはソース中に表記してもいない変数の値が化けたりします。しかも、いつ化けたか分かりにくいので追跡が面倒です)
これについては近々詳しく書く予定です。

ネットワークとの通信部分でミスをすると外部からの攻撃が可能になるので、
通信部分等は特に慎重に記述する必要があります。


さて、長々と続いた「エラーと警告」も今回で一応最後の予定です。
いつまでも事項の解説ばかりなのもつまらないので次回からは簡単なプログラムを組みながら解説していこうと思います。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17