1

Mac OS X の では/usr/include/secure/_string.h、次の定義を見つけることができます。

#define memset(dest, val, len)                  \
  ((__darwin_obsz0 (dest) != (size_t) -1)               \
   ? __builtin___memset_chk (dest, val, len, __darwin_obsz0 (dest)) \
   : __inline_memset_chk (dest, val, len))

static __inline void *
__inline_memset_chk (void *__dest, int __val, size_t __len)
{
  return __builtin___memset_chk (__dest, __val, __len, __darwin_obsz0(__dest));
}

memset 関数の定義をさらに掘り下げたところ、上記の結果が得られました。

  1. とはどういう意味(__darwin_obsz0 (dest) != (size_t) -1)ですか? つまりsize_t、のようなタイプですint(size_t) -1?

  2. これは何__builtin___memset_chkですか?それってマクロ?それはどのように定義されていますか?

4

2 に答える 2

2

最良の引用ではありませんが、これによると、オブジェクトのサイズ ( __builtin_object_size ) を決定するこのgcc__darwin_obsz0組み込み関数の #define であるようです。

この場合、コードはバッファ オーバーランを防止しようとしています。memset は、指定されたオブジェクトのサイズを正確に判断できるかどうかを確認し、そのサイズをより安全な memset 操作に渡します。それ以外の場合、安全性の低い memset が使用され、ユーザーが渡した長さが信頼されます。

(ビルトインまたは組み込み関数は、特定のライブラリに由来しない小さな関数であり、マクロではありません。コンパイラは、特別な魔法を実行するためにそれらを提供します。特定のアセンブリ命令のエイリアスである場合もあります。)

于 2013-09-12T02:01:07.597 に答える