提交 189085d0 编写于 作者: J jsalling

Check for writes to guard space on malloc'd buffers in Fixture

 There was already some space reserved as a guard, added check for writes
 before the beginning of the buffer. Did not change the 'overrun' message.
 Underrun buffer writes are likely to be a more rare case.
上级 7943c766
...@@ -166,7 +166,7 @@ static unsigned int heap_index; ...@@ -166,7 +166,7 @@ static unsigned int heap_index;
typedef struct GuardBytes typedef struct GuardBytes
{ {
size_t size; size_t size;
char guard_space[4]; size_t guard_space;
} Guard; } Guard;
...@@ -202,6 +202,7 @@ void* unity_malloc(size_t size) ...@@ -202,6 +202,7 @@ void* unity_malloc(size_t size)
if (guard == NULL) return NULL; if (guard == NULL) return NULL;
malloc_count++; malloc_count++;
guard->size = size; guard->size = size;
guard->guard_space = 0;
mem = (char*)&(guard[1]); mem = (char*)&(guard[1]);
memcpy(&mem[size], end, sizeof(end)); memcpy(&mem[size], end, sizeof(end));
...@@ -214,7 +215,7 @@ static int isOverrun(void* mem) ...@@ -214,7 +215,7 @@ static int isOverrun(void* mem)
char* memAsChar = (char*)mem; char* memAsChar = (char*)mem;
guard--; 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) static void release_memory(void* mem)
......
...@@ -381,6 +381,47 @@ TEST(LeakDetection, BufferOverrunFoundDuringRealloc) ...@@ -381,6 +381,47 @@ TEST(LeakDetection, BufferOverrunFoundDuringRealloc)
#endif #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_GROUP(InternalMalloc);
TEST_SETUP(InternalMalloc) { } TEST_SETUP(InternalMalloc) { }
......
...@@ -40,6 +40,8 @@ TEST_GROUP_RUNNER(LeakDetection) ...@@ -40,6 +40,8 @@ TEST_GROUP_RUNNER(LeakDetection)
RUN_TEST_CASE(LeakDetection, DetectsLeak); RUN_TEST_CASE(LeakDetection, DetectsLeak);
RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringFree); RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringFree);
RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringRealloc); RUN_TEST_CASE(LeakDetection, BufferOverrunFoundDuringRealloc);
RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringFree);
RUN_TEST_CASE(LeakDetection, BufferGuardWriteFoundDuringRealloc);
} }
TEST_GROUP_RUNNER(InternalMalloc) TEST_GROUP_RUNNER(InternalMalloc)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册