systemdのコードにはalloc_size
属性を使う_alloc_
マクロがある。
src/shared/macro.h
# define _alloc_(...) __attribute__ ((alloc_size(__VA_ARGS__)))
alloc_size
属性は、GCCのドキュメントによると、__builtin_object_size
の精度を上げるためものとある。
__builtin_object_size
はObject Size Checking - Using the GNU Compiler Collection (GCC)に詳しい説明がある。ポインタが指すオブジェクトのサイズを返すビルドイン関数らしい。このオブジェクトサイズの情報は、memcpy(3)などの標準ライブラリ関数の特殊なバージョン(__builtin___memcpy_chk
という名前)で使われる。memcpy(3)の場合だと、コンパイル時にバッファオーバーフローを検出してくれるらしい。
この*_chk関数は様々なものがあるらしいく、手元のFedora 19で調べてみると以下のようなものがあった。バッファを操作する関数が多いが、longjmp(3)やpoll(2)向けのものもある。
$ strings /usr/lib/* |grep _chk |sort -u
__asprintf_chk
__chk_fail
__confstr_chk
__dprintf_chk
__fdelt_chk
__fgets_chk
__fgets_unlocked_chk
__fgetws_chk
__fgetws_unlocked_chk
__fprintf_chk
__fread_chk
__fread_unlocked_chk
__fwprintf_chk
__getcwd_chk
__getdomainname_chk
__getgroups_chk
__gethostname_chk
__getlogin_r_chk
__gets_chk
__getwd_chk
__longjmp_chk
__mbsnrtowcs_chk
__mbsrtowcs_chk
__mbstowcs_chk
__memcpy_chk
__memcpy_chk_ia32
__memcpy_chk_ssse3
__memcpy_chk_ssse3_rep
__memmove_chk
__memmove_chk_ia32
__memmove_chk_ssse3
__memmove_chk_ssse3_rep
__mempcpy_chk
__mempcpy_chk_ia32
__mempcpy_chk_ssse3
__mempcpy_chk_ssse3_rep
__memset_chk
__memset_chk_ia32
__memset_chk_sse2
__memset_chk_sse2_rep
__obstack_printf_chk
__obstack_vprintf_chk
__poll_chk
__ppoll_chk
__pread64_chk
__pread_chk
__printf_chk
__ptsname_r_chk
__read_chk
__readlinkat_chk
__readlink_chk
__realpath_chk
__recv_chk
__recvfrom_chk
__snprintf_chk
__sprintf_chk
__stack_chk_fail
__stack_chk_fail_local
stack_chk_fail_local.oS/
__stpcpy_chk
__stpncpy_chk
__strcat_chk
__strcpy_chk
__strncat_chk
__strncpy_chk
__swprintf_chk
__syslog_chk
__ttyname_r_chk
__vasprintf_chk
__vdprintf_chk
__vfprintf_chk
__vfwprintf_chk
__vprintf_chk
__vsnprintf_chk
__vsprintf_chk
__vswprintf_chk
__vsyslog_chk
__vwprintf_chk
__wcpcpy_chk
__wcpncpy_chk
__wcrtomb_chk
__wcscat_chk
__wcscpy_chk
__wcsncat_chk
__wcsncpy_chk
__wcsnrtombs_chk
__wcsrtombs_chk
__wcstombs_chk
__wctomb_chk
__wmemcpy_chk
__wmemmove_chk
__wmempcpy_chk
__wmemset_chk
__wprintf_chk