1

ビルド、単体テストの実行、メモリリークなどのmakefileがありますが、malloc()、free()、calloc()などがソースコードで使用されないようにする方法はありますか?

私は、モックのようなものを処理する交換用メモリ機能を持っています。たとえば、free()の代わりにEagleMemory_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

AlexeyFrunzeに感謝します。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

(そしておそらく同様にcallocrealloc)。mallocこれにより、による置換が強制さEagleMemory_Mallocれることはありませんが、呼び出しがmallocコンパイルに失敗する原因になります。

@ERROR合法的なCソースでは発生しないため、選択しました。)

友人への間接的な電話がまだある可能性があることに注意してください。mallocたとえば、をstrdup() 呼び出しますmalloc()。(strdupISO 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 に答える