Ответ 1
Вы столкнулись с ним в стандартной библиотеке Microsoft С++, но на самом деле это происходит от C. C 11, если быть точным, что означает, что это не технически часть С++.
C 11 standard, Приложение K ввело все функции _s
и соответствующие typedefs, включая rsize_t
. Существует также макрос "максимальное значение" RSIZE_MAX
, который достаточно велик для типичных приложений, но меньше реального максимального значения типа. Защищенные функции ничего не делают и сообщают об ошибке, когда значение типа rsize_t
превышает RSIZE_MAX
.
Идея состоит в том, чтобы избежать сбоев при переполнении буфера и подобных ошибок, вызванных недопустимыми размерами, обычно в результате использования отрицательного значения для размера. В представлении с 2-значным знаком знака (наиболее распространенным) отрицательное число соответствует очень большому числу, когда рассматривается как unsigned. RSIZE_MAX
следует использовать такое неправильное использование.
Цитирование "обоснования" части C11 (N1570), K.3.2:
3 Чрезвычайно большие размеры объектов часто являются признаком того, что был рассчитан размер объектов неправильно. Например, отрицательные числа появляются как очень большие положительные числа, когда преобразуется в неподписанный тип, например
size_t
. Кроме того, некоторые реализации не поддерживают объекты, максимальные значения которых могут быть представлены типомsize_t
.4 По этим причинам иногда бывает полезно ограничить диапазон размеров объектов для обнаружения ошибки программирования. Для реализаций, ориентированных на машины с большими адресными пространствами, рекомендуется, чтобы
RSIZE_MAX
определялся как меньший размер самого большого объект поддерживается или(SIZE_MAX >> 1)
, даже если этот предел меньше размера некоторые законные, но очень большие объекты. Реализации, ориентированные на машины с небольшими адресные пространства, возможно, пожелают определитьRSIZE_MAX
какSIZE_MAX
, что означает, что нет размера объекта, который считается нарушением среды выполнения.
Стоит отметить, что приложение K имеет очень мало реализаций, и есть предложение (N1967), чтобы осудить и/или удалить его от стандарта.