4

バッファが「malloc」によって割り当てられたかどうかを識別する方法はありますか?次のシグネチャを持つ関数のように:

bool is_malloced(void *buf);

そのようなメカニズムはposixに存在しますか?

4

3 に答える 3

2

いいえ。C11もPOSIXもそのようなメカニズムを提供していません。

于 2012-10-23T20:21:01.927 に答える
1

うーん、あなたが真面目な人なら、あなたは実際に次のことができます:

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;
}

もちろん、そのようなことをすることは狂気です、しかし確かにあなたはそうすることができます。

于 2012-10-23T20:28:43.623 に答える
0

malloc()このような機能をエミュレートする簡単な方法の1つは、次のようなカスタム関数をラップすることです。

  • たとえば4バイト大きいバッファを割り当てます
  • 割り当てられたブロックの先頭にマジックナンバー(32ビット)を格納します
  • ポインタを呼び出し元に返す前に、ポインタを4バイトインクリメントします

ポインタが与えられるとmalloc、魔法の数を探すことによって、それが'edであるかどうかを確認できます。

もちろん、それは完璧ではありません。

  • 魔法の数は偶然そこにある可能性があります。ラップされたfree()呼び出しでnullに設定すると役立つ場合があります。ポインタなどとXORすることで、信頼性を高めることもできます。それでも、それはヒューリスティックです。
  • メモリ保護を備えたアーキテクチャでは、mallocされていないポインタをチェックするときにページフォールトをトリガーできます。

すべての欠点がありますが、それでも便利な手法です。組み込みシステムのメモリ破損をデバッグするときに、これを数回使用しました。

ラッパーに置き換えようmalloc()としている場合は、割り当てられたブロックのリンクリストを作成することもできます。はるかに信頼性が高くなりますが、より複雑にもなります。

于 2012-10-23T22:11:23.413 に答える