ポインタチェックのコーディングはif文 or ASSERT文?

[戻る]
ナオーバ 2002/07/15(月) 16:26:12
こんにちは
ポインタチェックのコーディングで質問なのですが、

  CUIntArray uiaPhotoNum;
  CViewerDoc* pDoc = (CViewerDoc *)GetDocument();
@if( pDoc ) {
    CMainFrame* pFrm = (CMainFrame *)this->GetTopLevelFrame();
A  if( pFrm ) {
      if( pFrm->GetTreeView()->GetPhotoNum( uiaPhotoNum ) ) {
        for( int i = 0; i < uiaPhotoNum.GetSize(); i++ ) {
          int nIndex = uiaPhotoNum.GetAt( i ) -1;
          CString szTitle = pDoc->GetPhotoData()->GetPhotoTitle( nIndex );
          wndList.InsertItem( i, szTitle );
        }
      }
    }
  }
CTreeViewのOnSelchangedで呼ばれる関数です。

ポインタチェックとして@、Aのif文を記述しました。
このような場合はif文なのかASSERT文なのかいつも悩みます

疑問
if文の場合
    何かのきっかけで通らなかった場合、期待した動作をしないのでどのようにすべきか
    
ASSERT文の場合
    リリースにした時にポインタチェックとして機能しないのでどのようにすべきか
    
この関数の場合CTreeViewのOnSelchangedで呼ばれる為、
pDoc、pFrmが無いってことは無いはずなのでポインタチェックをしなくて良いのか

環境
WIN2000 SP2
VC6.0   SP5
MFC使用

よろしくお願いします。

くたくた 2002/07/15(月) 17:33:26
>if文なのかASSERT文なのか
私なら@、Aとも assert系で検査します。
理由は、「まず絶対異常ポインタ値になる事は無い為」です。
異常ポインタ値になった時は、おそらくシステム全体が異常で再起動が必要な時だと思います。

メモリ確保失敗の検査はifで検査します。これはありえる為です。
但し、実行速度の足かせになるようなら(ループ最深部等)、assert()に切り替えます。
これもめったにお目にかかれない為、よしとしています。

>if文の場合何かのきっかけで通らなかった場合、どのようにすべきか
強制終了メッセージを表示して、すぐ終わるのがベストではないでしょうか。
自身のソフトからシステム全体を復旧させるのは不可能だと思うからです。
    
>ASSERT文の場合リリースにした時にどのようにすべきか
無視です。

医療機器や、軍事設備 等のソフトに対してこの対処法はまずいです。
が、ツール程度なら神経質になる必要はないと思いますよ。

ナオーバ 2002/07/16(火) 09:16:26
回答ありがとうございます
assert系で処理するようにします。

ついでなのですが、メモリ確保失敗って何のことでしょうか?
newするときのことでしょうか?

私はポインタチェックはポインタの無いアドレスにアクセスすると
落ちるから必要だと認識しています。

これとメモリ確保失敗って同じことなのでしょうか?


レベルアップの為によろしくお願いします。

くたくた 2002/07/16(火) 10:41:57
>メモリ確保失敗って何のことでしょうか?newするときのことでしょうか?
そうです。malloc()系の失敗という意味でそう書きました。

>ポインタチェックはポインタの無いアドレスにアクセスすると
>落ちるから必要だと認識しています。
必要ですね。「NULLか否か と 有効アドレス空間か否か」を検査すれば十分だと思います。
アサーションコードが単純にまとめられる範囲内であれば、
たくさん検査した方が楽になると思います。

>これとメモリ確保失敗って同じことなのでしょうか?
違う事ですね。但し、検査方法は同じです。

dairygoods 2002/07/16(火) 12:57:39
> ポインタチェックのコーディングはif文 or ASSERT文?

両方でも良いのではないでしょうか?
デバッグ時には、バグを検出できるようにし、
それでも、リリース時にバグが残ってしまったら、if文で回避すると。

ナオーバ 2002/07/16(火) 14:43:41
回答ありがとうございます

たいへん参考になりました。

マタ何かわからないことがあったときはよろしくお願いします。

古いスレッドには追加発言できません。