簡體   English   中英

Mac OS X上C中memset函數的宏定義

[英]Macro definition for memset function in C on Mac OS X

在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什么? 那是一個宏嗎? 如何定義?

不是最好的引用,但是據此看來__darwin_obsz0是此gcc內置函數的#define,它確定對象的大小( __builtin_object_size )。

在這種情況下,代碼試圖防止緩沖區溢出。 memset試圖查看它是否可以准確確定指向對象的大小,然后將該大小傳遞給更安全的memset操作。 否則,使用不太安全的內存集,並信任用戶傳遞的長度。

(構造函數或內在函數是不是來自任何特定庫且不是宏的小函數。編譯器提供它們做一些特殊的魔術,有時它們是特定匯編指令的別名。)

1)通常, size_t將是一個unsigned int ,因此(size_t) -1是獲得最大的unsigned int值的便捷方法。 記住這里的(size_t)是演員表。 我不太確定那張支票的LHS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM