SlideShare una empresa de Scribd logo
1 de 54
PVS-Studio, решение для разработки современных ресурсоемких приложений ООО «СиПроВер»  («Системы программной верификации») www.viva64.com
Инструмент PVS-Studio набор правил Viva64 для анализа 64-битных приложений; набор правил VivaMP для анализа параллельных приложений; набор правил для анализа общего назначения. Лицензионная и ценовая политикаPVS-Studio Информация о компании ООО «СиПроВер» Содержание
Инструмент PVS-Studio Анализ исходного кода приложений на языке Си/Си++
PVS-Studio – статический анализатор кода, который предназначен для разработчиков современных ресурсоемких приложений  В состав PVS-Studio входят три набора диагностических правил: Viva64, для выявления ошибок при разработки и миграции 64-битных приложений; VivaMP, для выявления параллельных ошибок в коде программ, разработанных с использованием технологии OpenMP; Для выявления ошибок общего плана, таких как опечатки, переполнение буфера, ошибки в условиях и так далее.
ошибки миграции 32-битных приложений на 64-битные системы;  ошибки, возникающие при разработке новых 64-битных приложений;  ошибки в параллельных программах, связанные с недостаточным знанием технологии OpenMP;  ошибки из-за некорректной работы с памятью в параллельном коде (незащищенный доступ к общей памяти, отсутствие синхронизации, неправильный режим доступа к переменным, и т. п.); выявление логических ошибок, некорректное использование алгоритмов и контейнеров, переполнение буферов; выявление опечаток, допущенных в ходе копирования фрагментов кода или по невнимательности; неоптимальные конструкции, которые легко могут быть оптимизированы. PVS-Studio обнаруживает следующие типы дефектов в Си/Си++ коде
разрабатывает новые 64-битные приложения;  выполняет миграцию 32-битного кода на 64-битные системы;  добавляет в программу поддержку параллельного исполнения с помощью технологии OpenMP; хочет повысить качество и надежность кода; по-возможности выявить как можно больше ошибок на этапе разработки. Анализатор кода PVS-Studio нужен тем, кто
Легко скачать: http://www.viva64.com/ru/pvs-studio-download/ Легко попробовать: PVS-Studio интегрируется в Visual Studio; В дистрибутивеидут примерыпрограмм с ошибками. Легко купить (онлайн или через банк): http://www.viva64.com/ru/order/ Почему PVS-Studio?
Особенности PVS-Studio интеграцияс Visual Studio2005/2008/2010; поддержка Си и Си++; поддержка C++0x в рамках возможностей Visual Studio 2010; подробная справочная система (в том числе на русском языке; простота использования; удобная система фильтрации и подавления ошибок; анализ файлов в параллельном режиме.
Внешний вид PVS-Studio
Онлайн-документация(также доступен PDF файл)
Легко посмотреть работуPVS-Studio с помощью демонстрационного проекта OmniSample, включенного в дистрибутив
Некоторые наши пользователи www.viva64.com/ru/customers/
Viva64, набор правил для анализа 64-битных приложений
Проблема переноса приложений на 64-битные платформы ,[object Object]
Миграция C/C++ приложений наиболее затруднена из-за особенностей языка.
При миграции возможно появление в программах ошибок, которые не удается диагностировать существующими методиками тестирования.
Сложно убедится в корректности современных программ после переноса их на 64-битные системы (в MS-DOS 1.0 было 4 000 строк кода, а в Windows Vista  уже 50 000 000). Поэтому и нельзя обратиться к опыту прошлых переходов.,[object Object]
Приведем примеры ошибок, обнаруживаемых Viva64
Проблема с перекрытыми виртуальными функциями Базовый класс: classCWinApp { virtualvoidWinHelp(DWORD_PTR, UINT);  	}; Код пользователя: class CMyApp : public CWinApp { virtualvoidWinHelp(DWORD, UINT);  }; 32-битная система: 64-битная система:
Адресная арифметика с указателями int A = -2; unsigned B = 1; int array[5] = { 1, 2, 3, 4, 5 }; int *ptr = array + 3; ptr = ptr + (A + B); printf("%i", *ptr); Переменная A типа int приводится к типу unsigned; Происходит сложение A и B. В результате мы получаем значение 0xFFFFFFFF типа unsigned; Вычисляется выражение "ptr + 0xFFFFFFFFu". Результат зависит от размерности указателя на данной платформе. В 32-битной программе, выражение будет эквивалентно "ptr - 1" и мы успешно распечатаем число 3. В 64-битной программе к указателю прибавится значение 0xFFFFFFFFu, в результате чего указатель окажется далеко за пределами массива.
Бесконечные циклы boolIsPresent(char *array, size_tarraySize, char key) { for (unsigned i = 0; i != arraySize; ++i) if (array[i] == key)     return true;   return false; } Данный код приведет к возникновению бесконечного цикла, еслиarraySizeпревысит значение UINT_MAX. Выявление подобных ошибок с использованием unit-тестов или динамических анализаторов (BoundsChecker) крайне осложнено необходимостью запуска на больших объеме данных. При обработке малого объема данных ошибка выявлена не будет
Ошибки в операциях сдвига ptrdiff_t SetBitN(ptrdiff_t value, unsigned bitNum) {   ptrdiff_t mask = 1 << bitNum;   return value | mask; } Код установки заданного бита в единицу. Первая ошибка заключается в сдвиге знаковой переменной. При выставлении 31-го бита на 64-битной системе результатом работы функции будет значение 0xffffffff80000000 Вторая ошибка связана с тем, что данный код никогда не выставит биты, с номерами 32-63. Обратите внимание, что "1" имеет тип int и при сдвиге на 32 позиции произойдет переполнение. Получим мы в результате 0 (A) или 1 (B) зависит от реализации компилятора.
Ошибки использования магических чисел #define N_COUNT 100 int **pArray = (int**) malloc(N_COUNT * 4); hFileMapping = CreateFileMapping (     (HANDLE) 0xFFFFFFFF,     NULL,     PAGE_READWRITE,     (DWORD) 0,     (DWORD) (szBufIm),     (LPCTSTR) &FileShareNameMap[0]); size_t n, newexp; n = n >> (32 - newexp); Наиболее распространенные магические значения, опасные при переносе приложений с 32-битной на 64-битную платформу
Переполнение в арифметических выражениях, где совместно используются 32-битные и 64-битные типы данных ptrdiff_t UnsafeCalcIndex(int x, int y, int width) { return x + y * width; } ... intdomainWidth = 50000; intdomainHeght = 50000;   for (int x = 0; x != domainWidth; ++x)   for (int y = 0; y != domainHeght; ++y)     array[UnsafeCalcIndex(x, y, domainWidth)] = 1; Данный код не может корректно заполнить массив, состоящий из 50000*50000 элементов. При вычислении выражения "x + y * width" происходит переполнениеи результатом будет выход за границы массива.
Ошибки неявного приведения типа size_t __fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp);   size_tfread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp) { int ret; 	FLOCKFILE(fp); ret = __fread(buf, size, count, fp); 	FUNLOCKFILE(fp); return (ret); } Функция __fread возвращает тип size_t, но для хранения количества прочитанных байт используется тип int. В результате при больших объемах читаемых данных функция может вернуть не то количество байт, которое на самом деле будет прочитано.
Показанный ранее пример взят из исходного кода FreeBSD.Ошибка была поправлена только в декабре 2008 года!Это при том, что первая (экспериментальная) 64-битная версия FreeBSD вышла еще в июне 2003 года.
Были исследованы паттерны 64-битных ошибок в коде по более чем 100 различным статьямв печатных и электронных изданиях. Учтен собственный опыт миграции кода пакетов численного моделирования и визуализации на C++. В ходе исследований создана база из нескольких десятков различных паттернов ошибок, связанных с переносом кода на 64-битные системы. В базу попали как известные (опубликованные) ошибки, так и неизвестные ранее. На основе выявленных паттернов ошибок сформулированы правила их диагностики. И паттерны ошибок, и правила диагностики опубликованы в наших статьях и доступны для ознакомления всем желающим. Как мы делали анализатор 64-битного кода
Сравнение: Viva64,VC++ (/Wp64), C++Test и PC-Lint В таблице представлено сравнение на конец 2008 года. На данный момент PVS-Studio реализует значительно больше возможностей.
Компания E.G.S. S.r.l. занимается  	разработкой решений в области  	моделирования трехмерных объектов  	на базе триангулированных сеток. Применение Viva64 для проверки CAD-системыLeios Studio компании EGS S.r.l.
Применение Viva64 для проверки CAD-системыLeios Studio компании EGS S.r.l. (продолжение) Общий объем исходного кода Leios Studio составляет 13 мегабайт (440 000 строк кода). Миграция кода с использованием Viva64 позволила сэкономить много времени, которое бы пришлось затратить на ручной просмотр кода. Основные проблемные моменты, выявленные в процессе автоматического анализа кода с помощью инструмента Viva64: особенности вычислительных алгоритмов при обработке больших объемов данных;  работа с файлами большого размера;  обработка 3d-моделей, содержащих большое количество треугольников (чем больше треугольников, тем точнее модели);  работа подсистемы лицензирования;  Подробности: http://www.viva64.com/art-1-1-3164907581.html
Размер проекта:  1.5Mb, 125 файлов Выявлено  	потенциально-опасныхконструкций с помощью Viva64: 89 Из них реальных ошибок: 6 Статистика по выявленным ошибкам в библиотеке Loki http://loki-lib.sourceforge.net Подробности: http://www.viva64.com/en/a/0049/
VivaMP, набор правил для анализа параллельных (OpenMP) приложений
Проблемы в коде программ, использующих OpenMP Отсутствие ключевых слов в директивах Неправильная работа с блокировками Зависимость поведения кода от количества выполняющих его потоков Одновременная работа с общим ресурсом Незащищенный доступ к общей памяти Неосторожное использование локальных переменных Ненужная защита памяти от одновременной записи Ошибки производительности
Приведем примеры ошибок, обнаруживаемых VivaMP
Необработанные исключения в параллельных секциях #pragmaomp parallel for for (size_t i = 0; i != n; ++i) { float *array =new float[10000];   delete [] array; } Пример приведет к некорректному поведению программы и, скорее всего, к ее аварийному завершению, если произойдет ошибка выделения памяти. Ошибка связанна с выбрасыванием исключения из параллельной секции. Согласно спецификации OpenMP, если вы используете исключения внутри параллельной секции, то все эти исключения должны быть обработаны внутри этой секции. Если вы используете внутри параллельной секции оператор new, то вы должны позаботиться о перехвате исключения, которое согласно стандарту языка Си++ будет сгенерировано при ошибке выделения памяти.
Ошибки невнимательного использования директив и функций OpenMP
Ошибки состояния гонки (racecondition) int a = 0; #pragmaomp parallel for num_threads(4) for (inti = 0; i < 100000; i++) { a++; } Состояние гонки возникает тогда, когда несколько потоков многопоточного приложения пытаются одновременно получить доступ к данным, причем хотя бы один поток выполняет запись. Состояния гонки могут давать непредсказуемые результаты, и зачастую их сложно выявить. Иногда последствия состояния гонки проявляются только через большой промежуток времени и в совсем другой части приложения. Кроме того, ошибки такого рода невероятно сложно воспроизвести повторно.  Крайне эффективным является выявление по крайней мере части таких ошибок с помощью статического анализа еще на этапе написания кода.
Ошибки инициализации статических объектов в параллельных секциях pragmaomp parallel {   static intst =      Calc();   ... } Статическая переменная начнет процесс инициализации сразу в нескольких потоках, что может привести к неопределенному результату. Неприятность подобных ошибок заключается в их нестабильном и редком проявлении во время тестирования.
Набор правил анализа общего назначения
Основное преимущество статического анализа – обнаружение ошибок на самых ранних этапах Соотношение стоимость исправления дефектов в зависимости от времени их внесения и обнаружения. Данные для таблицы взяты из книги С. Макконнелла «Совершенный Код».
Обнаружение любого вида ошибки на этапе кодирования выгодно Не важно, какова сложность ошибки. Простая это опечатка, или ошибка в логике алгоритма. Обнаружение хотя бы части таких ошибок еще на этапе написания кода весьма выгодно. Это существенно сокращает затраты на тестирование и дальнейшее сопровождение кода. Анализатор PVS-Studio диагностирует большое количество разнообразнейших видов ошибок. Перечислить все типы обнаруживаемых ошибок достаточно сложно. Подробно со списком диагностических проверок можно ознакомиться в документации. Документация (онлайн): http://www.viva64.com/ru/d/
Примеры ошибок, обнаруживаемыханализатором общего назначения
Некорректное условие intiChilds[2];   ... boolhasChilds() const { return(iChilds > 0 || iChilds > 0); } В данном случае, хотя код успешно и без предупреждений компилируется, он не имеет смысла. Корректный код должен был выглядеть следующим образом: intiChilds[2];   ... boolhasChilds() const { return(iChilds[0] > 0 || iChilds[1] > 0); }
Ссылка на уже уничтоженный объект structCVariable {   char  name[64]; }; void CRendererContext::RiGeometryV(int n, char *tokens[]){   for (i=0;i<n;i++) { CVariablevar;     if (parseVariable(&var, NULL, tokens[i])) tokens[i]  =  var.name; } } Указатель на массив, находящийся в переменной типа CVariable, сохраняется во внешнем массиве. В результате массив "tokens" после завершения функции RiGeometryV будет содержать указатели на уже несуществующие объекты.
Неполная очистка буфера MD5Context *ctx; ... memset(ctx, 0, sizeof(ctx)); Здесь из-за опечатки очищается не вся структура, а только ее часть. Ошибка в том, что вычисляется размер указателя, а не структуры MD5Context. Корректный вариант кода: MD5Context *ctx; ... memset(ctx, 0, sizeof(*ctx));
Ошибка в цепочке if - else - if - else if (a == 1)   Foo1(); else if (a == 2)   Foo2(); else if (a == 1)   Foo3(); В этом коде функции 'Foo3()' никогда не получит управления.
Опечатка. Двойное присваивание. CSize(POINT pt) { cx = pt.x;  cx = pt.y; } Код взят из реального приложения, где был реализован свой собственный класс CSize. Корректный вариант должен был конечно выглядеть так: CSize(POINT pt) { cx = pt.x;  cy = pt.y; } Опечатка. Лишняя ‘;’. for (i = 0; i < n; i++); {   Foo(i); }
Неверное использование std::remove void unregisterThread() {   Guard<TaskQueue> g(_taskQueue);   std::remove(_threads.begin(), _threads.end(), ThreadImpl::current()); } Функция std::remove не удаляет элементы из контейнера. Она только сдвигает элементы и возвращает итератор на начало мусора. Пусть мы имеем контейнер vector<int>, содержащий элементы 1,2,3,1,2,3,1,2,3. Если выполнить код "remove( v.begin(), v.end(), 2 )", то контейнер будет содержать элементы 1,3,1,3,?,?,?, где ? - некий мусор. При этом функция вернет итератор на первый мусорный элемент, и если мы хотим удалить эти мусорные элементы, то должны написать код: "v.erase(remove(v.begin(), v.end(), 2), v.end())".
Лицензионная и ценовая политика PVS-Studio
PVS-Studio: цены Страница заказа:   http://www.viva64.com/ru/order/
возможность получения новых версий (включая major-версии) в течение 1 года;  возможность получения поддержки по электронной почте в течение 1 года;  неограниченное по времени право использования программы. После 1 года с момента приобретения лицензии, вы сможете по-прежнему получать новые версии PVS-Studio и обращаться в поддержку. Ограничения будут касаться только новых диагностических возможностей, которые появятся в анализаторе уже после истечения срока действия лицензии. Что включено в цену помимо права пользования?
Информация о компании
Свидетельство об официальной регистрации программ для ЭВМ N2007614164, «Вива64». Зарегистрировано в Реестре программ для ЭВМ  28 сентября 2007 г. Свидетельство об официальной регистрации программ для ЭВМ N2008610480, «Библиотека анализа кода VivaCore». Зарегистрировано в Реестре программ для ЭВМ 25 января 2008 г. Свидетельство об официальной регистрации программ для ЭВМ N2008612845, «Вива64 2.0». Зарегистрировано в Реестре программ для ЭВМ 29 мая 2008 г. Интеллектуальная собственность
Наши статьи опубликованы на крупнейших программистских сайтах http://www.viva64.com/ru/experience/

Más contenido relacionado

La actualidad más candente

ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 

La actualidad más candente (20)

Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCore
 
Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0x
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
 
20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
64-битная версия Loki
64-битная версия Loki64-битная версия Loki
64-битная версия Loki
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороны
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Buffer overflow and other software vulnerabilities: theory and practice of pr...
Buffer overflow and other software vulnerabilities: theory and practice of pr...Buffer overflow and other software vulnerabilities: theory and practice of pr...
Buffer overflow and other software vulnerabilities: theory and practice of pr...
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 

Destacado (7)

10 Wilken Credit Debt
10 Wilken Credit Debt10 Wilken Credit Debt
10 Wilken Credit Debt
 
Õppematerjalide koostamine LeMill keskkonnas
Õppematerjalide koostamine LeMill keskkonnasÕppematerjalide koostamine LeMill keskkonnas
Õppematerjalide koostamine LeMill keskkonnas
 
An Instantaneous Introduction to the Alliance Access Grid
An Instantaneous Introduction to the Alliance Access GridAn Instantaneous Introduction to the Alliance Access Grid
An Instantaneous Introduction to the Alliance Access Grid
 
Sustainability Matters - Ecobuild update 2010
Sustainability Matters - Ecobuild update 2010Sustainability Matters - Ecobuild update 2010
Sustainability Matters - Ecobuild update 2010
 
NathaliaBainas
NathaliaBainasNathaliaBainas
NathaliaBainas
 
Presentación - Tablas - Teoría
Presentación - Tablas - TeoríaPresentación - Tablas - Teoría
Presentación - Tablas - Teoría
 
Xuber upgrade and migration services
Xuber upgrade and migration servicesXuber upgrade and migration services
Xuber upgrade and migration services
 

Similar a PVS-Studio, решение для разработки современных ресурсоемких приложений

Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
corehard_by
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 

Similar a PVS-Studio, решение для разработки современных ресурсоемких приложений (20)

Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программ
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Паттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхПаттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играх
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
 
Нужно ли статическому анализу машинное обучение?
Нужно ли статическому анализу машинное обучение?Нужно ли статическому анализу машинное обучение?
Нужно ли статическому анализу машинное обучение?
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
 

Más de Tatyanazaxarova

Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Tatyanazaxarova
 

Más de Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
PVS-Studio
PVS-Studio PVS-Studio
PVS-Studio
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируете
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-Paste
 
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROI
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 

PVS-Studio, решение для разработки современных ресурсоемких приложений

  • 1. PVS-Studio, решение для разработки современных ресурсоемких приложений ООО «СиПроВер» («Системы программной верификации») www.viva64.com
  • 2. Инструмент PVS-Studio набор правил Viva64 для анализа 64-битных приложений; набор правил VivaMP для анализа параллельных приложений; набор правил для анализа общего назначения. Лицензионная и ценовая политикаPVS-Studio Информация о компании ООО «СиПроВер» Содержание
  • 3. Инструмент PVS-Studio Анализ исходного кода приложений на языке Си/Си++
  • 4. PVS-Studio – статический анализатор кода, который предназначен для разработчиков современных ресурсоемких приложений В состав PVS-Studio входят три набора диагностических правил: Viva64, для выявления ошибок при разработки и миграции 64-битных приложений; VivaMP, для выявления параллельных ошибок в коде программ, разработанных с использованием технологии OpenMP; Для выявления ошибок общего плана, таких как опечатки, переполнение буфера, ошибки в условиях и так далее.
  • 5. ошибки миграции 32-битных приложений на 64-битные системы; ошибки, возникающие при разработке новых 64-битных приложений; ошибки в параллельных программах, связанные с недостаточным знанием технологии OpenMP; ошибки из-за некорректной работы с памятью в параллельном коде (незащищенный доступ к общей памяти, отсутствие синхронизации, неправильный режим доступа к переменным, и т. п.); выявление логических ошибок, некорректное использование алгоритмов и контейнеров, переполнение буферов; выявление опечаток, допущенных в ходе копирования фрагментов кода или по невнимательности; неоптимальные конструкции, которые легко могут быть оптимизированы. PVS-Studio обнаруживает следующие типы дефектов в Си/Си++ коде
  • 6. разрабатывает новые 64-битные приложения; выполняет миграцию 32-битного кода на 64-битные системы; добавляет в программу поддержку параллельного исполнения с помощью технологии OpenMP; хочет повысить качество и надежность кода; по-возможности выявить как можно больше ошибок на этапе разработки. Анализатор кода PVS-Studio нужен тем, кто
  • 7. Легко скачать: http://www.viva64.com/ru/pvs-studio-download/ Легко попробовать: PVS-Studio интегрируется в Visual Studio; В дистрибутивеидут примерыпрограмм с ошибками. Легко купить (онлайн или через банк): http://www.viva64.com/ru/order/ Почему PVS-Studio?
  • 8. Особенности PVS-Studio интеграцияс Visual Studio2005/2008/2010; поддержка Си и Си++; поддержка C++0x в рамках возможностей Visual Studio 2010; подробная справочная система (в том числе на русском языке; простота использования; удобная система фильтрации и подавления ошибок; анализ файлов в параллельном режиме.
  • 11. Легко посмотреть работуPVS-Studio с помощью демонстрационного проекта OmniSample, включенного в дистрибутив
  • 13. Viva64, набор правил для анализа 64-битных приложений
  • 14.
  • 15. Миграция C/C++ приложений наиболее затруднена из-за особенностей языка.
  • 16. При миграции возможно появление в программах ошибок, которые не удается диагностировать существующими методиками тестирования.
  • 17.
  • 18. Приведем примеры ошибок, обнаруживаемых Viva64
  • 19. Проблема с перекрытыми виртуальными функциями Базовый класс: classCWinApp { virtualvoidWinHelp(DWORD_PTR, UINT); }; Код пользователя: class CMyApp : public CWinApp { virtualvoidWinHelp(DWORD, UINT); }; 32-битная система: 64-битная система:
  • 20. Адресная арифметика с указателями int A = -2; unsigned B = 1; int array[5] = { 1, 2, 3, 4, 5 }; int *ptr = array + 3; ptr = ptr + (A + B); printf("%i", *ptr); Переменная A типа int приводится к типу unsigned; Происходит сложение A и B. В результате мы получаем значение 0xFFFFFFFF типа unsigned; Вычисляется выражение "ptr + 0xFFFFFFFFu". Результат зависит от размерности указателя на данной платформе. В 32-битной программе, выражение будет эквивалентно "ptr - 1" и мы успешно распечатаем число 3. В 64-битной программе к указателю прибавится значение 0xFFFFFFFFu, в результате чего указатель окажется далеко за пределами массива.
  • 21. Бесконечные циклы boolIsPresent(char *array, size_tarraySize, char key) { for (unsigned i = 0; i != arraySize; ++i) if (array[i] == key) return true; return false; } Данный код приведет к возникновению бесконечного цикла, еслиarraySizeпревысит значение UINT_MAX. Выявление подобных ошибок с использованием unit-тестов или динамических анализаторов (BoundsChecker) крайне осложнено необходимостью запуска на больших объеме данных. При обработке малого объема данных ошибка выявлена не будет
  • 22. Ошибки в операциях сдвига ptrdiff_t SetBitN(ptrdiff_t value, unsigned bitNum) { ptrdiff_t mask = 1 << bitNum; return value | mask; } Код установки заданного бита в единицу. Первая ошибка заключается в сдвиге знаковой переменной. При выставлении 31-го бита на 64-битной системе результатом работы функции будет значение 0xffffffff80000000 Вторая ошибка связана с тем, что данный код никогда не выставит биты, с номерами 32-63. Обратите внимание, что "1" имеет тип int и при сдвиге на 32 позиции произойдет переполнение. Получим мы в результате 0 (A) или 1 (B) зависит от реализации компилятора.
  • 23. Ошибки использования магических чисел #define N_COUNT 100 int **pArray = (int**) malloc(N_COUNT * 4); hFileMapping = CreateFileMapping ( (HANDLE) 0xFFFFFFFF, NULL, PAGE_READWRITE, (DWORD) 0, (DWORD) (szBufIm), (LPCTSTR) &FileShareNameMap[0]); size_t n, newexp; n = n >> (32 - newexp); Наиболее распространенные магические значения, опасные при переносе приложений с 32-битной на 64-битную платформу
  • 24. Переполнение в арифметических выражениях, где совместно используются 32-битные и 64-битные типы данных ptrdiff_t UnsafeCalcIndex(int x, int y, int width) { return x + y * width; } ... intdomainWidth = 50000; intdomainHeght = 50000;   for (int x = 0; x != domainWidth; ++x) for (int y = 0; y != domainHeght; ++y) array[UnsafeCalcIndex(x, y, domainWidth)] = 1; Данный код не может корректно заполнить массив, состоящий из 50000*50000 элементов. При вычислении выражения "x + y * width" происходит переполнениеи результатом будет выход за границы массива.
  • 25. Ошибки неявного приведения типа size_t __fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp);   size_tfread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp) { int ret; FLOCKFILE(fp); ret = __fread(buf, size, count, fp); FUNLOCKFILE(fp); return (ret); } Функция __fread возвращает тип size_t, но для хранения количества прочитанных байт используется тип int. В результате при больших объемах читаемых данных функция может вернуть не то количество байт, которое на самом деле будет прочитано.
  • 26. Показанный ранее пример взят из исходного кода FreeBSD.Ошибка была поправлена только в декабре 2008 года!Это при том, что первая (экспериментальная) 64-битная версия FreeBSD вышла еще в июне 2003 года.
  • 27. Были исследованы паттерны 64-битных ошибок в коде по более чем 100 различным статьямв печатных и электронных изданиях. Учтен собственный опыт миграции кода пакетов численного моделирования и визуализации на C++. В ходе исследований создана база из нескольких десятков различных паттернов ошибок, связанных с переносом кода на 64-битные системы. В базу попали как известные (опубликованные) ошибки, так и неизвестные ранее. На основе выявленных паттернов ошибок сформулированы правила их диагностики. И паттерны ошибок, и правила диагностики опубликованы в наших статьях и доступны для ознакомления всем желающим. Как мы делали анализатор 64-битного кода
  • 28. Сравнение: Viva64,VC++ (/Wp64), C++Test и PC-Lint В таблице представлено сравнение на конец 2008 года. На данный момент PVS-Studio реализует значительно больше возможностей.
  • 29. Компания E.G.S. S.r.l. занимается разработкой решений в области моделирования трехмерных объектов на базе триангулированных сеток. Применение Viva64 для проверки CAD-системыLeios Studio компании EGS S.r.l.
  • 30. Применение Viva64 для проверки CAD-системыLeios Studio компании EGS S.r.l. (продолжение) Общий объем исходного кода Leios Studio составляет 13 мегабайт (440 000 строк кода). Миграция кода с использованием Viva64 позволила сэкономить много времени, которое бы пришлось затратить на ручной просмотр кода. Основные проблемные моменты, выявленные в процессе автоматического анализа кода с помощью инструмента Viva64: особенности вычислительных алгоритмов при обработке больших объемов данных; работа с файлами большого размера; обработка 3d-моделей, содержащих большое количество треугольников (чем больше треугольников, тем точнее модели); работа подсистемы лицензирования; Подробности: http://www.viva64.com/art-1-1-3164907581.html
  • 31. Размер проекта: 1.5Mb, 125 файлов Выявлено потенциально-опасныхконструкций с помощью Viva64: 89 Из них реальных ошибок: 6 Статистика по выявленным ошибкам в библиотеке Loki http://loki-lib.sourceforge.net Подробности: http://www.viva64.com/en/a/0049/
  • 32. VivaMP, набор правил для анализа параллельных (OpenMP) приложений
  • 33. Проблемы в коде программ, использующих OpenMP Отсутствие ключевых слов в директивах Неправильная работа с блокировками Зависимость поведения кода от количества выполняющих его потоков Одновременная работа с общим ресурсом Незащищенный доступ к общей памяти Неосторожное использование локальных переменных Ненужная защита памяти от одновременной записи Ошибки производительности
  • 34. Приведем примеры ошибок, обнаруживаемых VivaMP
  • 35. Необработанные исключения в параллельных секциях #pragmaomp parallel for for (size_t i = 0; i != n; ++i) { float *array =new float[10000]; delete [] array; } Пример приведет к некорректному поведению программы и, скорее всего, к ее аварийному завершению, если произойдет ошибка выделения памяти. Ошибка связанна с выбрасыванием исключения из параллельной секции. Согласно спецификации OpenMP, если вы используете исключения внутри параллельной секции, то все эти исключения должны быть обработаны внутри этой секции. Если вы используете внутри параллельной секции оператор new, то вы должны позаботиться о перехвате исключения, которое согласно стандарту языка Си++ будет сгенерировано при ошибке выделения памяти.
  • 37. Ошибки состояния гонки (racecondition) int a = 0; #pragmaomp parallel for num_threads(4) for (inti = 0; i < 100000; i++) { a++; } Состояние гонки возникает тогда, когда несколько потоков многопоточного приложения пытаются одновременно получить доступ к данным, причем хотя бы один поток выполняет запись. Состояния гонки могут давать непредсказуемые результаты, и зачастую их сложно выявить. Иногда последствия состояния гонки проявляются только через большой промежуток времени и в совсем другой части приложения. Кроме того, ошибки такого рода невероятно сложно воспроизвести повторно. Крайне эффективным является выявление по крайней мере части таких ошибок с помощью статического анализа еще на этапе написания кода.
  • 38. Ошибки инициализации статических объектов в параллельных секциях pragmaomp parallel { static intst = Calc(); ... } Статическая переменная начнет процесс инициализации сразу в нескольких потоках, что может привести к неопределенному результату. Неприятность подобных ошибок заключается в их нестабильном и редком проявлении во время тестирования.
  • 39. Набор правил анализа общего назначения
  • 40. Основное преимущество статического анализа – обнаружение ошибок на самых ранних этапах Соотношение стоимость исправления дефектов в зависимости от времени их внесения и обнаружения. Данные для таблицы взяты из книги С. Макконнелла «Совершенный Код».
  • 41. Обнаружение любого вида ошибки на этапе кодирования выгодно Не важно, какова сложность ошибки. Простая это опечатка, или ошибка в логике алгоритма. Обнаружение хотя бы части таких ошибок еще на этапе написания кода весьма выгодно. Это существенно сокращает затраты на тестирование и дальнейшее сопровождение кода. Анализатор PVS-Studio диагностирует большое количество разнообразнейших видов ошибок. Перечислить все типы обнаруживаемых ошибок достаточно сложно. Подробно со списком диагностических проверок можно ознакомиться в документации. Документация (онлайн): http://www.viva64.com/ru/d/
  • 43. Некорректное условие intiChilds[2]; ... boolhasChilds() const { return(iChilds > 0 || iChilds > 0); } В данном случае, хотя код успешно и без предупреждений компилируется, он не имеет смысла. Корректный код должен был выглядеть следующим образом: intiChilds[2]; ... boolhasChilds() const { return(iChilds[0] > 0 || iChilds[1] > 0); }
  • 44. Ссылка на уже уничтоженный объект structCVariable { char name[64]; }; void CRendererContext::RiGeometryV(int n, char *tokens[]){ for (i=0;i<n;i++) { CVariablevar; if (parseVariable(&var, NULL, tokens[i])) tokens[i] = var.name; } } Указатель на массив, находящийся в переменной типа CVariable, сохраняется во внешнем массиве. В результате массив "tokens" после завершения функции RiGeometryV будет содержать указатели на уже несуществующие объекты.
  • 45. Неполная очистка буфера MD5Context *ctx; ... memset(ctx, 0, sizeof(ctx)); Здесь из-за опечатки очищается не вся структура, а только ее часть. Ошибка в том, что вычисляется размер указателя, а не структуры MD5Context. Корректный вариант кода: MD5Context *ctx; ... memset(ctx, 0, sizeof(*ctx));
  • 46. Ошибка в цепочке if - else - if - else if (a == 1) Foo1(); else if (a == 2) Foo2(); else if (a == 1) Foo3(); В этом коде функции 'Foo3()' никогда не получит управления.
  • 47. Опечатка. Двойное присваивание. CSize(POINT pt) { cx = pt.x; cx = pt.y; } Код взят из реального приложения, где был реализован свой собственный класс CSize. Корректный вариант должен был конечно выглядеть так: CSize(POINT pt) { cx = pt.x; cy = pt.y; } Опечатка. Лишняя ‘;’. for (i = 0; i < n; i++); { Foo(i); }
  • 48. Неверное использование std::remove void unregisterThread() { Guard<TaskQueue> g(_taskQueue); std::remove(_threads.begin(), _threads.end(), ThreadImpl::current()); } Функция std::remove не удаляет элементы из контейнера. Она только сдвигает элементы и возвращает итератор на начало мусора. Пусть мы имеем контейнер vector<int>, содержащий элементы 1,2,3,1,2,3,1,2,3. Если выполнить код "remove( v.begin(), v.end(), 2 )", то контейнер будет содержать элементы 1,3,1,3,?,?,?, где ? - некий мусор. При этом функция вернет итератор на первый мусорный элемент, и если мы хотим удалить эти мусорные элементы, то должны написать код: "v.erase(remove(v.begin(), v.end(), 2), v.end())".
  • 49. Лицензионная и ценовая политика PVS-Studio
  • 50. PVS-Studio: цены Страница заказа: http://www.viva64.com/ru/order/
  • 51. возможность получения новых версий (включая major-версии) в течение 1 года; возможность получения поддержки по электронной почте в течение 1 года; неограниченное по времени право использования программы. После 1 года с момента приобретения лицензии, вы сможете по-прежнему получать новые версии PVS-Studio и обращаться в поддержку. Ограничения будут касаться только новых диагностических возможностей, которые появятся в анализаторе уже после истечения срока действия лицензии. Что включено в цену помимо права пользования?
  • 53. Свидетельство об официальной регистрации программ для ЭВМ N2007614164, «Вива64». Зарегистрировано в Реестре программ для ЭВМ 28 сентября 2007 г. Свидетельство об официальной регистрации программ для ЭВМ N2008610480, «Библиотека анализа кода VivaCore». Зарегистрировано в Реестре программ для ЭВМ 25 января 2008 г. Свидетельство об официальной регистрации программ для ЭВМ N2008612845, «Вива64 2.0». Зарегистрировано в Реестре программ для ЭВМ 29 мая 2008 г. Интеллектуальная собственность
  • 54. Наши статьи опубликованы на крупнейших программистских сайтах http://www.viva64.com/ru/experience/
  • 55. Общие сведения о принципах работы с анализатором PVS-Studio http://www.viva64.com/ru/d/0011/ Коллекция примеров 64-битных ошибок в реальных программах http://www.viva64.com/ru/a/0065/ 32 подводных камня OpenMP при программировании наСи++ http://www.viva64.com/ru/a/0054/ Другие статьи по разработке 64-битных и параллельных программ, а также по технологии анализа кода читайте на http://www.viva64.com/ru/articles/ Наши лучшие статьи
  • 56. ООО «СиПроВер» 300027, Россия, Тула, Металлургов 70-1-88. Web: www.viva64.com E-mail: support@viva64.com Телефон: +7 (4872) 38-59-95 Рабочее время: 09:00 – 18:00 (GMT +3:00) Информация о компании