|
 |

Viva64. Диагностика ошибок в 64-битных приложениях.
05.05.2009 / Программы / Виктор Деревянко
Переход на 64-битные операционные системы - это революция в мире персональных компьютеров. Она началась в 2003 году, когда на рынке появились первые 64-битные процессоры для персональных компьютеров. Через пару лет на прилавках магазинов уже были только 64-битные процессоры. Следом появились 64-битные операционные системы - Windows XP Professional x64 Edition и Windows Vista 64-bit. Однако подавляющее большинство пользователей и сейчас продолжают работать на 32-битных системах. И на то есть веская причина - недостаток программного обеспечения для 64-битных систем.
Использование 64-битных технологий сулит множество преимуществ. Например, возможность адресации больших объемов памяти. Как известно, у 32-битных процессоров имеется принципиальное ограничение - они могут работать только с четырьмя гигабайтами оперативной памяти. 64-битные процессоры от этого недостатка свободны. Другим преимуществом является увеличение скорости работы с большими числами (long, double). Кроме того, 64-битные системы очень эффективны при выполнении вычислений, использующих числа с плавающей запятой. Они позволяют эффективно вести вычисления с большей точностью (128 бит). Наконец, в 64-битной архитектуре x86-64 больше регистров.
Переход на 64-битные системы позволяет увеличить производительность приложений в среднем на 5-15%, а в некоторых случаях - в разы. Например, скорость криптографических программ повышается на 64 битах в 3-5 раз по сравнения с 32 битами.
Возникает вопрос: если все так хорошо, то почему мы по-прежнему работаем на 32-битных системах? В чем причина?
Дело в том, что перевод приложений с 32 бит на 64 бита - процесс совсем не тривиальный. Большая часть приложений в настоящее время - 32-битные. Практически все они (за исключением драйверов операционной системы и других низкоуровневых приложений) будут запускаться на 64-битной системе. Но запускаться в режиме эмуляции, который не только не увеличивает, а даже несколько снижает производительность приложения (примерно на 2%).
Для того чтобы программа могла использовать все преимущества 64-битной операционной системы, необходимо портировать ее исходные коды под 64-битную платформу. И скомпилировать их на компиляторе, генерирующем 64-битный код. В портировании и кроется основная закавыка.
Разработчики столкнулись с весьма неприятными проблемами. Программы, которые идеально работают на 32-битных системах, после компиляции под 64-битную систему даже не запускаются. Или запускаются, но работают не стабильно или не правильно. Или правильно, но до тех пор, пока не будет предпринята попытка обработать слишком большой объем данных. В этот момент приложение падает. Разве это годится?
Проблем при портировании - множество. Основная проблема в том, что в 64-битных системах изменился размер указателей. В 32-битных системах указатель занимал 4 байта, в 64-битных занимает 8. Код, в котором предполагается, что размеры указателей совпадают с размерами других типов данных (скажем, unsigned int или long), будет приводить к потере информации. В 64-битных системах разность указателей имеет тип ptrdiff_t, сами указатели должны иметь тип uintptr_t. Тогда как в большинстве случаев вместо ptrdiff_t и uintptr_t используются int или long.
В довершение всего в 64-битных системах изменились размеры long и int, причем в разных моделях данных по-разному. Во многих 64-битных версиях Unix int имеет размер 32 бита, а long - 64 бита. В других оба типа данных имеют размер 64 бита. В третьих оба типа имеют размер 32 бита.
Что в итоге? Плывет код, связанный с работой указателей, адресной арифметикой, побитовыми сдвигами. Преобразование целых чисел в double и обратно теперь приводит к потери информации. Многие явные преобразования типов, абсолютно корректные под 32-битными системами, стали некорректны в 64-битной системе. И ведь о таких ошибках компилятор даже не предупреждает!
Не так давно компания ООО "Системы программной верификации" выпустила программный продукт Viva64, позволяющий эффективно бороться со всеми этими проблемами. Viva64 - это синтаксический анализатор кода, который находит в приложениях, написанных на языках С++ или С, потенциальные проблемы переноса кода на 64-битную платформу.
Viva64 - узкоспециализированный анализатор. Он реализован в виде плагина к Microsoft Visual Studio и ориентирован на модель данных LLP64, принятую в Windows. Текущая версия находит свыше 20 типов ошибок. И это количество от версии к версии постоянно увеличивается.
Интерфейс
Интерфейс Viva64 весьма аскетичен. Плагин встраивает в студию панель инструментов, пункт в главное меню, пункт меню в редактор настроек студии. Доступные команды позволяют выполнить синтаксический анализ текущего файла, проекта, солюшена, отредактировать настройки плагина, а также сохранить результаты анализа в XML-файл.
 | | Интерфейс Viva64 | В процессе анализа на панели состояния отображается индикатор, показывающий ход работы. Анализ ведется в фоновом режиме с использованием всех имеющихся процессоров. С обнаруженными ошибками можно начинать работать сразу, не дожидаясь завершения процесса анализа. Анализ больших проектов занимает изрядное количество времени. Но оно того стоит: Viva64 обнаруживает множество потенциальных ошибок практически в любом коде, написанном под 32-битную платформу.
Результаты диагностики выводятся в стандартном окне Error list. Здесь их можно отсортировать по типу ошибки, по имени файла и т. д. Плагин поставляется вместе со справочной системой, которая интегрируется со студией. При нажатии F1 на сообщении об ошибке открывается справочная система. Для каждой ошибки выводится детальная информация: в чем ошибка заключается, как исправлять, примеры правильного и неправильного кода.
Плагин встраивает свои настройки в редактор настроек студии. Настройки позволяют указать пути к сторонним библиотекам, тексты которых при анализе следует исключить (например, boost). Здесь же задаются параметры фильтрации: если вы не желаете просматривать диагностические сообщения типа V101, достаточно указать строку V101 в фильтре и все подобные сообщения будут скрыты.
 | | Настройки Viv64 | В пробной версии программы большая часть ошибок не показывается - факт ошибки фиксируется, но информации о ней не выводится. Впрочем, вместе с пробной версией поставляется демонстрационное приложение, для которого результаты анализа отображаются полностью.
Возможности
В Microsoft Visual Studio 2005 встроено средство диагностики проблем переноса кода на 64-битные системы. Возможности Viva64 на порядок мощнее. Дело в том, что поиск многих потенциальных проблем требует глубокой диагностики кода, что приведет к существенному увеличению времени компиляции. Разработчики компилятора не имеют возможности реализовывать такую диагностику без существенного снижения производительности. А для разработчиков отдельного статистического анализатора таких ограничений нет.
Viva64 имеет две основные области применения: помощь при портировании 32-битных приложений на 64-битные платформы и оптимизацию кода с учетом особенностей 64-битной архитектуры.
На сайте разработчика очень подробно расписано, какие именно типы ошибок находит Viva64. Текущая версия распознает свыше 20 типов ошибок. Большинство ошибок связано с неправильным применением обычных целочисленных типов (int, long) вместо так называемых memsize-типов, т. е. типов, способных хранить в себе указатель (size_t, ptrdiff_t).
Примеры ошибок:
- использование индекса типа
int для индексации массива размером size_t;
- неявное приведение фактического аргумента функции к memsize-типу;
- сохранение разности указателей в переменную типа
long;
- потенциально опасное явное приведения типа.
Анализатор Viva64 информирует только о тех приведениях типов, которые потенциально могут быть причиной некорректной работы кода на 64-битной платформе. В том случае, когда код 100% корректен и не может приводить к ошибкам, сообщений не выдается.
Помимо поиска ошибок Viva64 позволяет оптимизировать код для 64-битных систем. Оптимизировать по нескольким направлениям. Во-первых, снизить количество явных и неявных приведений 32-битных и memsize-типов между собой. В результате компилятор генерирует более простой и быстрый код. Во-вторых, более эффективно использовать память. Использование данных, не равных размеру машинного слова, снижает производительность функций. Простая замена типов int и uint на ptrdiff_t и size_t может дать существенный прирост производительности. В отдельных случаях необходимо переставить местами поля в структуре, чтобы получить ощутимую экономию памяти. В итоге программист, ориентируясь на диагностические сообщения анализатора Viva64, может не только сделать код более безопасным, но и более быстрым.
Ограничения
Возможности синтаксического анализа Viva64 ограничены. Основные ограничения связаны с неполной поддержкой анализа сложных шаблонов и перегруженных функций. Кроме того, не поддерживается управляемый C++.
VivaMP
Программа Viva64 построена на библиотеке VivaCore. На ней же построен другой продукт компании - VivaMP. Программа VivaMP предназначена для поиска ошибок в параллельных приложениях, разработанных с помощью OpenMP. Она построена по тому же принципу, что и Viva64, - аналогичный плагин для Visual Studio с аналогичным графическим интерфейсом. Различия лишь в типе диагностики кода.
Системные требования
Visual Studio 2005/2008
Текущая версия Viva64 - 2.30
Текущая версия VivaMP - 1.10
Конкуренты
Viva64 и VivaMP - узкоспециализированные анализаторы кода, предназначенные для Windows и представляющие собой плагины для Visual Studio. Других подобных программ на рынке в настоящий момент нет. Однако есть более общие анализаторы кода, также способные в некоторой степени помочь разработчикам 64-битных и параллельных приложений:
Parasoft C++test;
Gimpel Software PC-lint;
Abraxas Software CodeCheck.
Выводы
Viva64 - очень полезная программа. Она не только существенно упрощает и ускоряет процесс портирования кода с 32-битной платформы на 64-битную, но и делает его более качественным. Если программа заработала, это совершенно не значит, что она будет работать стабильно и при любых обстоятельства. Viva64 обращает ваше внимание на малозаметные проблемы в коде, которые при обычном тестировании легко пропустить, но которые на 64-битных системах при определенных условиях смогут привести к нестабильной работе приложения.
На сайте разработчика много интересной информации по вопросам портирования 32-битных приложений на 64-битную платформу. Пожалуй, это один из лучших ресурсов Рунета на эту тему.
Следует признать, что интерфейс Viva64 реализует далеко не все возможности, которые пригодились бы на практике. Не хватает возможности фильтровать список диагностических сообщений (например, как в CodeIt.Right). Отсутствует возможность исключать из анализа выбранные файлы и помеченные регионы кода. Нет возможности создания статистических отчетов и запуска процесса анализа из командной строки.
Но все недостатки можно простить благодаря отличной функциональности программы. Ведь трудно переоценить, сколько времени и сил может сэкономить Viva64 программистам, ведущим разработку под 64-битные системы.
Ссылки по теме:
Автор статьи: Виктор Деревянко
Отзывы:
|
|
* - поля, обязательные для заполнения.
Ваш отзыв будет опубликован в течение двух-трех дней. Мы оставляем за собой право не публиковать отзывы, которые будут содержать нелитературные выражения и оскорбительные высказывания.
|
|