четверг, 8 августа 2013 г.

Опасности неправильных концов строк

В эпоху, когда в интернете существует куча проектов, написанных под разные платформы, программисты не стесняются заимствовать полезные куски кода в режиме copy-paste. Помимо юридических вопросов, которые оставим за рамками этой статьи, возникают и чисто технические трудности.

Исторически так сложилось, что окончание строки в бинарной форме по умолчанию по-разному кодируется на разных платформах. На Windows — это CR+LF (ASCII 0x0D 0x0A), на Unix и подобных системах — LF (ASCII 0x0A), на Mac — CR (ASCII 0x0D). Копируя текст из исходников, которые писались для другой системы, есть опасность получить файл со смешанными концами строк. Пример такого файла показан на рисунке ниже.
Опасность таких файлов в том, что компилятор MSVC++ игнорирует CR и считает, что там все написано в одну строку. С другой стороны редактор Visual Studio вполне корректно отображает перенос. Проблемы начинаются при отладке полученных от кастомеров дампов. Пример показан на рисунке ниже.
Тут видно, что ошибка показана совсем не в той строке, в которой она произошла в реальности. При отладке больших проектов это становится огромной проблемой. Можно также отметить, что даже при показе специальных символов Visual Studio никак не выделяет «враждебные» концы строк. Единственное, чем помогает студия — это предупреждение, которое выдается при открытии подобных файлов.
Обратите внимание, что в диалоге можно снять галочку Always show this dialog и тогда студия больше никогда таких предупреждений не выдаст. Убедиться, что Visual Studio определяет файлы со смешанными концами строк можно в параметрах через меню Tools->Options в появившемся окне Environment->Documents и смотрим галку Check for consistent line endings on load.

Комментировать в ВКонтакте