﻿# Сравнение возможностей PVS\-Studio и Visual Studio 2010 по выявлению дефектов в 64\-битных программах

В статье сравниваются три механизма анализа кода с точки зрения выявления 64\-битных ошибок: компилятор Visual C\+\+2010, компонент Code Analysis for C/C\+\+ входящий в состав Visual Studio 2010 Premium/Ultimate и анализатор Viva64 входящий в состав PVS\-Studio 3\.60\. Показаны возможности как по выявлению дефектов в 64\-битных проектах, так и предварительной диагностики 64\-битных ошибок еще в 32\-битном проекте\.

Наша компания ООО "Системы программной верификации" разрабатывает специализированный статический анализатор кода Viva64, предназначенный для выявления 64\-битных ошибок в Windows\-приложениях\. Анализатор Viva64 входит в состав пакета [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/), интегрирующегося в среду Visual Studio 2005/2008/2010\.

Наши потенциальные пользователи, рассматривающие вопрос приобретения PVS\-Studio часто задают вопрос касательно преимуществ нашего инструмента перед диагностическими возможностями компилятора Visual C\+\+ и компонента Code Analysis for C/C\+\+, доступного в расширенных редакциях Visual Studio \(например, в Visual Studio 2010 Premium/Ultimate\)\.

Также наших пользователей интересует возможность предварительного выявления 64\-битных ошибок еще на том этапе, когда 64\-битного проекта не существует\.

В этой статье мы проведем сравнение различных инструментов по 31 паттерну [64\-битных ошибок](https://pvs-studio.ru/ru/blog/terms/0002/) и покажем их эффективность при проверке 32\-битных и 64\-битных проектов\. В третьем разделе статьи будут даны ссылки, поясняющие каждый из паттернов ошибок, а также даны комментарии к таблицам сравнения\. Тестовый проект, на котором происходило сравнение и который содержит все паттерны ошибок, доступен для скачивания по [этому адресу](https://pvs-studio.com/external-pictures/errorexamples-vs2010-project.7z)\.

## 1\. Сравнение инструментов при анализе 64\-битного проекта

Сравнение инструментов и процент найденных дефектов при анализе 64\-битных проектов приведены в таблице 1\. Обратите внимание, что колонка относящаяся к Code Analysis for C/C\+\+ пуста\. Причина в том, что на данный момент Code Analysis for C/C\+\+ [не работает](https://pvs-studio.ru/ru/blog/posts/0050/) с 64\-битными проектами\.

Также отметим, что с помощью ключа /Wall включены все предупреждения компилятора Visual C\+\+, то есть полностью используются его диагностические возможности\. При этом ключ [/Wp64](https://pvs-studio.ru/ru/blog/terms/0057/) отсутствует, так как он игнорируется \(не имеет смысла\) при компиляции 64\-битных проектов\.

Цветовая раскраска ячеек \(легенда\):

* Серый \- не диагностируется\.
* Голубой фон \- диагностируется частично \(смотри пояснения в третьем разделе\)\.
* Зеленый фон \- диагностируется\.

![a0066_PVS_vs_VS_ru/image2.png](https://import.viva64.com/docx/blog/a0066_PVS_vs_VS_ru/image2.png)

Таблица 1 \- Сравнение возможностей компилятора Visual C\+\+ 2010, Code Analysis for C/C\+\+ \(Visual Studio 2010 Premium\) и Viva64 \(PVS\-Studio 3\.60\) по выявлению 64\-битных ошибок в 64\-битном проекте

**Вывод**

Диагностические возможности статического анализатора Viva64 в несколько раз превосходят возможности Visual C\+\+ 2010 при поиске 64\-битных ошибок в 64\-битных проектах\. Компонент Code Analysis for C/C\+\+ в поиске данного класса ошибок бесполезен, так как на данный момент не работает с кодом 64\-битных проектов\.

## 2\. Сравнение инструментов при анализе 32\-битных проектов

Часто интерес вызывает возможность выявления 64\-битных ошибок еще на этапе работы с 32\-битным проектом\. Этот интерес проистекает из следующих двух задач:

1. Оценить стоимость миграции 32\-битного приложения на 64\-битную систему\.
1. Заранее устранить как можно большее количество 64\-битных ошибок еще до начала миграции приложения\.

Сравнение инструментов и процент найденных дефектов при анализе 32\-битных проектов приведено в таблице 2\.

Для компилятора Visaul C\+\+ указаны ключи /Wall и /Wp64, чтобы с максимально полно использовать его диагностические возможности\. Для модуля Code Analysis for C/C\+\+ также включены все возможные предупреждения\.

Цветовая раскраска ячеек \(легенда\):

* Серый \- не диагностируется\.
* Голубой фон \- диагностируется частично \(смотри пояснения в  третьем разделе\)\.
* Зеленый фон \- диагностируется\.

![a0066_PVS_vs_VS_ru/image4.png](https://import.viva64.com/docx/blog/a0066_PVS_vs_VS_ru/image4.png)

Таблица 2 \- Сравнение возможностей компилятора Visual C\+\+ 2010, Code Analysis for C/C\+\+ \(Visual Studio 2010 Premium\) и Viva64 \(PVS\-Studio 3\.60\) по выявлению 64\-битных ошибок в 32\-битном проекте

**Вывод**

Диагностические возможности статического анализатора Viva64 в несколько раз превосходят возможности Visual C\+\+ 2010 при поиске 64\-битных ошибок в 32\-битных проектах\. 

Диагностические возможности Visual C\+\+ 2010 при анализе 32\-битных проектов хуже, чем при анализе 64\-битных\. Это связано с тем, что при компиляции 32\-битных проектов компилятор использует другую модель данных \([ILP32](https://pvs-studio.ru/ru/blog/terms/0018/)\)\.

Компонент Code Analysis for C/C\+\+ представляет собой статический анализатор общего назначения и не помогает в выявлении рассматриваемого нами класса 64\-битных ошибок\. 

Анализатор Viva64 выполнил анализ тестового проекта одинаково полно как для 32\-битных, так и для 64\-битных проектов\.  На практике анализатор Viva64 все же может выдать меньше предупреждений при анализе 32\-битного проекта, пропустив до 5% ошибок\. Подробнее смотри \- [Урок 28\. Оценка стоимости процесса 64\-битной миграции Си/Си\+\+ приложений](https://pvs-studio.ru/ru/blog/lessons/0028/)\.

## 3\. Описание параметров, по которым производилось сравнение

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

### 3\.1\. Неявное приведение 32\-битного типа к memsize\-типу

Описание:

* Документация по PVS\-Studio\. [V101\. Implicit assignment type conversion to memsize type](https://pvs-studio.ru/ru/docs/warnings/v101/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 11\. Паттерн 3\. [Операции сдвига](https://pvs-studio.ru/ru/blog/lessons/0011/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.2\. Опасная адресная арифметика

Описание:

* Документация по PVS\-Studio\. [V102\. Usage of non memsize type for pointer arithmetic](https://pvs-studio.ru/ru/docs/warnings/v102/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 13\. Паттерн 5\. [Адресная арифметика](https://pvs-studio.ru/ru/blog/lessons/0013/)\.

### 3\.3\. Неявное приведение memsize\-типа к 32\-битному типу

Описание:

* Документация по PVS\-Studio\. [V103\. Implicit type conversion from memsize type to 32\-bit type](https://pvs-studio.ru/ru/docs/warnings/v103/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Проблемы 64\-битного кода в реальных программах: FreeBSD](https://pvs-studio.ru/ru/blog/posts/0002/)\.

### 3\.4\. Неявное приведение 32\-битного типа к memsize\-типу в операции сравнения

Описание:

* Документация по PVS\-Studio\. [V104\. Implicit type conversion to memsize type in an arithmetic expression](https://pvs-studio.ru/ru/docs/warnings/v104/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Почему A \+ B \!\= A \- \(\-B\)](https://pvs-studio.ru/ru/blog/posts/cpp/0039/)\.

### 3\.5\. Неявное приведение 32\-битного типа к memsize\-типу в тернарной операции

Описание:

* Документация по PVS\-Studio\. [V105\. N operand of '?:' operation: implicit type conversion to memsize type\.](https://pvs-studio.ru/ru/docs/warnings/v105/)
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.6\. Неявное приведение 32\-битного типа к memsize\-типу при вызове функции

Описание:

* Документация по PVS\-Studio\. [V106\. Implicit type conversion N argument of function 'foo' to memsize type](https://pvs-studio.ru/ru/docs/warnings/v106/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.7\. Неявное приведение memsize\-типа к 32\-битному типу при вызове функции

Описание:

* Документация по PVS\-Studio\. [V107\. Implicit type conversion N argument of function 'foo' to 32\-bit type](https://pvs-studio.ru/ru/docs/warnings/v107/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.8\. В качестве индекса используется не memsize\-тип

Описание:

* Документация по PVS\-Studio\. [V108\. Incorrect index type: 'foo\[not a memsize\-type\]'\. Use memsize type instead](https://pvs-studio.ru/ru/docs/warnings/v108/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 13\. Паттерн 5\. Адресная [арифметика](https://pvs-studio.ru/ru/blog/lessons/0013/)\.

### 3\.9\. Неявное приведение 32\-битного типа к memsize\-типу внутри оператора return

Описание:

* Документация по PVS\-Studio\. [V109\. Implicit type conversion of return value to memsize type](https://pvs-studio.ru/ru/docs/warnings/v109/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.10\. Неявное приведение memsize\-типа к 32\-битному типу внутри оператора return

Описание:

* Документация по PVS\-Studio\. [V110\. Implicit type conversion of return value from memsize type to 32\-bit type](https://pvs-studio.ru/ru/docs/warnings/v110/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.11\. Функции с переменным количеством аргументом в качестве параметра передается значение memsize\-типа

Описание:

* Документация по PVS\-Studio\. [V111\. Call function 'foo' with variable number of arguments\. N argument has memsize type](https://pvs-studio.ru/ru/docs/warnings/v111/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 10\. Паттерн 2\. [Функции с переменным количеством аргументов](https://pvs-studio.ru/ru/blog/lessons/0010/)\.

### 3\.12\. Опасное магическое число

Описание:

* Документация по PVS\-Studio\. [V112\. Dangerous magic number N used](https://pvs-studio.ru/ru/docs/warnings/v112/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 9\. Паттерн 1\. [Магические числа](https://pvs-studio.ru/ru/blog/lessons/0009/)\.

### 3\.13\. Попытка хранение значения memsize\-типа в переменной типа double

Описание:

* Документация по PVS\-Studio\. [V113\. Implicit type conversion from memsize to double type or vice versa](https://pvs-studio.ru/ru/docs/warnings/v113/)\.
* Документация по PVS\-Studio\. [V203\. Explicit type conversion from memsize to double type or vice versa](https://pvs-studio.ru/ru/docs/warnings/v203/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 18\. Паттерн 10\. [Хранение в double целочисленных значений](https://pvs-studio.ru/ru/blog/lessons/0018/)\.

**Примечание к таблице**

При сборке 32\-битного проекта компилятор Visual C\+\+ предупреждает только о приведении типа double к size\_t, и не предупреждает о приведении типа size\_t к double\.

### 3\.14\. Некорректное изменение типа указателя

Описание:

* Документация по PVS\-Studio\. [V114\. Dangerous explicit type pointer conversion](https://pvs-studio.ru/ru/docs/warnings/v114/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 14\. Паттерн 6\. [Изменение типа массива](https://pvs-studio.ru/ru/blog/lessons/0014/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Проблемы 64\-битного кода в реальных программах: изменение типа указателя](https://pvs-studio.ru/ru/blog/posts/cpp/0034/)\.

### 3\.15\. Использование memsize типов при работе с исключениями

Описание:

* Документация по PVS\-Studio\. [V115\. Memsize type is used for throw](https://pvs-studio.ru/ru/docs/warnings/v115/)\.
* Документация по PVS\-Studio\. [V116\. Memsize type is used for catch](https://pvs-studio.ru/ru/docs/warnings/v116/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 20\. Паттерн 12\. [Исключения](https://pvs-studio.ru/ru/blog/lessons/0020/)\.

### 3\.16\. Наличие memsize\-типов в объединениях

Описание:

* Документация по PVS\-Studio\. [V117\. Memsize type is used in the union](https://pvs-studio.ru/ru/docs/warnings/v117/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 16\. Паттерн 8\. [Memsize\-типы в объединениях](https://pvs-studio.ru/ru/blog/lessons/0016/)\.

### 3\.17\. Опасное выражение в качестве аргумента функции malloc\(\)

Описание:

* Документация по PVS\-Studio\. [V118\. malloc\(\) function accepts a dangerous expression in the capacity of an argument](https://pvs-studio.ru/ru/docs/warnings/v118/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 9\. Паттерн 1\. [Магические числа](https://pvs-studio.ru/ru/blog/lessons/0009/)\.

### 3\.18\. Некорректные вычисления размеров объектов с использованием нескольких операторов sizeof\(\)

Описание:

* Документация по PVS\-Studio\. [V119\. More than one sizeof\(\) operators are used in one expression](https://pvs-studio.ru/ru/docs/warnings/v119/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 21\. Паттерн 13\. [Выравнивание данных](https://pvs-studio.ru/ru/blog/lessons/0021/)\.

### 3\.19\. Оператор new принимает в качестве аргумента выражение 32\-битного типа

Описание:

* Документация по PVS\-Studio\. [V121\. Implicit conversion of the type of 'new' operator's argument to size\_t type](https://pvs-studio.ru/ru/docs/warnings/v121/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.

### 3\.20\. Явное приведение 32\-битного типа к memsize\-типу

Описание:

* Документация по PVS\-Studio\. [V201\. Explicit type conversion\. Type casting to memsize](https://pvs-studio.ru/ru/docs/warnings/v201/)\.

### 3\.21\. Явное приведение memsize\-типа к 32\-битному типу

Описание:

* Документация по PVS\-Studio\. [V202\. Explicit type conversion\. Type casting from memsize to 32\-bit](https://pvs-studio.ru/ru/docs/warnings/v202/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 15\. Паттерн 7\. [Упаковка указателей](https://pvs-studio.ru/ru/blog/lessons/0015/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Поиск ошибок явного приведения типа в 64\-битных программах](https://pvs-studio.ru/ru/blog/posts/cpp/0007/)\.

**Примечание к таблице**

Компилятор Visual C\+\+ диагностирует только явное приведение указателей к 32\-битным типам данных, а не всех memsize\-типам\.

### 3\.22\. Некорректно объявленные виртуальные функции

Описание:

* Документация по PVS\-Studio\. [V301\. Unexpected function overloading behavior\. See N argument of function 'foo' in derived class 'derived' and base class 'base'](https://pvs-studio.ru/ru/docs/warnings/v301/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 12\. Паттерн 4\. [Виртуальные функции](https://pvs-studio.ru/ru/blog/lessons/0012/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Проблемы 64\-битного кода в реальных программах: виртуальные функции](https://pvs-studio.ru/ru/blog/posts/cpp/0026/)\.

**Примечание к таблице**

Компилятор Visual C\+\+ диагностирует все ситуации, когда прототип функции в классе наследнике, отличается от прототипа функции в базовом классе, объявленной как виртуальной\. В результате выдается множество предупреждений не связанных с 64\-битными дефектами, что осложняет использование данной проверки\. При компиляции 32\-битного проекта данный вид ошибки вообще не обнаруживается компилятором\.

### 3\.23\. Опасный оператор \[\]

Описание:

* Документация по PVS\-Studio\. [V302\. Member operator\[\] of 'foo' class has a 32\-bit type argument\. Use memsize\-type here](https://pvs-studio.ru/ru/docs/warnings/v302/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Поиск 64\-битных ошибок в реализации массивов](https://pvs-studio.ru/ru/blog/posts/cpp/0046/)\.

### 3\.24\. Использование устаревших функций

Описание:

* Документация по PVS\-Studio\. [V303\. The function is deprecated in the Win64 system\. It is safer to use the 'foo' function](https://pvs-studio.ru/ru/docs/warnings/v303/)\.

### 3\.25\. Ошибка переполнения или неполной обработки буфера

Описание:

* Документация по PVS\-Studio\. ~~V320\. A call of the 'foo' function will lead to a buffer overflow or underflow in a 64\-bit system\.~~

**Примечание к таблице**

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

### 3\.26\. Поиск структур, размер которых можно уменьшить без потери производительности

Описание:

* Документация по PVS\-Studio\. [V802\. The structure's size can be decreased via changing the fields' order\. The size can be reduced from N to K bytes](https://pvs-studio.ru/ru/docs/warnings/v802/)\.
* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 23\. Паттерн 15\. [Рост размеров структур](https://pvs-studio.ru/ru/blog/lessons/0023/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Viva64 для оптимизации структур данных](https://pvs-studio.ru/ru/blog/posts/cpp/0004/)\.

**Примечание к таблице**

Компилятор Visual C\+\+ уведомляет обо всех пустых промежутках между полями в структур, которые возникают из\-за выравнивания данных\. Эту информацию можно использовать для поиска неоптимальных структур, однако на практике это затруднительно\.

### 3\.27\. Использование функции без её предварительного объявления \(в языке Си\)

Описание:

* Документация по PVS\-Studio\. [V102\. Usage of non memsize type for pointer arithmetic](https://pvs-studio.ru/ru/docs/warnings/v102/)\.
* Андрей Карпов\. Блог ООО "СиПроВер"\. [Красивая 64\-битная ошибка на языке Си](https://pvs-studio.ru/ru/blog/posts/cpp/0033/)\.

**Примечание к таблице**

Анализатор диагностирует этот вид ошибок косвенно, выдавая предупреждение о приведения типа int к указателю\.

### 3\.28\. Некорректные \#ifdef\.\.\#else

Описание:

* Андрей Карпов\. [Коллекция примеров 64\-битных ошибок в реальных программах](https://pvs-studio.ru/ru/blog/posts/cpp/a0065/)\. Пример 3\.

### 3\.29\. Ошибки сериализации \(изменение размеров типов, изменение порядка байт\)

Описание:

* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 19\. Паттерн 11\. [Сериализация и обмен данными](https://pvs-studio.ru/ru/blog/lessons/0019/)\.

### 3\.30\. Ошибки перенаправления \(связанные с WoW64\)

Описание:

* Андрей Карпов\. [Коллекция примеров 64\-битных ошибок в реальных программах](https://pvs-studio.ru/ru/blog/posts/cpp/a0065/)\. Пример 30\.

### 3\.31\. Изменение поведения при использовании перегруженных функций

Описание:

* Уроки разработки 64\-битных приложений на языке Си/Си\+\+\. Урок 22\. Паттерн 14\. [Перегруженные функции](https://pvs-studio.ru/ru/blog/lessons/0022/)\.

## Заключение

Статический анализатор Viva64, входящий в состав [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) в несколько раз превосходит возможности Visual C\+\+ 2010 и компонент Code Analysis for C/C\+\+ по выявлению 64\-битных дефектов\. При этом анализатор может быть одинаково эффективно использован как при разработке новых 64\-битных проектов, так и при подготовке 32\-битного кода к переносу на 64\-битную систему\. Анализатор Viva64 также помогает в оценке стоимости переноса приложения на 64\-битную систему, что описано в "[Урок 28\. Оценка стоимости процесса 64\-битной миграции Си/Си\+\+ приложений](https://pvs-studio.ru/ru/blog/lessons/0028/)"\.