Linux унаследовал от других UNIX-like ОС одну из самых страшных архитектурных ошибок — ASCIIZ-строки. И хотя все время идут разговоры о новых языках программирования, новых библиотеках, новых идеях, но эта тема как-то остается в тени.
ASCIIZ-строки (последовательность символов, завершаемая символом с кодом 0) когда-то казались весьма удобными.
Но сейчас сам факт их существования вызывает иногда проблемы даже языках, в которых символ с кодом 0 не имеет особого значения.
Как только мы обращаемся к системным вызовам, или любой внешней библиотеке, написанной на C, мы передаем строку, которая будет трактоваться как ASCIIZ-строка. И тут начинается веселье.
Пример на Perl:
$a = "abc\x00/bcd"; open( OUT, ">", $a ); print OUT $a;
Этот код отработает вполне корректно, и создаст файл с именем abc, а не выдаст какую-либо ошибку, как можно было бы предположить.
Со стороны обычного программиста это выглядит как критическая ошибка в Perl — он же успешно создает файл, но не с тем именем, которое просили!
Особенно смешно это выглядит с учетом того, что если заменить '\0' на '\n', например, то файл с именем, содержащим в себе перенос строки успешно создастся. Ибо в Linux имя файла может содержать в себе любые символы, кроме '/' (разделитель компонент пути) и '\0' (завершение ASCIIZ-строки).
Существенное количество ошибок безопасности в коде на C вызвано именно ASCIIZ-строками, и иногда связанные с этим проблемы, как видно на моем примере, просачиваются и в другие языки. Даже несмотря на то, что внутри они используют другие типы данных: если мы посмотрим в созданный моим примером файл 'abc', он будет длиной в 7 байт, и содержать таки 'abc\0def'.
У ASCIIZ-строк есть и еще более простые недостатки. Например strlen это очень тяжелая операция, она требует прочитать всю строку в поисках символа с кодом '0'.
В строках же «паскалевских», например, когда длина строки хранится в ее начале, всех этих проблем нет.
Вот так одна маленькая ошибка 40-а летней давности в формате одной из самых используемых структур данных создает трудности всей IT-индустрии до сих пор.
И будет создавать до тех пор, пока C является основным языком системного программирования, и еще долгое время после того (ибо менять ABI ОС отнюдь не быстро).