メモリのオーバーフロー
次の様なコードで,実行時にエラー.
i_DIB DIB_FlipVertical (const i_DIB& dib_)
{
i_DIB dib = dib_ ;
if (dib_.GetWidth () == 0) { return dib ; }
if (dib_.GetHeight() == 0) { return dib ; }
u_32* bits = (u_32*)dib.GetP_Bits() ;
for ( int y=0 ; y<dib.GetHeight()/2 ; y++) {
for (int x=0 ; x<dib.GetWidth() ; x++) {
u_32 sPos = x+dib.GetWidth()*( y) ;
u_32 dPos = x+dib.GetWidth()*(dib.GetHeight()- y) ;
u_32 tmp = *(bits+(dPos)) ;
*(bits+(dPos)) = *(bits+(sPos)) ;
*(bits+(sPos)) = tmp ;
}
}
return dib ;
}
原因は最初の dPos が画像の範囲を超えていること.これはすぐにわかったが,
デバッガで追いかけてもこのループは何もなかったかの様に通り,この関数を抜ける時にエラーとなる.
たまたまと言うこともあると思うが,MFC の配列を使用していればアクセスした段階で ASSERT されるのでは?
i_dib_f.hxx