我有一个构建,运行单元测试,内存泄漏等的makefile。但是有没有办法可以阻止malloc(),free(),calloc()等在源代码中使用?
我有替换内存函数来处理像mocking这样的事情。有没有办法可以强制使用EagleMemory_Free()代替free(),例如。
我的替换函数有不同的签名,所以我不能简单地创建一个宏指向内部的宏:
void* EagleMemory_Allocate(char *id, size_t size);
void EagleMemory_Free(void *ptr);
void** EagleMemory_MultiAllocate(char *id, size_t size, int quantity);
void EagleMemory_MultiFree(void **ptr, int quantity);
void EagleMemory_MockInit(void);
void EagleMemory_Mock(char *id);
void EagleMemory_MockFinish(void);
int EagleMemory_GetMockInvocations(void);
哦,我还应该指出我不想在运行时替换该函数并导致我的软件崩溃 - 这只是愚蠢的。我想在构建时或在软件运行之前通过其他脚本来捕获std函数的使用。
答案 0 :(得分:4)
感谢Alexey Frunze。 nm
命令正是我所需要的。我把它添加到我的makefile中:
NM = nm $(OBJS)/*.o -o 2>&1 | grep -v EagleMemory.o | grep -w '_malloc\|_calloc\|_free'
leaks: build_eagle_test
if [ `$(NM) | wc -l` -gt 0 ]; then \
echo "\n==> Do not use stdlib memory functions, use EagleMemory functions instead. <=="; \
$(NM); \
exit 1; \
fi
...
效果很好!
答案 1 :(得分:2)
部分解决方案是用以下内容编译所有内容:
-Dmalloc=@ERROR -Dfree=@ERROR
(可能同样适用于calloc
和realloc
)。这不会强制malloc
替换EagleMemory_Malloc
,但会导致对malloc
的任何调用无法编译。
(我选择了@ERROR
,因为它不能出现在合法的C来源中。)
请注意,malloc
和朋友可能仍会进行间接调用;例如,strdup()
调用malloc()
。 (strdup
不是由ISO C定义的,而是由POSIX定义的。)
答案 2 :(得分:0)
如何定义:
void *malloc(size_t size)
{
return EagleMemory_Malloc(size);
}
依旧......
编辑:
我给你这个全新版本的可变参数的力量,它可能是矫枉过正但你的“不同签名”应该是最好的!
#define malloc(...) EagleMemory_Malloc(__VA_ARGS__)
答案 3 :(得分:0)
使用宏:
#define free EagleMemory_Free