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

Like this? Share it with your network

Share

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

  • 750 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
750
On Slideshare
750
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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. Также отметим, что с помощью ключа /Wall включены все предупреждения компилятора VisualC++, то есть полностью используются его диагностические возможности. При этом ключ /Wp64отсутствует, так как он игнорируется (не имеет смысла) при компиляции 64-битных проектов.Цветовая раскраска ячеек (легенда): • Серый - не диагностируется. • Голубой фон - диагностируется частично (смотри пояснения в третьем разделе). • Зеленый фон - диагностируется.
  • 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. Таблица 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. • Андрей Карпов. Блог ООО "СиПроВер". Проблемы 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. 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. 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. 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. 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. • Уроки разработки 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-битной миграцииСи/Си++ приложений".