Ёмкость буфера, занятая длина и проверка границ

Ёмкость, занятая длина и проверка границ в фиксированном буфере: единицы измерения, корректные условия записи и иллюстративный расчёт в байтах UTF-8.

Фиксированный буфер с занятой длиной и свободной зоной, проверка границ записи

Назначение

Буфер с фиксированной ёмкостью хранит байты в заранее выделенном участке памяти. Два числа, ёмкость и занятая длина, задают границы допустимых операций, но сами по себе не являются всей структурой хранения. Задача читателя здесь проста: уметь сравнивать эти величины в одинаковых единицах и понимать, почему проверка «место есть» не гарантирует безопасность записи.

Единицы измерения

Прежде чем сравнивать ёмкость и длину, нужно определить, что именно измеряется. Байт, кодировочная единица и скалярное значение Unicode различаются. В UTF-8 латинские буквы из диапазона ASCII занимают один байт, а большинство кириллических знаков занимают два байта. В UTF-16 кодировочная единица имеет 16 бит, но дополнительные скалярные значения требуют суррогатной пары, то есть двух единиц. В UTF-32 каждый скалярный символ занимает одну 32-битную единицу. Видимый глиф при этом может состоять из нескольких скалярных значений, поэтому правило «четыре байта на символ» не является общим.

Проверка границ

Для фиксированного буфера необходимо, чтобы занятая длина не превышала ёмкость, однако это условие само по себе недостаточно для безопасной записи. Чтение ограничивается занятой длиной: смещение плюс запрашиваемый размер не должны выходить за пределы уже записанных данных. Запись ограничивается ёмкостью. Для неотрицательных ограниченных величин надёжно проверять два условия: смещение не больше предела и запрашиваемый размер не больше разности предела и смещения. Такой порядок исключает переполнение выражения «смещение плюс размер» до сравнения.

Пример в байтах

Рассмотрим буфер ёмкостью 64 байта. Записываем слово «Привет» в кодировке UTF-8: каждая из шести кириллических букв занимает два байта, итого 12 байт. Затем добавляем «мир», три буквы по два байта, итого 6 байт. Занятая длина становится 18 байт, свободных остаётся 46. Запрос на добавление ещё 60 байт не помещается, и корректная проверка это отклонит. Важно уточнить: выбранные буквы занимают по два байта в UTF-8, но не всякая кириллическая кодировочная точка или глиф имеет такую же длину.

Ограничения

Проверка длины не доказывает полную безопасность памяти. Она лишь предотвращает выход за границы данного буфера. Поведение при неудаче зависит от реализации: проверяющий интерфейс может отклонить запись или расширить буфер, а необработанная сырая запись может повредить память или вызвать сбой. Ни одно из этих последствий не является универсальным для всех абстракций буфера, и ни одна конкретная структура данных не гарантируется как единственный способ хранения метаданных.