Spec-Zone.ru › GCC 5

6.55 Функции встроенного анализатора границ указателей

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-5.5.0/gcc/Pointer-Bounds-Checker-builtins.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API