Сравнение возможностей PVS-Studio иVisual Studio 2010 по выявлениюдефектов в 64-битных программахАвтор: Андрей КарповДата:...
Также отметим, что с помощью ключа /Wall включены все предупреждения компилятора VisualC++, то есть полностью используются...
Таблица 1 - Сравнение возможностей компилятора Visual C++ 2010, Code Analysis for C/C++ (VisualStudio 2010 Premium) и Viva...
Таблица 2 - Сравнение возможностей компилятора Visual C++ 2010, Code Analysis for C/C++ (VisualStudio 2010 Premium) и Viva...
•   Андрей Карпов. Блог ООО "СиПроВер". Проблемы 64-битного кода в реальных       программах: FreeBSD.3.4. Неявное приведе...
3.9. Неявное приведение 32-битного типа к memsize-типу внутриоператора returnОписание:   •   Документация по PVS-Studio. V...
3.14. Некорректное изменение типа указателяОписание:   •   Документация по PVS-Studio. V114. Dangerous explicit type point...
3.20. Явное приведение 32-битного типа к memsize-типуОписание:   •   Документация по PVS-Studio. V201. Explicit type conve...
3.25. Ошибка переполнения или неполной обработки буфераОписание:   •   Документация по PVS-Studio. V320. A call of the foo...
•   Уроки разработки 64-битных приложений на языке Си/Си++. Урок 19. Паттерн 11.       Сериализация и обмен данными.3.30. ...
Сравнение возможностей PVS-Studio и Visual Studio 2010 по выявлению дефектов в 64-битных программах
Сравнение возможностей PVS-Studio и Visual Studio 2010 по выявлению дефектов в 64-битных программах
Сравнение возможностей PVS-Studio и Visual Studio 2010 по выявлению дефектов в 64-битных программах
Сравнение возможностей PVS-Studio и Visual Studio 2010 по выявлению дефектов в 64-битных программах
Upcoming SlideShare
Loading in...5
×

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

522

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
522
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Сравнение возможностей PVS-Studio иVisual Studio 2010 по выявлениюдефектов в 64-битных программахАвтор: Андрей КарповДата: 06.07.2010АннотацияВ статье сравниваются три механизма анализа кода с точки зрения выявления 64-битных ошибок:компилятор Visual C++2010, компонент Code Analysis for C/C++ входящий в состав Visual Studio2010 Premium/Ultimate и анализатор Viva64 входящий в состав PVS-Studio 3.60. Показанывозможности как по выявлению дефектов в 64-битных проектах, так и предварительнойдиагностики 64-битных ошибок еще в 32-битном проекте.ВведениеНаша компания ООО "Системы программной верификации" разрабатывает специализированныйстатический анализатор кода Viva64, предназначенный для выявления 64-битных ошибок вWindows-приложениях. Анализатор Viva64 входит в состав пакета 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-битных ошибоки покажем их эффективность при проверке 32-битных и 64-битных проектов. В третьем разделестатьи будут даны ссылки, поясняющие каждый из паттернов ошибок, а также даны комментариик таблицам сравнения. Тестовый проект, на котором происходило сравнение и который содержитвсе паттерны ошибок, доступен для скачивания по адресу http://www.viva64.com/external-pictures/ErrorExamples-vs2010-project.7z.1. Сравнение инструментов при анализе 64-битного проектаСравнение инструментов и процент найденных дефектов при анализе 64-битных проектовприведены в таблице 1. Обратите внимание, что колонка относящаяся к Code Analysis for C/C++пуста. Причина в том, что на данный момент Code Analysis for C/C++ не работает с 64-битнымипроектами.
  2. 2. Также отметим, что с помощью ключа /Wall включены все предупреждения компилятора VisualC++, то есть полностью используются его диагностические возможности. При этом ключ /Wp64отсутствует, так как он игнорируется (не имеет смысла) при компиляции 64-битных проектов.Цветовая раскраска ячеек (легенда): • Серый - не диагностируется. • Голубой фон - диагностируется частично (смотри пояснения в третьем разделе). • Зеленый фон - диагностируется.
  3. 3. Таблица 1 - Сравнение возможностей компилятора Visual C++ 2010, Code Analysis for C/C++ (VisualStudio 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-битную систему. 2. Заранее устранить как можно большее количество 64-битных ошибок еще до начала миграции приложения.Сравнение инструментов и процент найденных дефектов при анализе 32-битных проектовприведено в таблице 2.Для компилятора Visaul C++ указаны ключи /Wall и /Wp64, чтобы с максимально полноиспользовать его диагностические возможности. Для модуля Code Analysis for C/C++ такжевключены все возможные предупреждения.Цветовая раскраска ячеек (легенда): • Серый - не диагностируется. • Голубой фон - диагностируется частично (смотри пояснения в третьем разделе). • Зеленый фон - диагностируется.
  4. 4. Таблица 2 - Сравнение возможностей компилятора Visual C++ 2010, Code Analysis for C/C++ (VisualStudio 2010 Premium) и Viva64 (PVS-Studio 3.60) по выявлению 64-битных ошибок в 32-битномпроектеВыводДиагностические возможности статического анализатора Viva64 в несколько раз превосходятвозможности Visual C++ 2010 при поиске 64-битных ошибок в 32-битных проектах.Диагностические возможности Visual C++ 2010 при анализе 32-битных проектов хуже, чем прианализе 64-битных. Это связано с тем, что при компиляции 32-битных проектов компиляториспользует другую модель данных (ILP32).Компонент Code Analysis for C/C++ представляет собой статический анализатор общего назначенияи не помогает в выявлении рассматриваемого нами класса 64-битных ошибок.Анализатор Viva64 выполнил анализ тестового проекта одинаково полно как для 32-битных, так идля 64-битных проектов. На практике анализатор Viva64 все же может выдать меньшепредупреждений при анализе 32-битного проекта, пропустив до 5% ошибок. Подробнее смотри -Урок 28. Оценка стоимости процесса 64-битной миграции Си/Си++ приложений.3. Описание параметров, по которым производилось сравнениеПодробное описание в статье каждого паттерна ошибок займет крайне много места. Ограничимсятолько ссылками на различные ресурсы, где можно в подробностях ознакомиться с каждым изпаттернов и посмотреть различные примеры. Также даны поясняющие комментарии, почемунекоторые виды ошибок диагностируются только частично.3.1. Неявное приведение 32-битного типа к memsize-типуОписание: • Документация по PVS-Studio. V101. Implicit assignment type conversion to memsize type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 11. Паттерн 3. Операции сдвига. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.3.2. Опасная адресная арифметикаОписание: • Документация по PVS-Studio. V102. Usage of non memsize type for pointer arithmetic. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 13. Паттерн 5. Адресная арифметика.3.3. Неявное приведение memsize-типа к 32-битному типуОписание: • Документация по PVS-Studio. V103. Implicit type conversion from memsize type to 32-bit type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.
  5. 5. • Андрей Карпов. Блог ООО "СиПроВер". Проблемы 64-битного кода в реальных программах: FreeBSD.3.4. Неявное приведение 32-битного типа к memsize-типу в операциисравненияОписание: • Документация по PVS-Studio. V104. Implicit type conversion to memsize type in an arithmetic expression. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика. • Андрей Карпов. Блог ООО "СиПроВер". Почему A + B != A - (-B).3.5. Неявное приведение 32-битного типа к memsize-типу в тернарнойоперацииОписание: • Документация по PVS-Studio. V105. N operand of ?: operation: implicit type conversion to memsize type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.3.6. Неявное приведение 32-битного типа к memsize-типу при вызовефункцииОписание: • Документация по PVS-Studio. V106. Implicit type conversion N argument of function foo to memsize type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.3.7. Неявное приведение memsize-типа к 32-битному типу при вызовефункцииОписание: • Документация по PVS-Studio. V107. Implicit type conversion N argument of function foo to 32-bit type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.3.8. В качестве индекса используется не memsize-типОписание: • Документация по PVS-Studio. V108. Incorrect index type: foo[not a memsize-type]. Use memsize type instead. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 13. Паттерн 5. Адресная арифметика.
  6. 6. 3.9. Неявное приведение 32-битного типа к memsize-типу внутриоператора returnОписание: • Документация по PVS-Studio. V109. Implicit type conversion of return value to memsize type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.3.10. Неявное приведение memsize-типа к 32-битному типу внутриоператора returnОписание: • Документация по PVS-Studio. V110. Implicit type conversion of return value from memsize type to 32-bit type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.3.11. Функции с переменным количеством аргументом в качествепараметра передается значение memsize-типаОписание: • Документация по PVS-Studio. V111. Call function foo with variable number of arguments. N argument has memsize type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 10. Паттерн 2. Функции с переменным количеством аргументов.3.12. Опасное магическое числоОписание: • Документация по PVS-Studio. V112. Dangerous magic number N used. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 9. Паттерн 1. Магические числа.3.13. Попытка хранение значения memsize-типа в переменной типаdoubleОписание: • Документация по PVS-Studio. V113. Implicit type conversion from memsize to double type or vice versa. • Документация по PVS-Studio. V203. Explicit type conversion from memsize to double type or vice versa. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 18. Паттерн 10. Хранение в double целочисленных значений.Примечание к таблицеПри сборке 32-битного проекта компилятор Visual C++ предупреждает только о приведении типаdouble к size_t, и не предупреждает о приведении типа size_t к double.
  7. 7. 3.14. Некорректное изменение типа указателяОписание: • Документация по PVS-Studio. V114. Dangerous explicit type pointer conversion. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 14. Паттерн 6. Изменение типа массива. • Андрей Карпов. Блог ООО "СиПроВер". Проблемы 64-битного кода в реальных программах: изменение типа указателя.3.15. Использование memsize типов при работе с исключениямиОписание: • Документация по PVS-Studio. V115. Memsize type is used for throw. • Документация по PVS-Studio. V116. Memsize type is used for catch. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 20. Паттерн 12. Исключения.3.16. Наличие memsize-типов в объединенияхОписание: • Документация по PVS-Studio. V117. Memsize type is used in the union. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 16. Паттерн 8. Memsize- типы в объединениях.3.17. Опасное выражение в качестве аргумента функции malloc()Описание: • Документация по PVS-Studio. V118. malloc() function accepts a dangerous expression in the capacity of an argument. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 9. Паттерн 1. Магические числа.3.18. Некорректные вычисления размеров объектов с использованиемнескольких операторов sizeof()Описание: • Документация по PVS-Studio. V119. More than one sizeof() operators are used in one expression. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 21. Паттерн 13. Выравнивание данных.3.19. Оператор new принимает в качестве аргумента выражение 32-битного типаОписание: • Документация по PVS-Studio. V121. Implicit conversion of the type of new operators argument to size_t type. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 17. Паттерн 9. Смешанная арифметика.
  8. 8. 3.20. Явное приведение 32-битного типа к memsize-типуОписание: • Документация по PVS-Studio. V201. Explicit type conversion. Type casting to memsize.3.21. Явное приведение memsize-типа к 32-битному типуОписание: • Документация по PVS-Studio. V202. Explicit type conversion. Type casting from memsize to 32- bit. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 15. Паттерн 7. Упаковка указателей. • Андрей Карпов. Блог ООО "СиПроВер". Поиск ошибок явного приведения типа в 64-битных программах.Примечание к таблицеКомпилятор 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. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 12. Паттерн 4. Виртуальные функции. • Андрей Карпов. Блог ООО "СиПроВер". Проблемы 64-битного кода в реальных программах: виртуальные функции.Примечание к таблицеКомпилятор Visual C++ диагностирует все ситуации, когда прототип функции в классе наследнике,отличается от прототипа функции в базовом классе, объявленной как виртуальной. В результатевыдается множество предупреждений не связанных с 64-битными дефектами, что осложняетиспользование данной проверки. При компиляции 32-битного проекта данный вид ошибкивообще не обнаруживается компилятором.3.23. Опасный оператор []Описание: • Документация по PVS-Studio. V302. Member operator[] of foo class has a 32-bit type argument. Use memsize-type here. • Андрей Карпов. Блог ООО "СиПроВер". Поиск 64-битных ошибок в реализации массивов.3.24. Использование устаревших функцийОписание: • Документация по PVS-Studio. V303. The function is deprecated in the Win64 system. It is safer to use the foo function.
  9. 9. 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. V401. The structures size can be decreased via changing the fields order. The size can be reduced from N to K bytes. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 23. Паттерн 15. Рост размеров структур. • Андрей Карпов. Блог ООО "СиПроВер". Viva64 для оптимизации структур данных.Примечание к таблицеКомпилятор Visual C++ уведомляет обо всех пустых промежутках между полями в структур,которые возникают из-за выравнивания данных. Эту информацию можно использовать дляпоиска неоптимальных структур, однако на практике это затруднительно.3.27. Использование функции без её предварительного объявления (вязыке Си)Описание: • Документация по PVS-Studio. V102. Usage of non memsize type for pointer arithmetic. • Андрей Карпов. Блог ООО "СиПроВер". Красивая 64-битная ошибка на языке Си.Примечание к таблицеАнализатор диагностирует этот вид ошибок косвенно, выдавая предупреждение о приведениятипа int к указателю.3.28. Некорректные #ifdef..#elseОписание: • Андрей Карпов. Коллекция примеров 64-битных ошибок в реальных программах. Пример 3.3.29. Ошибки сериализации (изменение размеров типов, изменениепорядка байт)Описание:
  10. 10. • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 19. Паттерн 11. Сериализация и обмен данными.3.30. Ошибки перенаправления (связанные с WoW64)Описание: • Андрей Карпов. Коллекция примеров 64-битных ошибок в реальных программах. Пример 30.3.31. Изменение поведения при использовании перегруженных функцийОписание: • Уроки разработки 64-битных приложений на языке Си/Си++. Урок 22. Паттерн 14. Перегруженные функции.ЗаключениеСтатический анализатор Viva64, входящий в состав PVS-Studio в несколько раз превосходитвозможности Visual C++ 2010 и компонент Code Analysis for C/C++ по выявлению 64-битныхдефектов. При этом анализатор может быть одинаково эффективно использован как приразработке новых 64-битных проектов, так и при подготовке 32-битного кода к переносу на 64-битную систему. Анализатор Viva64 также помогает в оценке стоимости переноса приложения на64-битную систему, что описано в "Урок 28. Оценка стоимости процесса 64-битной миграцииСи/Си++ приложений".

×