[英]What are __darwin_obsz() and __darwin_obsz0()?
在 MacOS 上,包括memcpy
、 memmove
、 memset
和其他函數在內的幾個函數都是這樣實現的,利用了一個神秘的__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.