1

我有一个生成文件,可以构建、运行单元测试、内存泄漏等。但是有没有办法可以阻止 malloc()、free()、calloc() 等在源代码中使用?

我有替换内存函数来处理诸如模拟之类的事情。例如,有没有办法可以强制使用 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

4 回答 4

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

    ...

效果很好!

于 2013-01-22T01:44:27.610 回答
2

部分解决方案是编译所有内容:

 -Dmalloc=@ERROR -Dfree=@ERROR

(可能同样适用于callocand realloc)。这不会强制替换mallocby EagleMemory_Malloc,但会导致任何调用malloc无法编译。

(我之所以选择@ERROR它是因为它不会出现在合法的 C 源代码中。)

请注意,可能仍有间接呼叫malloc和朋友;例如,strdup() 调用malloc(). (strdup不是由 ISO C 定义的,而是由 POSIX 定义的。)

于 2013-01-22T01:08:05.987 回答
0

怎么定义:

void *malloc(size_t size)
{ 
    return EagleMemory_Malloc(size);
}

等等...

编辑 :

我用这个全新的版本给你可变参数的力量,它可能有点矫枉过正,但你的“不同的签名”值得最好的!

#define malloc(...) EagleMemory_Malloc(__VA_ARGS__)
于 2013-01-22T00:54:51.290 回答
0

使用宏:

#define free EagleMemory_Free
于 2013-01-22T00:55:15.267 回答