OSDN Ticket Archive


Ticket #39736

Win版 x64デバッグ構成のときHow to viewダイアログで例外発生

登録: 2019-11-09 13:48 最終更新: 2019-11-09 17:43

報告者:
yknk
担当者:
yknk
チケットの種類:
バグ
状況:
完了
コンポーネント:
MIDITrail Ver.1.3.x for Windows
マイルストーン:
Version 1.3.1 for Windows (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

x64デバッグ構成でMIDITrailをビルドして起動し、How to viewダイアログを表示すると、 Nextボタンを押したときに例外が発生する。

例外はMTHowToViewDlg::_ClearでGlobalFree呼び出し時に発生している。

	if (m_hMemBmpPixel != NULL) {
		GlobalUnlock(m_hMemBmpPixel);
		GlobalFree(m_hMemBmpPixel); ←この処理で例外発生
		m_hMemBmpPixel = NULL;
	}

チケットの履歴

2019-11-09 13:48 更新者: yknk
  • 新しいチケット "Win版 x64デバッグ構成のときHow to viewダイアログで例外発生" が作成されました
2019-11-09 13:49 更新者: yknk
コメント

原因

ダイアログに表示する画像を切り替えるとき、直前まで表示していた画像の メモリを開放するためGlobalFreeを実行している。

この処理の直前で、メンバ変数m_BmpInfoの構造体をゼロクリアしていたが、 m_BmpInfoはBITMAPINFOHEADER構造体であるにも関わらず、それよりもサイズが 大きいBITMAPINFO構造体のサイズでゼロクリアしていた。

構造体のサイズを超えてゼロクリアしていたため、メモリ破壊を引き起こしていた。 これにより直後のGlobalFreeで例外が発生した。

void MTHowToViewDlg::_Clear()
{
	ZeroMemory(&m_BmpHead, sizeof(BITMAPFILEHEADER));
	ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFO)); ←この処理でメモリ破壊発生

	if (m_hMemBmpPixel != NULL) {
		GlobalUnlock(m_hMemBmpPixel);
		GlobalFree(m_hMemBmpPixel); ←この処理で例外発生
		m_hMemBmpPixel = NULL;
	}
(以下略)
2019-11-09 13:49 更新者: yknk
コメント

対策

MTHowToViewDlg::_Clear

適正なサイズでメンバ変数の構造体をゼロクリアする。

変更前:ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFO));
変更後:ZeroMemory(&m_BmpInfo, sizeof(BITMAPINFOHEADER));

2019-11-09 13:49 更新者: yknk
コメント

リファクタリング

MTHowToViewDlg::_LoadHowToBmp

コメントを改善する。 BMPピクセルデータ読み込み処理において、ファイル読み取りサイズに 画像ファイルサイズではなく、BMPピクセルデータのサイズを指定する。

2019-11-09 17:43 更新者: yknk
  • 解決法なし から 修正済み に更新されました
  • 状況オープン から 完了 に更新されました

添付ファイルリスト

添付ファイルはありません