diff --git a/extras/fixture/src/unity_fixture.c b/extras/fixture/src/unity_fixture.c index c8275f4..b20657d 100644 --- a/extras/fixture/src/unity_fixture.c +++ b/extras/fixture/src/unity_fixture.c @@ -166,7 +166,7 @@ static unsigned int heap_index; typedef struct GuardBytes { size_t size; - char guard_space[4]; + size_t guard_space; } Guard; @@ -202,6 +202,7 @@ void* unity_malloc(size_t size) if (guard == NULL) return NULL; malloc_count++; guard->size = size; + guard->guard_space = 0; mem = (char*)&(guard[1]); memcpy(&mem[size], end, sizeof(end)); @@ -214,7 +215,7 @@ static int isOverrun(void* mem) char* memAsChar = (char*)mem; guard--; - return strcmp(&memAsChar[guard->size], end) != 0; + return guard->guard_space != 0 || strcmp(&memAsChar[guard->size], end) != 0; } static void release_memory(void* mem) diff --git a/extras/fixture/test/unity_fixture_Test.c b/extras/fixture/test/unity_fixture_Test.c index 9ca3bfd..f1df378 100644 --- a/extras/fixture/test/unity_fixture_Test.c +++ b/extras/fixture/test/unity_fixture_Test.c @@ -381,6 +381,47 @@ TEST(LeakDetection, BufferOverrunFoundDuringRealloc) #endif } +TEST(LeakDetection, BufferGuardWriteFoundDuringFree) +{ +#ifndef USING_OUTPUT_SPY + UNITY_PRINT_EOL(); + TEST_IGNORE(); +#else + void* m = malloc(10); + TEST_ASSERT_NOT_NULL(m); + char* s = (char*)m; + s[-1] = (char)0x00; // Will not detect 0 + s[-2] = (char)0x01; + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + free(m); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during free()")); +#endif +} + +TEST(LeakDetection, BufferGuardWriteFoundDuringRealloc) +{ +#ifndef USING_OUTPUT_SPY + UNITY_PRINT_EOL(); + TEST_IGNORE(); +#else + void* m = malloc(10); + TEST_ASSERT_NOT_NULL(m); + char* s = (char*)m; + s[-1] = (char)0x0A; + UnityOutputCharSpy_Enable(1); + EXPECT_ABORT_BEGIN + m = realloc(m, 100); + EXPECT_ABORT_END + UnityOutputCharSpy_Enable(0); + Unity.CurrentTestFailed = 0; + CHECK(strstr(UnityOutputCharSpy_Get(), "Buffer overrun detected during realloc()")); +#endif +} + TEST_GROUP(InternalMalloc); TEST_SETUP(InternalMalloc) { } diff --git a/extras/fixture/test/unity_fixture_TestRunner.c b/extras/fixture/test/unity_fixture_TestRunner.c index 4f5eefc..bc0bf5a 100644 --- a/extras/fixture/test/unity_fixture_TestRunner.c +++ b/extras/fixture/test/unity_fixture_TestRunner.c @@ -40,6 +40,8 @@ TEST_GROUP_RUNNER(LeakDetection) RUN_TEST_CASE(LeakDetection, DetectsLeak); RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringFree); RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringRealloc); + RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringFree); + RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringRealloc); } TEST_GROUP_RUNNER(InternalMalloc)