簡體   English   中英

什么是 __darwin_obsz() 和 __darwin_obsz0()?

[英]What are __darwin_obsz() and __darwin_obsz0()?

在 MacOS 上,包括memcpymemmovememset和其他函數在內的幾個函數都是這樣實現的,利用了一個神秘的__darwin_obsz0() function:

#if __has_builtin(__builtin___memcpy_chk) || defined(__GNUC__)
#undef memcpy
#define memcpy(dest, src, len)                  \
  __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest))
#endif

#if __has_builtin(__builtin___memmove_chk) || defined(__GNUC__)
#undef memmove
#define memmove(dest, src, len)                 \
  __builtin___memmove_chk (dest, src, len, __darwin_obsz0 (dest))
#endif

#if __has_builtin(__builtin___memset_chk) || defined(__GNUC__)
#undef memset
#define memset(dest, val, len)                  \
  __builtin___memset_chk (dest, val, len, __darwin_obsz0 (dest))
#endif

同樣, strcpy使用神秘的__darwin_obsz function:

#if __has_builtin(__builtin___strcpy_chk) || defined(__GNUC__)
#undef strcpy
#define strcpy(dest, src)                   \
  __builtin___strcpy_chk (dest, src, __darwin_obsz (dest))
#endif

這些(宏?)函數是什么?它們有什么作用? 我找不到關於它們的任何文檔。

在我看來,它們是簡單的宏,可擴展為編譯器內置函數以在編譯時計算 object 的大小。 來自 Apple Open Source 的這個文件include/secure/_common.h有他們的定義:

#define __darwin_obsz0(object) __builtin_object_size (object, 0)
#define __darwin_obsz(object) __builtin_object_size (object, _USE_FORTIFY_LEVEL > 1 ? 1 : 0)

__builtin_object_size應該在 Clang 和 GCC 之間相等。GCC 文檔在此頁面中對其進行了描述。

這些大小作為最后一個參數傳遞給常見的 memory 復制函數(例如memcpy()strcpy()*_chk()替代方案,據推測是為了使代碼更安全,試圖避免 memory 在大小錯誤的情況下損壞由用戶傳遞,因為目標 object 大小由這些函數檢查。

暫無
暫無

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

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