ホップ・ステップ・εミ(ο_ _)ο ドテッ

プログラミングの風景をちょいとぶつぶつ書きつづってみようというテスト

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  98  : 記事  1  : コメント  1221  : トラックバック  9

ニュース

ゆーち

Y.Uchiyama

 福岡県在住
 株式会社シーソフト
 代表取締役
 現役職人です(`^´)
 主にC++を使ってます
リアルマイミク募集中w
 (・∀・)Mixi
フォローよろしくw
 (・∀・)Twitter

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

こんなコードばっかりあるわけですよ。

int Foo( SomeClass *Src_ ){
  int value;
  if( Src_ != NULL ){
    value = Src_->Value;
  }else{
    value = -1;
  }
  return value;
}

Src_ が NULL かどうかはチェックできてるけど、妙な値だったりするとアウトですよね。
そこでこんな風に書いてみた。

int Foo( SomeClass *Src_ ){
  int value;
  SomeClass *src = dynamic_cast<SomeClass *>( Src_ );
  if( src != NULL ){
    value = src->Value;
  }else{
    value = -1;
  }
  return value;
}

こうすると、もうちょっとましなチェックができることになるのかな?

#もちろん RTTI 有効でコンパイルっての前提です。
投稿日時 : 2010年6月11日 10:49

コメント

# re: 【C++】dynamic_cast でポインタの安全性を確認できる? 2010/06/11 11:58 とっちゃん
int test;
Foo( reinterpret_cast<SomeClass*>( &test ) );
VS2010 では dynamic_cast<> は != NULL を返しました。

RTTIはもちろん有効です。異なる型でのチェックではないので何もしない気がします。
言語仕様としてどうなのか?はわかりません。


# re: 【C++】dynamic_cast でポインタの安全性を確認できる? 2010/06/11 12:33 あんどちん
関数が
int Foo( SomeClass *Src_ )
である以上とっちゃんが出したような強引なキャストをした場合以外引数はSomeClassもしくはそれの派生クラスのインスタンスへのポインタであるはずです。
# 呼び出し側でチェックされるため
従ってdynamic_castは常に正常な値を返すことになると思います。
あと、SomeClass*からSomeClass*へのキャストだと最適化でdynamic_castが消えてしまうんじゃないかと。
gcc 4.4.3 -O3
だと消えているようでした。

# 仮想関数を持ったクラスでないとRTTIは使えませんね。そこがちょっと…


# re: 【C++】dynamic_cast でポインタの安全性を確認できる? 2010/06/11 12:46 ゆーち
>とっちゃんさん
すげぇ。そこまでテストしませんでしたw

>あんどちんさん
たいていのクラスに virtual なデストラクタがあるもんw
呼び出し側でのチェックはコンパイル時点ですよね。
dynamic_cast<> って、動的に検証してくれるはずだから、たとえば delete 後のポインタを渡された場合とかに使えないのかなぁ?

# re: 【C++】dynamic_cast でポインタの安全性を確認できる? 2010/06/11 13:24 あんどちん
> delete 後のポインタを渡された場合とかに使えないのかなぁ?
deleteされた領域をアクセスすることになるので、何が起こるかわかりませんね。

運良くアクセスできたとして、メモリイメージがdelete前と同じであればdynamic_castは成功することになると思います。また、もしアクセス出来てメモリイメージが破壊されていればとっちゃんが出した例と同じことになると思います。


# re: 【C++】dynamic_cast でポインタの安全性を確認できる? 2010/06/11 21:49 ゆーち
>あんどちんさん
なるほど。それもそうですね。
結局アクセス違反は回避できないのか・・・


Post Feedback

タイトル
名前
Url:
コメント