Нулевой символ
Нулевой символ (англ. null character) — управляющий символ с числовым значением, равным нулю[1][2][3][4][5]. Многие наборы символов определяют отдельный код для нулевого символа —в том числе Unicode (Универсальный набор кодирования символов), ASCII (стандарт ISO/IEC 646), коды Баудо, ITA2, C0, а также EBCDIC. В современных кодировках нулевому символу соответствует кодовая позиция с числовым значением ноль, что обычно соответствует одному коду (байту) с этим значением. Например, в UTF-8 нулевой символ кодируется одним нулевым байтом. Однако в модифицированном UTF-8 нулевой символ кодируется как два байта. Это позволяет использовать байт со значением «0» как признак завершения строки, не встречающийся среди символов текста.
Изначально назначение нулевого символа было аналогично NOP («нет операции») — при передаче принтеру или терминалу он не оказывал видимого эффекта (однако некоторые терминалы могли ошибочно отображать его как пробел). Во времена электромеханических телетайпов в окончании печатаемой строки нередко передавали один или несколько нулевых символов для предоставления механизму времени на возврат каретки[6]. На перфоленте нулевой символ кодировался отсутствием отверстий; из-за этого новая неперфорированная лента воспринималась как заполненная нулевыми символами, и часто в резервируемое пространство из нулевых символов можно было внедрять текст, продавливая новые отверстия поверх начальных нулей.
Нуль-терминированная строка — широко применяемая структура данных в языке программирования C, многих его производных языках и других контекстах программирования; в этом случае нулевой символ указывает на конец строки[7][8]. Такая организация допускает строки любой длины с затратой на завершающий символ, в отличие от альтернативной структуры, где длина строки хранится как целое число, что ограничивает длину (например, 255 для одного байта).
В контексте работы с байтами нулевой символ также называют нулевым байтом.
Представление
Поскольку нулевой символ не является печатным, для его обозначения в исходных текстах применяются специальные записи.
В строковых литералах нулевой символ часто обозначается как управляющая последовательность \0 (например, "abc\0def"). Похожая нотация используется и для символьных литералов ('\0'), хотя последний часто совпадает с числовой константой 0[9]. Во многих языках (например, в C, где эта запись впервые появилась), \0 — не самостоятельная управляющая последовательность, а восьмеричная (октальная) запись с единственным разрядом 0; из-за этого \0 нельзя сразу за ним ставить цифры 0—7, иначе это будет расценено как более длинная октальная запись[10]. Другие управляющие последовательности, встречающиеся в разных языках: \000, \x00, \z, \u0000.
В URL нулевой символ представлен как процентный код %00.
Однако возможность представить нулевой символ в строке не гарантирует её корректную обработку — многие программы по-прежнему воспринимают нулевой байт как признак конца строки. Поэтому возможность явно вводить такой символ (например, при непроверенном пользовательском вводе) создаёт уязвимость класса внедрение нулевого байта и может привести к эксплойтам[11].
В документации к программному обеспечению нулевой символ обычно указывается как NUL или NULL (однако последний термин также может обозначать нулевой указатель). В Unicode для этого определён отдельный символ: U+2400 ␀ .
В кареточной нотации нулевой символ обозначается как ^@. На некоторых клавиатурах его можно ввести, удерживая Ctrl и нажимая @ (или, в случае раскладки США, обычно достаточно Ctrl+2, поскольку для ввода @ не требуется ⇧ Shift).
Примечания
- ↑ ASCII format for Network Interchange (англ.). Internet Engineering Task Force. — «NUL (Null): The all-zeros character which may serve to accomplish time fill and media fill.» Дата обращения: 15 июня 2024.
- ↑ The set of control characters of the ISO 646 (англ.) 4.4. Secretariat ISO/TC 97/SC 2 (1 декабря 1975). — «Position: 0/0, Name: Null, Abbreviation: Nul». Дата обращения: 15 июня 2024. Архивировано 12 мая 2014 года.
- ↑ Unicode Character 'NULL' (U+0000) (англ.). Дата обращения: 15 июня 2024.
- ↑ C0 Controls and Basic Latin (англ.). Unicode Consortium (2018). Дата обращения: 15 июня 2024.
- ↑ «Байт, все биты которого равны 0, называемый нулевым символом (null character), должен присутствовать в базовом наборе символов программного окружения; он используется для обозначения завершения строкового литерала». — ANSI/ISO 9899:1990 (стандарт ANSI C), раздел 5.2.1
- ↑ Teletype Model 33: what happened when you pressed a key? (англ.). righto.com (12 ноября 2015). Дата обращения: 15 июня 2024.
- ↑ «Строка — это последовательность символов, граница которой определяется первым встреченным нулевым символом» — ANSI/ISO 9899:1990 (стандарт ANSI C), раздел 7.1.1
- ↑ “Working Draft, Standard for Programming Language C++” (PDF) (ISO 14882 standard working draft) [англ.]. ISO/IEC. 28 февраля 2011: 427. N3242=11-0012. Дата обращения 2024-06-15.
A "null-terminated byte string", or NTBS, is a character sequence whose highest-addressed element with defined content has the value zero (the "terminating null character"); no other element in the sequence has the value zero.
- ↑ Керниган и Ритчи, «Язык программирования C», с. 38: «Символьная константа '\0' представляет символ со значением ноль, нулевой символ. '\0' часто используют вместо 0, чтобы подчеркнуть символьную природу выражения, хотя числовое значение просто 0».
- ↑ В YAML такая комбинация — отдельная управляющая последовательность: ссылка.
- ↑ Null Byte Injection (англ.). WASC Threat Classification. Дата обращения: 15 июня 2024.