From d1dc6b528dabd1d4beefd8e81d76f3b05023aa30 Mon Sep 17 00:00:00 2001 From: Ted John Date: Thu, 30 Jun 2016 18:53:49 +0100 Subject: [PATCH] Add Memory::Copy overlap check and Memory::Move --- src/core/Memory.hpp | 20 ++++++++++++++++---- src/core/String.cpp | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/core/Memory.hpp b/src/core/Memory.hpp index 4cebdd192a..761bd6b801 100644 --- a/src/core/Memory.hpp +++ b/src/core/Memory.hpp @@ -16,10 +16,8 @@ #pragma once -extern "C" -{ - #include "../common.h" -} +#include "../common.h" +#include "Guard.hpp" /** * Utility methods for memory management. Typically helpers and wrappers around the C standard library. @@ -80,9 +78,23 @@ namespace Memory T * Copy(T * dst, const T * src, size_t size) { if (size == 0) return (T*)dst; +#ifdef DEBUG + uintptr_t srcBegin = (uintptr_t)src; + uintptr_t srcEnd = srcBegin + size; + uintptr_t dstBegin = (uintptr_t)dst; + uintptr_t dstEnd = dstBegin + size; + Guard::Assert(srcEnd <= dstBegin || srcBegin >= dstEnd, "Source overlaps destination, try using Memory::Move."); +#endif return (T*)memcpy((void*)dst, (const void*)src, size); } + template + T * Move(T * dst, const T * src, size_t size) + { + if (size == 0) return (T*)dst; + return (T*)memmove((void*)dst, (const void*)src, size); + } + template T * Duplicate(const T * src, size_t size) { diff --git a/src/core/String.cpp b/src/core/String.cpp index edc22e9b3b..aea62f553a 100644 --- a/src/core/String.cpp +++ b/src/core/String.cpp @@ -251,7 +251,7 @@ namespace String assert(newStringSize < currentStringSize); #endif - Memory::Copy(str, firstNonWhitespace, newStringSize); + Memory::Move(str, firstNonWhitespace, newStringSize); str[newStringSize] = '\0'; } else