6.56 Функции проверки границ указателей, встроенные в GCC
GCC предоставляет набор встроенных функций для управления инструментированием проверки границ указателей. Обратите внимание, что все встроенные функции проверки границ указателей могут быть использованы, даже если вы компилируете с выключенной проверкой границ указателей (-fno-check-pointer-bounds). Поведение может отличаться в таком случае, как описано ниже.
- Встроенная функция: void * __builtin___bnd_set_ptr_bounds (const void *q, size_t size)
-
Эта встроенная функция возвращает новый указатель со значением q и связывает его с границами [q, q+size-1]. При выключенной проверке границ указателей встроенная функция просто возвращает первый аргумент.
extern void *__wrap_malloc (size_t n) { void *p = (void *)__real_malloc (n); if (!p) return __builtin___bnd_null_ptr_bounds (p); return __builtin___bnd_set_ptr_bounds (p, n); }
- Встроенная функция: void * __builtin___bnd_narrow_ptr_bounds (const void *p, const void *q, size_t size)
-
Эта встроенная функция возвращает новый указатель со значением p и связывает его с суженными границами, образованными пересечением границ, связанных с q, и границами [p, p + size - 1]. При выключенной проверке границ указателей встроенная функция просто возвращает первый аргумент.
void init_objects (object *objs, size_t size) { size_t i; /* Initialize objects one-by-one passing pointers with bounds of an object, not the full array of objects. */ for (i = 0; i < size; i++) init_object (__builtin___bnd_narrow_ptr_bounds (objs + i, objs, sizeof(object))); }
- Встроенная функция: void * __builtin___bnd_copy_ptr_bounds (const void *q, const void *r)
-
Эта встроенная функция возвращает новый указатель со значением q и связывает его с границами, уже связанными с указателем r. При выключенной проверке границ указателей встроенная функция просто возвращает первый аргумент.
/* Here is a way to get pointer to object's field but still with the full object's bounds. */ int *field_ptr = __builtin___bnd_copy_ptr_bounds (&objptr->int_field, objptr);
- Встроенная функция: void * __builtin___bnd_init_ptr_bounds (const void *q)
-
Эта встроенная функция возвращает новый указатель со значением q и связывает его с границами INIT (разрешая полный доступ к памяти). При выключенной проверке границ указателей встроенная функция просто возвращает первый аргумент.
- Встроенная функция: void * __builtin___bnd_null_ptr_bounds (const void *q)
-
Эта встроенная функция возвращает новый указатель со значением q и связывает его с границами NULL (не разрешая доступ к памяти). При выключенной проверке границ указателей встроенная функция просто возвращает первый аргумент.
- Встроенная функция: void __builtin___bnd_store_ptr_bounds (const void **ptr_addr, const void *ptr_val)
-
Эта встроенная функция сохраняет границы, связанные с указателем ptr_val и местоположением ptr_addr, в таблицу границ. Это может быть полезно для распространения границ из устаревшего кода без изменения связанной памяти при копировании указателей как целых чисел. При выключенной проверке границ указателей вызов встроенной функции игнорируется.
- Встроенная функция: void __builtin___bnd_chk_ptr_lbounds (const void *q)
-
Эта встроенная функция проверяет, находится ли указатель q в пределах нижней границы его связанных границ. При выключенной проверке границ указателей вызов встроенной функции игнорируется.
extern void *__wrap_memset (void *dst, int c, size_t len) { if (len > 0) { __builtin___bnd_chk_ptr_lbounds (dst); __builtin___bnd_chk_ptr_ubounds ((char *)dst + len - 1); __real_memset (dst, c, len); } return dst; }
- Встроенная функция: void __builtin___bnd_chk_ptr_ubounds (const void *q)
-
Эта встроенная функция проверяет, находится ли указатель q в пределах верхней границы его связанных границ. При выключенной проверке границ указателей вызов встроенной функции игнорируется.
- Встроенная функция: void __builtin___bnd_chk_ptr_bounds (const void *q, size_t size)
-
Эта встроенная функция проверяет, находится ли [q, q + size - 1] в пределах нижней и верхней границ, связанных с q. При выключенной проверке границ указателей вызов встроенной функции игнорируется.
extern void *__wrap_memcpy (void *dst, const void *src, size_t n) { if (n > 0) { __bnd_chk_ptr_bounds (dst, n); __bnd_chk_ptr_bounds (src, n); __real_memcpy (dst, src, n); } return dst; }
- Встроенная функция: const void * __builtin___bnd_get_ptr_lbound (const void *q)
-
Эта встроенная функция возвращает нижнюю границу, связанную с указателем q, как значение указателя. Это полезно для отладки с использованием
printf. При выключенной проверке границ указателей встроенная функция возвращает 0.void *lb = __builtin___bnd_get_ptr_lbound (q); void *ub = __builtin___bnd_get_ptr_ubound (q); printf ("q = %p lb(q) = %p ub(q) = %p", q, lb, ub);
- Встроенная функция: const void * __builtin___bnd_get_ptr_ubound (const void *q)
-
Эта встроенная функция возвращает верхнюю границу (которая является указателем) связанную с указателем q. При выключенной проверке границ указателей встроенная функция возвращает -1.
Далее: Встроенные функции Cilk Plus, Предыдущее: Проверка размера объектов, Вверх: Расширения языка C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Pointer-Bounds-Checker-builtins.html