ASCIIZ-строки — одна из главных проблем Linux

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 ОС отнюдь не быстро).

Запись опубликована в рубрике Новости. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Оставьте эти два поля как есть:

Защищено Invisible Defender. Показывать 403 для 283 896 плохих парней.