Namespaces
Variants

set_constraint_handler_s, constraint_handler_t

From cppreference.net
< c ‎ | error
Определено в заголовочном файле <stdlib.h>
constraint_handler_t set_constraint_handler_s ( constraint_handler_t handler ) ;
(1) (начиная с C11)
typedef void ( * constraint_handler_t ) ( const char * restrict msg,

void * restrict ptr,

errno_t error ) ;
(2) (начиная с C11)
1) Настраивает обработчик для вызова всеми bounds-checked functions при нарушении ограничений времени выполнения или восстанавливает обработчик по умолчанию (если handler является нулевым указателем).
2) Указатель на обработчик, который будет вызван при нарушении ограничения времени выполнения.

Если set_constraint_handler_s никогда не вызывается, обработчик по умолчанию определяется реализацией: это может быть abort_handler_s , ignore_handler_s или какой-либо другой обработчик, определяемый реализацией.

Как и все функции с проверкой границ, set_constraint_handler_s и constraint_handler_t гарантированно доступны только если __STDC_LIB_EXT1__ определено реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdlib.h> .

Содержание

Параметры

handler - указатель на функцию типа constraint_handler_t или нулевой указатель
msg - указатель на строку символов, описывающую ошибку
ptr - указатель на объект, определяемый реализацией, или нулевой указатель. Примерами объектов, определяемых реализацией, являются объекты, содержащие имя функции, обнаружившей нарушение, и номер строки, в которой было обнаружено нарушение
error - ошибка, которая будет возвращена вызывающей функцией, если это одна из функций, возвращающих errno_t

Возвращаемое значение

Указатель на ранее установленный обработчик ограничений времени выполнения. (Примечание: этот указатель никогда не является нулевым указателем, поскольку вызов set_constraint_handler_s ( NULL ) устанавливает обработчик по умолчанию системы).

Пример

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
#ifdef __STDC_LIB_EXT1__
    char dst[2];
    set_constraint_handler_s(ignore_handler_s);
    int r = strcpy_s(dst, sizeof dst, "Too long!");
    printf("dst = \"%s\", r = %d\n", dst, r);
    set_constraint_handler_s(abort_handler_s);
    r = strcpy_s(dst, sizeof dst, "Too long!");
    printf("dst = \"%s\", r = %d\n", dst, r);
#endif
}

Возможный вывод:

dst = "", r = 22
abort_handler_s was called in response to a runtime-constraint violation.
The runtime-constraint violation was caused by the following expression in strcpy_s:
(s1max <= (s2_len=strnlen_s(s2, s1max)) ) (in string_s.c:62)
Note to end users: This program was terminated as a result
of a bug present in the software. Please reach out to your
software's vendor to get more help.
Aborted

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • K.3.6/2 constraint_handler_t (стр.: TBD)
  • K.3.6.1.1 Функция set_constraint_handler_s (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • K.3.6/2 constraint_handler_t (стр: TBD)
  • K.3.6.1.1 Функция set_constraint_handler_s (стр: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • K.3.6/2 constraint_handler_t (стр: 604)
  • K.3.6.1.1 Функция set_constraint_handler_s (стр: 604-605)

Смотрите также

функция прерывания для проверяемых границами функций
(функция)
функция игнорирования для проверяемых границами функций
(функция)