Ticket #39736

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

Open Date: 2019-11-09 13:48 Last Update: 2019-11-09 17:43

Reporter:
Owner:
Type:
Status:
Closed
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

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

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

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

Ticket History (3/5 Histories)

2019-11-09 13:48 Updated by: yknk
  • New Ticket "Win版 x64デバッグ構成のときHow to viewダイアログで例外発生" created
2019-11-09 13:49 Updated by: yknk
Comment

原因

ダイアログに表示する画像を切り替えるとき、直前まで表示していた画像の メモリを開放するため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 Updated by: yknk
Comment

対策

MTHowToViewDlg::_Clear

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

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

2019-11-09 13:49 Updated by: yknk
Comment

リファクタリング

MTHowToViewDlg::_LoadHowToBmp

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

2019-11-09 17:43 Updated by: yknk
  • Status Update from Open to Closed
  • Resolution Update from None to Fixed

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login