私は、引数のNULLチェックをあまりやらない方だ。
NULLにする場合がある(NULLだったらこう動く)という場合には調べるが、与えられたポインタがNULLだったらエラー、みたいな処理は、あまり書きたくない。
そうは思いつつも、やはり、悩む。
たまに、NULLチェックしさえすればすぐに不具合の場所がわかったのに、ということが起きるからだ。
OSがある場合には、比較的見つかりやすいと思うのだが、OSが無い場合だと、なかなか見つけにくい。
NULLはだいたい(void*)0みたいな定義になってると思うが、アドレス0はベクタテーブルが配置されていることが多く、単に書き込めなないアドレスに書き込んだというだけでスルーされてしまうからだ。
私がNULLチェックしない理由は簡単で、それはコーディングのバグであることがほとんどだからだ。
コーディングのバグをチェックして、エラーを返したとしよう。
それで、エラーの処理を正しく行って、アプリが生き続けたとして、それに何の意味があるのだろうか。
いっそのこと、アプリが異常な動作をしてくれた方が助かるではないか。
だから、チェックしたい場合は、assert()を使うことが多い。
それだと、NDEBUGしてなければ即座にabortするし、NDEBUGしたらコードとして残らない。
そういう経路は、デバッグで潰してしまえ、というわけだ。
もしチェックできないままだった場合、NDEBUGするとスルーして動くだろう。
それ以降の動作は、どうなるか想像できない。
もしエラーチェックしていれば、少なくとも想定した動作にはなるだろう。
だったら・・・エラーチェックした方が、まだ動作の推測ができる分、ましなのか???
そんなことを悩みながら、日々生きております。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。