[英]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函數的定義進行了更深入的研究,得到了上面的內容。
(__darwin_obsz0 (dest) != (size_t) -1)
什么意思? 我的意思是size_t
只是像int
這樣的類型。 (size_t) -1
?
__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.