Spec-Zone.ru › C

set_constraint_handler_s, constraint_handler_t

Определено в заголовочном файле <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) Настраивает обработчик, который будет вызван всеми функциями с проверкой границ при нарушении ограничений во время выполнения, или восстанавливает обработчик по умолчанию (если 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)

См. также

abort_handler_s
(C11)
обратный вызов abort для функций с проверкой границ
(функция)
ignore_handler_s
(C11)
обратный вызов ignore для функций с проверкой границ
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/error/set_constraint_handler_s

Spec-Zone.ru

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