Поддержка Unicode, безопасность и переполнение буфера


2 0

Старые языки программирования очень активно использовать 8-ми битные строки, из-за аппаратных ограничений старого железа. Сейчас уже это не является такой проблемой и уже давно весь мир постепенно переходит на Unicode. Но почему постепенно и почему большинство реализовывает просто поддержку Unicode кодировки, но так же активно продолжают использовать и старый однобайтный формат?

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

Почему нельзя просто поменять функции работы с однобайтными строками на двубайтные? Вот тут я могу сказать, что такое делать никогда нельзя, потому что это безопасность. Что будет, если вы просто поменяете функцию копирования строки с однобайтной, на двубайтный? Если функция принимает количество копируемых символов, то вы получите классическое переполнение буфера. Старая функция при копировании 10 символов, копировала 10 байт, а новая будет копировать 20 байт.

А может быть использовать следующий трюк для того, чтобы определять размерность строки: Размер строки = количество символов, умноженное на размер первого символа. Классный метод. Вы можете использовать его, но будьте осторожны, потому что существует множество вариантов Unicode, в том числе и самый популярный UTF-8.

А сколько байт (не символов, а байт) будет копировать функция, если строка находиться в UTF-8 кодировке? 10? 20? Не угадали, в зависимости от набора символов, строка может быть от 10 до 30 байт (а может даже кажеться и до 50, для отдельных языков) и это особенности кодировки. Поэтому, нужно переписать весь код выделения памяти и оттестировать его, иначе функция будет копировать больше данных, чем выделено в памяти, а это снова переполнение буфера.

Такой язык как C# прячет работу с памятью и самостоятельно контролирует выделение памяти для строк, поэтому его можно назвать основанным на Unicode строках и это было вложено изначально (если я не ошибаюсь UTF-16 для простоты жизни). Изменить существующие языки НЕЛЬЗЯ, потому что это безопасность и разработчики понимают это и не пытаются что-то делать, а просто добавляют поддержку. Такие языки программирования как Delphi и C++ (имеется ввиду классический, а не .NET) в ближайшее время не станут такими, потому что тут программист может работать с любыми типами строк и даже с разными типами Unicode строк. C# работает только с одним, но может конвертировать строки. В Win32 выделение памяти ложиться на плечи разработчика и это дает дополнительные возможности и гибкость. Я не буду говорить, что Delphi вообще никогда не станет чисто Unicode, потому что тут можно ошибиться, но в ближайшее время врят ли. В будущем, и эти языки могут стать чисто управляемыми и тогда лягут на 2 байта как по маслу, а пока нет управления, более чем поддержка делать опасно с точки зрения безопасности и переполнения буфера.

Если бы Unicode кодировка была одна, то тогда я может быть еще согласился, что Delphi необходимо полностью полагаться на него. А так, когда есть много разных вариантов, но для начала нужно определиться, на какой формат положиться, нужно как-то реализовать защиту от переполнения в уже существующем коде (нереально), поэтому Delphi и C++ будут продолжать использовать и то и другое, а программист должен осознано создавать тот тип приложения, который ему нужен и понимать, какой тип строки он использует.


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Алексей

12 Октября 2008

Михаил, а как Вы считаете, у меня сайт в кодировке windows-1251. И он ориентирован только для рускоязычного пользователя. Есть ли смысл переходить на utf?


Михаил Фленов

12 Октября 2008

Я перешел потому, что MySql админка не показывает русский текст в Win-1251. Если у тебя нет порблем с кодировкой в каких-то сценариях и программах, то нет и смысла переходить.


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

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне