From 7c4f50c4fa2a78aa4cf60adc9258bd181c5b5d64 Mon Sep 17 00:00:00 2001 From: Andrea Odetti Date: Sun, 15 Oct 2017 18:19:40 +0100 Subject: [PATCH] Fix some problems reported by valgrind: 1) HDD is not a POD and so ZeroMemory does not replace a constructor 2) mismatch free / delete [] 3) no need to a shared_ptr, new, just use a vector Signed-off-by: Andrea Odetti --- source/Disk.cpp | 9 ++++----- source/Harddisk.cpp | 36 ++++++++++++++++++++++++++++++++++-- source/YamlHelper.cpp | 4 ++-- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/source/Disk.cpp b/source/Disk.cpp index 8c05d1ae..2caf0cb1 100644 --- a/source/Disk.cpp +++ b/source/Disk.cpp @@ -124,7 +124,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA void clear() { ZeroMemory(imagename, sizeof(imagename)); - ZeroMemory(fullname, sizeof(imagename)); + ZeroMemory(fullname, sizeof(fullname)); strFilenameInZip.clear(); imagehandle = NULL; bWriteProtected = false; @@ -1364,11 +1364,10 @@ static void DiskLoadSnapshotDriveUnit(YamlLoadHelper& yamlLoadHelper, UINT unit) g_aFloppyDisk[unit].trackimagedata = yamlLoadHelper.LoadUint(SS_YAML_KEY_TRACK_IMAGE_DATA); g_aFloppyDisk[unit].trackimagedirty = yamlLoadHelper.LoadUint(SS_YAML_KEY_TRACK_IMAGE_DIRTY); - std::shared_ptr pTrack( new BYTE [NIBBLES_PER_TRACK] ); - memset(pTrack.get(), 0, NIBBLES_PER_TRACK); + std::vector pTrack(NIBBLES_PER_TRACK); if (yamlLoadHelper.GetSubMap(SS_YAML_KEY_TRACK_IMAGE)) { - yamlLoadHelper.LoadMemory(pTrack.get(), NIBBLES_PER_TRACK); + yamlLoadHelper.LoadMemory(pTrack.data(), NIBBLES_PER_TRACK); yamlLoadHelper.PopMap(); } @@ -1384,7 +1383,7 @@ static void DiskLoadSnapshotDriveUnit(YamlLoadHelper& yamlLoadHelper, UINT unit) if (g_aFloppyDisk[unit].trackimage == NULL) bImageError = true; else - memcpy(g_aFloppyDisk[unit].trackimage, pTrack.get(), NIBBLES_PER_TRACK); + memcpy(g_aFloppyDisk[unit].trackimage, pTrack.data(), NIBBLES_PER_TRACK); } if (bImageError) diff --git a/source/Harddisk.cpp b/source/Harddisk.cpp index aebef116..eb0a681a 100644 --- a/source/Harddisk.cpp +++ b/source/Harddisk.cpp @@ -114,6 +114,38 @@ Overview struct HDD { + HDD() + { + clear(); + } + + ~HDD() + { + if (imagehandle) + ImageClose(imagehandle); + } + + void clear() + { + // This is not a POD (there is a std::string) + // ZeroMemory does not work + ZeroMemory(imagename, sizeof(imagename)); + ZeroMemory(fullname, sizeof(fullname)); + strFilenameInZip.clear(); + imagehandle = NULL; + bWriteProtected = false; + hd_error = 0; + hd_memblock = 0; + hd_diskblock = 0; + hd_buf_ptr = 0; + hd_imageloaded = 0; + ZeroMemory(hd_buf, sizeof(hd_buf)); +#if HD_LED + hd_status_next = Disk_Status_e(0); + hd_status_prev = Disk_Status_e(0); +#endif + } + // From Disk_t TCHAR imagename[ MAX_DISK_IMAGE_NAME + 1 ]; // (ie. no extension) [not used] TCHAR fullname[ MAX_DISK_FULL_NAME + 1 ]; // or @@ -143,7 +175,7 @@ static BYTE g_nHD_UnitNum = HARDDISK_1<<7; // b7=unit // . ProDOS will write to Command before switching drives static BYTE g_nHD_Command; -static HDD g_HardDisk[NUM_HARDDISKS] = {0}; +static std::vector g_HardDisk(NUM_HARDDISKS); static bool g_bSaveDiskImage = true; // Save the DiskImage name to Registry static UINT g_uSlot = 7; @@ -797,7 +829,7 @@ bool HD_LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT slot, UINT version, co for (UINT i=0; i