バッファが「malloc」によって割り当てられたかどうかを識別する方法はありますか?次のシグネチャを持つ関数のように:
bool is_malloced(void *buf);
そのようなメカニズムはposixに存在しますか?
いいえ。C11もPOSIXもそのようなメカニズムを提供していません。
うーん、あなたが真面目な人なら、あなたは実際に次のことができます:
Hash *hsh; /* global hash already initialized. */
void *custom_malloc(size_t size)
{
void *ptr;
ptr = malloc(size);
hash_add(hsh, ptr);
return ptr;
}
/* tester */
_Bool malloced(void *ptr)
{
if(hash_retrieve(hsh, ptr))
return TRUE;
return FALSE;
}
もちろん、そのようなことをすることは狂気です、しかし確かにあなたはそうすることができます。
malloc()
このような機能をエミュレートする簡単な方法の1つは、次のようなカスタム関数をラップすることです。
ポインタが与えられるとmalloc
、魔法の数を探すことによって、それが'edであるかどうかを確認できます。
もちろん、それは完璧ではありません。
free()
呼び出しでnullに設定すると役立つ場合があります。ポインタなどとXORすることで、信頼性を高めることもできます。それでも、それはヒューリスティックです。すべての欠点がありますが、それでも便利な手法です。組み込みシステムのメモリ破損をデバッグするときに、これを数回使用しました。
ラッパーに置き換えようmalloc()
としている場合は、割り当てられたブロックのリンクリストを作成することもできます。はるかに信頼性が高くなりますが、より複雑にもなります。