Новости

5.05.2009 На сайте одного из крупнейших реселлеров России и СНГ SoftKey вышла статья о наших статических анализаторах Viva64 и VivaMP. »

30.04.2009 В журнале RSDN Magazine №4 – 2008 вышла статья разработчиков ООО «СиПроВер» «Отладка и оптимизация многопоточных OpenMP-программ».»

20.04.2009 ООО «СиПроВер» объявляет о выходе новой версии статического анализатора Viva64 2.30. Инструмент Viva64 предназначен для поиска ошибок в коде 64-битных приложений и для увеличения их эффективности.»

Новости RSS

Последние статьи

08.06.2009 Знакомство с анализатором кода PVS-Studio
В статье приведено краткое описание анализатора кода PVS-Studiio.»

08.06.2009 Что такое "Parallel Lint"?
В статье рассказывается о нескольких статических анализаторах, которые могут претендовать на звание "Parallel Lint".»

11.05.2009 64-битный конь, который умеет считать
Статья посвящена особенностям поведения компилятора Visual C++ при генерации 64-битного кода и связанными с этим потенциальными ошибками.»

Статьи RSS

Вопросы

1) Что такое Viva64?

Viva64 - это статический анализатор кода, созданный с целью упростить переход на 64-битные системы, и тем самым сократить необходимые для этого издержки. Инструмент Viva64 работает с кодом программ на языке Си/Си++ предназначенных для 64-битной операционной системы Windows. Viva64 представляет собой подключаемый модуль, интегрирующийся в среду разработки Visual Studio 2005/2008.

2) Что такое ключ /Wp64 в компиляторе Visual C++ и как он работает?

Ключ /Wp64 указывает компилятору искать потенциальные ошибки, которые могут возникнуть при компиляции кода для 64-битных систем. Проверка заключается в том, что типы, которые отмечены в 32-битном коде ключевым словом __w64 интерпретируются при проверке как 64-битные типы.

Например, пусть мы имеем следующий код:

#ifdef _WIN64
typedef __int64 MySSizet;
#else
typedef int MySSizet;
#endif

void foo() {
int value32 = 10;
MySSizet size = 20;
value32 = size;
}

Выражение "value32 = size;" на 64-битной системе приведет к урезанию значения, а, следовательно, к потенциальной ошибке. Мы хотим это диагностировать. Но при компиляции 32-битного приложения, все корректно и мы не получим предупреждения.

Чтобы подготовиться к 64-битным системам нам следует добавить ключ /Wp64 и вставить ключевое слово __w64 при описании типа MySSizet в 32-битном варианте.

В результате код станет выглядеть так:

#ifdef _WIN64
typedef __int64 MySSizet;
#else
typedef int __w64 MySSizet; // Add __w64 keyword
#endif

void foo() {
int value32 = 10;
MySSizet size = 20;
value32 = size; // C4244 64-bit int assigned to 32-bit int
}

Теперь мы получим предупреждение C4244, которое поможет подготовиться к переносу кода на 64-битную платформу.

2) Нужно ли мне включать /Wp64 при сборке 64-битного приложения в Visual Studio 2005?

Нет. Для 64-битного режима компиляции ключ /Wp64 значения не имеет, так как все типы уже имеют необходимый размер. То есть при компиляции 64-битной версии даже с выключенным ключом /Wp64 мы получим все необходимые предупреждения. Если вы регулярно компилируете свой код в 64-битном режиме, то вы можете отказаться от использования /Wp64 в 32-битном коде, поскольку в 64-битном режиме проверка производится более полно. Система диагностики с ключом /Wp64 не совершенна и часто приводит к ложным срабатываниям.

3) Зачем нужен анализатор Viva64, если есть /Wp64?

Ключ /Wp64 является хорошим подспорьем программисту, но помощь следует ждать от него только в ограниченном наборе случаев. К сожалению, типовых ошибок связанных с использованием 64-битных систем гораздо больше. Эти типовые ошибки подробно описаны в статье "20 ловушек переноса Си++ - кода на 64-битную платформу". Именно из-за большой разницы в количестве проверок, предоставляемых /Wp64, и необходимого количества проверок возникает потребность в специализированном инструменте. Таким специализированным инструментов и является Viva64.

4) Некоторые анализаторы общего назначения поддерживают диагностику 64-битных ошибок. Зачем тогда нужен еще один - Viva64?

Да, поддерживают. Но, во-первых, менее подробно. Например, не учитывается ряд ошибок, связанных с особенностями современного языка Си++. Во-вторых, эти анализаторы в основном ориентированы на проверку кода для Unix-систем, где разработка 64-битные приложения началась раньше, чем в Windows. В-третьих, – анализатор Viva64 более удобен в использовании, так как предназначен для поиска именно 64-битных ошибок. Более подробным ответом на этот вопрос является статья "Сравнение диагностических возможностей анализаторов при проверке 64-битного кода".

5) Почему в Visual Studio 2008 ключ /Wp64 объявлен устаревшим?

Есть ошибочное мнение о том, что /Wp64 объявлен устаревшим по причине, что диагностика 64-битных ошибок в Visual Studio 2008 стала намного лучше. Нет, это не так.

Ключ /Wp64 в Visual Studio 2008 объявлен устаревшим по той простой причине, что он больше не нужен. Прошло время "готовиться к 64-битному коду", теперь пора создавать 64-битные программы. А для этого в Visual Studio 2008, да и в Visual Studio 2005 есть 64-битный компилятор.

Ключ /Wp64 полезен только в режиме компиляции 32-битных программ. Он был создан для того, чтобы заранее увидеть ряд проблем, с которыми программа столкнется в будущем на 64-битных системах.

6) Актуален ли инструмент Viva64 при переходе на Visual Studio 2008?

Да, актуален. Ничего ведь не изменилось. Никаких существенных изменений компилятор в плане создания 64-битных программ не претерпел. Анализатор Viva64 обнаруживает намного больше потенциальных «64-битных» ошибок, чем 64-битный компилятор Visual C++ 2005/2008 и успешно используется многими разработчиками.

7) Что мне даст Viva64?

Использование статического анализатора Viva64 позволяет выпустить 64-битное приложение на рынок в 3-4 раза быстрее. Это достигается за счет значительного ускорения процесса анализа и тестирования кода, требующего учета специфики 64-битной архитектуры. Дополнительно сокращается время на тестирование разработанного 64-битного программного продукта за счет его более высокого качества.

Используемая в инструменте Viva64 методология статического анализа кода имеет существенные преимущества над другими видами анализа, так как позволяет охватить весь программный код. Процедура проверки кода не может как-либо повредить сам код. Процесс анализа полностью контролируется человеком, и именно он принимает решения о необходимости его модификации.

Инструмент Viva64 имеет большую базу знаний по разработке 64-битного кода (справочная система, статьи, примеры), которая позволит существенно поднять уровень программистов. Следование приводимым в этих документах рекомендациям позволит существенно повысить не только качество кода, но и его производительность.

8) Viva64 поможет оптимизировать 64-битный код?

Инструмент Viva64 специально не предназначен для оптимизации программ. Но большинство его диагностических сообщений помогают выбрать более подходящие типы данных, что косвенно увеличивает производительность кода. Более подробно об этом эффекте вы можете узнать из статей, размещенных на нашем сайте.

9) Что такое модель данных?

Под моделью данных следует понимать соотношения размерностей типов, принятых в рамках среды разработки. Для одной операционной системы могут существовать несколько средств разработки, придерживающихся разных моделей данных. Но обычно преобладает только одна модель, наиболее соответствующая аппаратной и программной среде. Примером может служить 64-битная операционная система Windows в которой родной моделью данных является LLP64. Но для совместимости 64-битная система Windows поддерживает исполнение 32-битных программ, которые работают в режиме модели данных ILP32LL.

В 64-битных Unix системах принята модель данных LP64.

Модели данных LP64 и LLP64 отличаются только размером типа "long". Но в этом различии заключена существенная разница в рекомендуемых методологиях в разработке программ под 64-битные операционные системы семейства Unix и Windows. Например, для хранения указателей и создания циклов для обработки большого количества элементов в Unix программах рекомендуется использовать тип long или unsigned long. В тоже время в Windows программах эти типы непригодны и вместо них следует использовать типы ptrdiff_t и size_t.

10) Что такое memsize-типы?

Термин "memsize" часто используется в наших статьях. Этот термин мы вводим для упрощения изложения материала. Термин "memsize" возник, как попытка лаконично назвать все типы, которые способны хранить в себе размер указателей и индексов самых больших массивов. Memsize-тип способен хранить в себе размер максимального массива, который может быть теоретически выделен в рамках данной архитектуры. Под memsize-типом мы понимаем все простые типы данных языка Си/Си++, которые на 32-битой архитектуре имеют размер 32-бита, а на 64-битной архитектуре - 64-бита.

Учтите, что в разных моделях данных, термин memsize-типы будет объединять различные типы. Например, в Windows системах тип long не является memsize типом, а в Unix системах является.