不要允许malloc()?

时间:2013-01-22 00:52:08

标签: c malloc

我有一个构建,运行单元测试,内存泄漏等的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函数的使用。

4 个答案:

答案 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

(可能同样适用于callocrealloc)。这不会强制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