SlideShare a Scribd company logo
PVS-Studio,
решение для разработки
современных ресурсоемких
приложений
ООО «СиПроВер»
(«Системы программной верификации»)
www.viva64.com
Что такое PVS-Studio?
PVS-Studio - статический анализатор,
выявляющий ошибки в исходном коде
приложений на языках C, C++, C#.
Можно выделить 3 набора правил,
включенных в состав PVS-Studio:
1. Диагностика общего назначения
2. Диагностика возможных
оптимизаций
3. Диагностика 64-битных ошибок
(Viva64)
Примеры обнаруживаемых
ошибок
Приоритет операций & и !
Return to Castle Wolfenstein - компьютерная игра, шутер
от первого лица, разработанный компанией id Software.
Движок игры распространяется по GPL лицензии.
#define SVF_CASTAI 0x00000010
if ( !ent->r.svFlags & SVF_CASTAI )
if ( ! (ent->r.svFlags & SVF_CASTAI) )
Использование && вместо &
#define REO_INPLACEACTIVE (0x02000000L)
#define REO_OPEN (0x04000000L)
if (reObj.dwFlags && REO_INPLACEACTIVE)
m_pRichEditOle->InPlaceDeactivate();
if(reObj.dwFlags && REO_OPEN)
hr = reObj.poleobj->Close(OLECLOSE_NOSAVE);
Stickies - желтые клеящиеся бумажки, только
на мониторе.
Эффект последней строки
public void SavePassword(IMember member, string password)
{
....
member.RawPasswordValue = result.RawPasswordValue;
member.LastPasswordChangeDate = result.LastPasswordChangeDate;
member.UpdateDate = member.UpdateDate;
}
Umbraco - это платформа системы управления
контента с открытым кодом, использующаяся
для публикации контента во всемирной сети.
Эффект последней строки - http://www.viva64.com/ru/b/0260/
Undefined behavior
while (*(n = ++s + strspn(s, EZXML_WS)) && *n != '>') {
Miranda IM (Miranda Instant Messenger) -
программа мгновенного обмена
сообщениями для Microsoft Windows.
Использование delete для массива
auto_ptr<VARIANT> child_array(new VARIANT[child_count]);
~auto_ptr() {
delete _Myptr;
}
Chromium - веб-браузер с открытым исходным кодом,
разработанный компанией Google. На основе
Chromium создаётся браузер Google Chrome.
Использовать auto_ptr для массивов нельзя. В деструкторе auto_ptr уничтожается
только один элемент:
В качестве альтернативы, например, можно использовать
boost::scoped_array.
Всегда истинное условие
WinDjView - быстрая и компактная программа
для просмотра файлов формата DjVu.
inline bool IsValidChar(int c)
{
return c == 0x9 || 0xA || c == 0xD || c >= 0x20 && c <= 0xD7FF
|| c >= 0xE000 && c <= 0xFFFD || c >= 0x10000 && c <= 0x10FFFF;
}
Оформление кода отличается от его
логики
if(pushval != 0)
if(pushval) v->GetUp(-1) = t;
else
v->Pop(1);
Squirrel - интерпретируемый язык
программирования, разработанный
специально для использования в
качестве скриптового языка в
приложениях реального времени, таких
как компьютерные игры.
v->Pop(1); - никогда не вызывается
Случайное объявление локальной
переменной
FCE Ultra – открытый эмулятор приставки Nintendo
Entertainment System
int iNesSaveAs(char* name)
{
...
fp = fopen(name,"wb");
int x = 0;
if (!fp)
int x = 1;
...
}
Работа с char как с unsigned char
// check each line for illegal utf8 sequences.
// If one is found, we treat the file as ASCII,
// otherwise we assume an UTF8 file.
char * utf8CheckBuf = lineptr;
while ((bUTF8)&&(*utf8CheckBuf))
{
if ((*utf8CheckBuf == 0xC0)||
(*utf8CheckBuf == 0xC1)||
(*utf8CheckBuf >= 0xF5))
{
bUTF8 = false;
break;
}
TortoiseSVN — клиент для системы контроля версий Subversion,
выполненный как расширение оболочки Windows.
Случайные восьмеричные числа
oCell._luminance = uint16(0.2220f*iPixel._red +
0.7067f*iPixel._blue +
0.0713f*iPixel._green);
....
oCell._luminance = 2220*iPixel._red +
7067*iPixel._blue +
0713*iPixel._green;
eLynx Image Processing SDK and Lab
Одна переменная для двух циклов
static int i,j,k,l,m;
...
for(j=0; j<numrepeats; j++){
...
for(i=0; i<num_joints; i++){
...
for(j=0;j<num_joints;j++){
if(joints[j].locked)freely=0;
}
...
}
...
}
Lugaru — первая коммерческая игра, созданная
командой независимых разработчиков Wolfire
Games.
Выход за границы массива
#define SBMAX_l 22
int l[1+SBMAX_l];
for (r0 = 0; r0 < 16; r0++) {
...
for (r1 = 0; r1 < 8; r1++) {
int a2 = gfc->scalefac_band.l[r0 + r1 + 2];
LAME - свободное приложение для
кодирования аудио в формат MP3.
Приоритет операций * и ++
STDMETHODIMP CCustomAutoComplete::Next(...,
ULONG *pceltFetched)
{
...
if (pceltFetched != NULL)
*pceltFetched++;
...
}
(*pceltFetched)++;
eMule - это клиент для сети обмена файлами ED2K.
Ошибка в сравнении
BUFFERTYPE m_nBufferType[2];
...
// Handle unnamed buffers
if ((m_nBufferType[nBuffer] == BUFFER_UNNAMED) ||
(m_nBufferType[nBuffer] == BUFFER_UNNAMED))
nSaveErrorCode = SAVE_NO_FILENAME;
WinMerge — свободное ПО с открытым исходным
кодом для сравнения и синхронизации файлов и
директорий.
Если посмотреть код рядом, то по аналогии здесь должно быть:
(m_nBufferType[0] == BUFFER_UNNAMED) ||
(m_nBufferType[1] == BUFFER_UNNAMED)
Забытый индекс массива
IPP Samples - примеры, демонстрирующие
работу с библиотекой Intel Performance
Primitives Library 7.0.
void lNormalizeVector_32f_P3IM(..., Ipp32s* mask, ...) {
Ipp32s i;
Ipp32f norm;
for(i=0; i<len; i++) {
if(mask<0) continue;
...
}
}
if(mask[i]<0) continue;
Одинаковые ветви кода
Notepad++ - свободный текстовый редактор для
Windows с подсветкой синтаксиса большого
количества языков программирования и разметки.
if (!_isVertical)
Flags |= DT_VCENTER;
else
Flags |= DT_BOTTOM;
if (!_isVertical)
Flags |= DT_BOTTOM;
else
Flags |= DT_BOTTOM;
Вызов неверной функции со схожим
именем
/** Deletes all previous field specifiers.
* This should be used when dealing
* with clients that send multiple NEP_PACKET_SPEC
* messages, so only the last PacketSpec is taken
* into account. */
int NEPContext::resetClientFieldSpecs(){
this->fspecs.empty();
return OP_SUCCESS;
} /* End of resetClientFieldSpecs() */
Какой замечательный комментарий. Жаль только не то делаем, что хотим.
Nmap Security Scanner - свободная утилита,
предназначенная для разнообразного
настраиваемого сканирования IP-сетей с любым
количеством объектов, определения состояния
объектов сканируемой сети.
Опасный оператор ?:
Newton Game Dynamics - популярный физический
движок, который предоставляет надежное и
быстрое решение для симуляции физического
поведения объектов окружающей среды.
den = dgFloat32 (1.0e-24f) *
(den > dgFloat32(0.0f)) ? dgFloat32(1.0f) : dgFloat32(-1.0f);
Приоритет оператора ?: ниже, чем у оператора умножения *.
И так далее, и так далее…
FCE Ultra
if((t=(char *)realloc(
next->name, strlen(name+1))))
if((t=(char *)realloc(
next->name, strlen(name)+1)))
minX=max(0,minX+mcLeftStart-2);
minY=max(0,minY+mcTopStart-2);
maxX=min((int)width,maxX+mcRightEnd-1);
maxY=min((int)height,maxX+mcBottomEnd-1);
minX=max(0,minX+mcLeftStart-2);
minY=max(0,minY+mcTopStart-2);
maxX=min((int)width,maxX+mcRightEnd-1);
maxY=min((int)height,maxY+mcBottomEnd-1);
Низкоуровневые операции работы с
памятью
ID_INLINE mat3_t::mat3_t( float src[3][3] )
{
memcpy( mat, src, sizeof( src ) );
}
Return to Castle
Wolfenstein
itemInfo_t *itemInfo;
memset( itemInfo, 0, sizeof( &itemInfo ) );
memset( itemInfo, 0, sizeof( *itemInfo ) );
ID_INLINE mat3_t::mat3_t( float (&src)[3][3] )
{
memcpy( mat, src, sizeof( src ) );
}
Низкоуровневые операции работы с
памятью
CxImage - открытая библиотека обработки изображений.
memset(tcmpt->stepsizes, 0,
sizeof(tcmpt->numstepsizes * sizeof(uint_fast16_t)));
memset(tcmpt->stepsizes, 0,
tcmpt->numstepsizes * sizeof(uint_fast16_t));
Низкоуровневые операции работы с
памятью
dgInt32 faceOffsetHitogram[256];
dgSubMesh* mainSegmenst[256];
memset (faceOffsetHitogram, 0, sizeof (faceOffsetHitogram));
memset (mainSegmenst, 0, sizeof (faceOffsetHitogram));
Скопировали код и не полностью поправили. В результате в Win64
размер указателя станет не равен размеру типа dgInt32 и мы
очистим только часть массива mainSegmenst.
Красивый пример 64-битной ошибки:
Низкоуровневые операции работы с
памятью
#define CONT_MAP_MAX 50
int _iContMap[CONT_MAP_MAX];
...
memset(_iContMap, -1, CONT_MAP_MAX);
memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));
Низкоуровневые операции работы с
памятью
Да, сейчас это не
ошибка.
Но это мина!
Real w, x, y, z;
...
inline Quaternion(Real* valptr)
{
memcpy(&w, valptr, sizeof(Real)*4);
}
OGRE (Object-Oriented Graphics Rendering Engine) -
объектно-ориентированный графический движок
с открытым исходным кодом, написанный на C++.
И много-много других ошибок
в известных проектах
• Qt 5
• Unreal Engine 4
• Analysis of Microsoft Code Contracts
• Wine
• LibreOffice
• Linux kernel
• ReactOS
Здесь ссылки на статьи с описанием ошибок: http://www.viva64.com/ru/pvs-studio/
Типы обнаруживаемых дефектов
• ошибки из-за copy-paste;
• неверные строки формата (printf);
• переполнение буфера (buffer overflow);
• некорректное использования STL, WinAPI;
• ...
• ошибки миграции 32-битных приложений
на 64-битные системы (Viva64);
Интеграция
• Visual Studio 2010 и выше;
• MinGW: C, C++.
• MSBuild
• Независимое отслеживание вызовов
компилятора
Особенности PVS-Studio
• Incremental Analysis – проверка только что скомпилированных
файлов;
• проверка файлов, модифицированных за последние несколько
дней;
• проверка файлов по списку имен из текстового файла;
• интеграция с системами continuous integration;
• интеграция с version control systems;
• возможность запуска из командной строки;
• отметка «ложных срабатываний»;
• сохранение и загрузка результатов анализа;
• работа на всех ядрах и процессорах;
• поддержка IncrediBuild;
• интерактивные фильтры;
• online-справка на русском и английском языке;
• документация в pdf;
Интеграция с Visual Studio
Incremental Analysis – проверка только
что скомпилированных файлов
• просто работаете в Visual Studio;
• компилируетесь по F7;
• в фоновом режиме автоматически запускается
проверка скомпилированных файлов;
• в конце проверки будет уведомление, можно
посмотреть на обнаруженные ошибки
Поддержка VCS и CI
(контроль версий, непрерывная интеграции)
• запуск из командной строки:
• отправка найденных проблем по почте:
• готовые команды запуска для
CruiseControl.Net, Hudson, Microsoft TFS
"C:Program Files (x86)PVS-Studiox64PVS-Studio.exe"
--sln-file "C:UsersevgDocuments OmniSampleOmniSample (vs2008).sln"
--plog-file "C:UsersevgDocumentsresult.plog"
--vcinstalldir "C:Program Files (x86)Microsoft Visual Studio 9.0VC"
--platform "x64"
--configuration "Release”
cmd.exe /c type result-log.plog.only_new_messages.txt
Интерактивные фильтры
• фильтрация сообщений без перезапуска
анализа;
• фильтрация по коду ошибок, по именам
файлов (включая маски), по тексту
сообщений, по уровню важности (warning
level);
• показ/скрытие ложных срабатываний (false
alarms).
Встроенная
справка
(описание
ошибок)
Информация о компании
ООО «СиПроВер»
300034, Россия, Тула, Революции 39, офис 308.
www.viva64.com
support@viva64.com
Рабочее время: 09:00 – 18:00 (GMT +3:00)

More Related Content

PPTX
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
PDF
Разница в подходах анализа кода компилятором и выделенным инструментом
Tatyanazaxarova
 
PDF
Intel IPP Samples for Windows - работа над ошибками
Tatyanazaxarova
 
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Sergey Platonov
 
PPTX
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Yandex
 
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
PDF
Павел Довгалюк, Обратная отладка
Sergey Platonov
 
PDF
64-битный конь, который умеет считать
Tatyanazaxarova
 
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Tatyanazaxarova
 
Intel IPP Samples for Windows - работа над ошибками
Tatyanazaxarova
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Sergey Platonov
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Yandex
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
Павел Довгалюк, Обратная отладка
Sergey Platonov
 
64-битный конь, который умеет считать
Tatyanazaxarova
 

What's hot (20)

PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
PPTX
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
PPTX
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 
PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Dima Dzuba
 
PDF
хитрости выведения типов
corehard_by
 
PPTX
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
Andrey Karpov
 
PDF
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
PPTX
PVS-Studio, решение для разработки современных ресурсоемких приложений
Tatyanazaxarova
 
PDF
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
 
PPTX
Цена ошибки
Andrey Karpov
 
PDF
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
Alexey Paznikov
 
PDF
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
PDF
Цена ошибки
Platonov Sergey
 
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
Dima Dzuba
 
PDF
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Yandex
 
PDF
Статический анализ: ошибки в медиаплеере и безглючная аська
Tatyanazaxarova
 
PDF
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
PDF
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Dima Dzuba
 
хитрости выведения типов
corehard_by
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
Andrey Karpov
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
Tatyanazaxarova
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
 
Цена ошибки
Andrey Karpov
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
Alexey Paznikov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
Цена ошибки
Platonov Sergey
 
Объектно-ориентированное программирование. Лекции 9 и 10
Dima Dzuba
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Yandex
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Tatyanazaxarova
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Ad

Viewers also liked (7)

PPTX
Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
khaberl
 
PPTX
Hi-Lite erts2012
AdaCore
 
PPTX
Program Verification / Automated Theorem Proving
lokeshwer2
 
PDF
Bcb Pp Presentation, 10 10 (2)
Enyonam
 
PDF
Formal Verification
Ilia Levin
 
PDF
09 - Program verification
Tudor Girba
 
PPT
The Pyramid of Hate
timothyjgraham
 
Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
khaberl
 
Hi-Lite erts2012
AdaCore
 
Program Verification / Automated Theorem Proving
lokeshwer2
 
Bcb Pp Presentation, 10 10 (2)
Enyonam
 
Formal Verification
Ilia Levin
 
09 - Program verification
Tudor Girba
 
The Pyramid of Hate
timothyjgraham
 
Ad

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

PPTX
Статический анализ Си++ кода
Tatyanazaxarova
 
PPTX
Статический анализ кода
Pavel Tsukanov
 
PPTX
статический анализ кода
Andrey Karpov
 
PPTX
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Andrey Karpov
 
PPTX
200 open source проектов спустя: опыт статического анализа исходного кода
Positive Hack Days
 
PPTX
200 open source проектов спустя: опыт статического анализа исходного кода
Andrey Karpov
 
PDF
Урок 9. Паттерн 1. Магические числа
Tatyanazaxarova
 
PPTX
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
PDF
Коллекция примеров 64-битных ошибок в реальных программах
Tatyanazaxarova
 
PPTX
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
PDF
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Mikhail Kurnosov
 
PPTX
Как команда PVS-Studio может улучшить код операционной системы Tizen
Andrey Karpov
 
PPTX
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
PPTX
Эффективный C++
Andrey Karpov
 
PDF
Parallel STL
Evgeny Krutko
 
PPTX
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
PPTX
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Andrey Karpov
 
PPTX
Поиск уязвимостей с использованием статического анализа кода
corehard_by
 
PPTX
Поиск уязвимостей с использованием статического анализа кода
Andrey Karpov
 
PDF
Урок 24. Фантомные ошибки
Tatyanazaxarova
 
Статический анализ Си++ кода
Tatyanazaxarova
 
Статический анализ кода
Pavel Tsukanov
 
статический анализ кода
Andrey Karpov
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Andrey Karpov
 
200 open source проектов спустя: опыт статического анализа исходного кода
Positive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
Andrey Karpov
 
Урок 9. Паттерн 1. Магические числа
Tatyanazaxarova
 
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Коллекция примеров 64-битных ошибок в реальных программах
Tatyanazaxarova
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Mikhail Kurnosov
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Andrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
Эффективный C++
Andrey Karpov
 
Parallel STL
Evgeny Krutko
 
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Andrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
corehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Andrey Karpov
 
Урок 24. Фантомные ошибки
Tatyanazaxarova
 

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

  • 1. PVS-Studio, решение для разработки современных ресурсоемких приложений ООО «СиПроВер» («Системы программной верификации») www.viva64.com
  • 2. Что такое PVS-Studio? PVS-Studio - статический анализатор, выявляющий ошибки в исходном коде приложений на языках C, C++, C#. Можно выделить 3 набора правил, включенных в состав PVS-Studio: 1. Диагностика общего назначения 2. Диагностика возможных оптимизаций 3. Диагностика 64-битных ошибок (Viva64)
  • 4. Приоритет операций & и ! Return to Castle Wolfenstein - компьютерная игра, шутер от первого лица, разработанный компанией id Software. Движок игры распространяется по GPL лицензии. #define SVF_CASTAI 0x00000010 if ( !ent->r.svFlags & SVF_CASTAI ) if ( ! (ent->r.svFlags & SVF_CASTAI) )
  • 5. Использование && вместо & #define REO_INPLACEACTIVE (0x02000000L) #define REO_OPEN (0x04000000L) if (reObj.dwFlags && REO_INPLACEACTIVE) m_pRichEditOle->InPlaceDeactivate(); if(reObj.dwFlags && REO_OPEN) hr = reObj.poleobj->Close(OLECLOSE_NOSAVE); Stickies - желтые клеящиеся бумажки, только на мониторе.
  • 6. Эффект последней строки public void SavePassword(IMember member, string password) { .... member.RawPasswordValue = result.RawPasswordValue; member.LastPasswordChangeDate = result.LastPasswordChangeDate; member.UpdateDate = member.UpdateDate; } Umbraco - это платформа системы управления контента с открытым кодом, использующаяся для публикации контента во всемирной сети. Эффект последней строки - http://www.viva64.com/ru/b/0260/
  • 7. Undefined behavior while (*(n = ++s + strspn(s, EZXML_WS)) && *n != '>') { Miranda IM (Miranda Instant Messenger) - программа мгновенного обмена сообщениями для Microsoft Windows.
  • 8. Использование delete для массива auto_ptr<VARIANT> child_array(new VARIANT[child_count]); ~auto_ptr() { delete _Myptr; } Chromium - веб-браузер с открытым исходным кодом, разработанный компанией Google. На основе Chromium создаётся браузер Google Chrome. Использовать auto_ptr для массивов нельзя. В деструкторе auto_ptr уничтожается только один элемент: В качестве альтернативы, например, можно использовать boost::scoped_array.
  • 9. Всегда истинное условие WinDjView - быстрая и компактная программа для просмотра файлов формата DjVu. inline bool IsValidChar(int c) { return c == 0x9 || 0xA || c == 0xD || c >= 0x20 && c <= 0xD7FF || c >= 0xE000 && c <= 0xFFFD || c >= 0x10000 && c <= 0x10FFFF; }
  • 10. Оформление кода отличается от его логики if(pushval != 0) if(pushval) v->GetUp(-1) = t; else v->Pop(1); Squirrel - интерпретируемый язык программирования, разработанный специально для использования в качестве скриптового языка в приложениях реального времени, таких как компьютерные игры. v->Pop(1); - никогда не вызывается
  • 11. Случайное объявление локальной переменной FCE Ultra – открытый эмулятор приставки Nintendo Entertainment System int iNesSaveAs(char* name) { ... fp = fopen(name,"wb"); int x = 0; if (!fp) int x = 1; ... }
  • 12. Работа с char как с unsigned char // check each line for illegal utf8 sequences. // If one is found, we treat the file as ASCII, // otherwise we assume an UTF8 file. char * utf8CheckBuf = lineptr; while ((bUTF8)&&(*utf8CheckBuf)) { if ((*utf8CheckBuf == 0xC0)|| (*utf8CheckBuf == 0xC1)|| (*utf8CheckBuf >= 0xF5)) { bUTF8 = false; break; } TortoiseSVN — клиент для системы контроля версий Subversion, выполненный как расширение оболочки Windows.
  • 13. Случайные восьмеричные числа oCell._luminance = uint16(0.2220f*iPixel._red + 0.7067f*iPixel._blue + 0.0713f*iPixel._green); .... oCell._luminance = 2220*iPixel._red + 7067*iPixel._blue + 0713*iPixel._green; eLynx Image Processing SDK and Lab
  • 14. Одна переменная для двух циклов static int i,j,k,l,m; ... for(j=0; j<numrepeats; j++){ ... for(i=0; i<num_joints; i++){ ... for(j=0;j<num_joints;j++){ if(joints[j].locked)freely=0; } ... } ... } Lugaru — первая коммерческая игра, созданная командой независимых разработчиков Wolfire Games.
  • 15. Выход за границы массива #define SBMAX_l 22 int l[1+SBMAX_l]; for (r0 = 0; r0 < 16; r0++) { ... for (r1 = 0; r1 < 8; r1++) { int a2 = gfc->scalefac_band.l[r0 + r1 + 2]; LAME - свободное приложение для кодирования аудио в формат MP3.
  • 16. Приоритет операций * и ++ STDMETHODIMP CCustomAutoComplete::Next(..., ULONG *pceltFetched) { ... if (pceltFetched != NULL) *pceltFetched++; ... } (*pceltFetched)++; eMule - это клиент для сети обмена файлами ED2K.
  • 17. Ошибка в сравнении BUFFERTYPE m_nBufferType[2]; ... // Handle unnamed buffers if ((m_nBufferType[nBuffer] == BUFFER_UNNAMED) || (m_nBufferType[nBuffer] == BUFFER_UNNAMED)) nSaveErrorCode = SAVE_NO_FILENAME; WinMerge — свободное ПО с открытым исходным кодом для сравнения и синхронизации файлов и директорий. Если посмотреть код рядом, то по аналогии здесь должно быть: (m_nBufferType[0] == BUFFER_UNNAMED) || (m_nBufferType[1] == BUFFER_UNNAMED)
  • 18. Забытый индекс массива IPP Samples - примеры, демонстрирующие работу с библиотекой Intel Performance Primitives Library 7.0. void lNormalizeVector_32f_P3IM(..., Ipp32s* mask, ...) { Ipp32s i; Ipp32f norm; for(i=0; i<len; i++) { if(mask<0) continue; ... } } if(mask[i]<0) continue;
  • 19. Одинаковые ветви кода Notepad++ - свободный текстовый редактор для Windows с подсветкой синтаксиса большого количества языков программирования и разметки. if (!_isVertical) Flags |= DT_VCENTER; else Flags |= DT_BOTTOM; if (!_isVertical) Flags |= DT_BOTTOM; else Flags |= DT_BOTTOM;
  • 20. Вызов неверной функции со схожим именем /** Deletes all previous field specifiers. * This should be used when dealing * with clients that send multiple NEP_PACKET_SPEC * messages, so only the last PacketSpec is taken * into account. */ int NEPContext::resetClientFieldSpecs(){ this->fspecs.empty(); return OP_SUCCESS; } /* End of resetClientFieldSpecs() */ Какой замечательный комментарий. Жаль только не то делаем, что хотим. Nmap Security Scanner - свободная утилита, предназначенная для разнообразного настраиваемого сканирования IP-сетей с любым количеством объектов, определения состояния объектов сканируемой сети.
  • 21. Опасный оператор ?: Newton Game Dynamics - популярный физический движок, который предоставляет надежное и быстрое решение для симуляции физического поведения объектов окружающей среды. den = dgFloat32 (1.0e-24f) * (den > dgFloat32(0.0f)) ? dgFloat32(1.0f) : dgFloat32(-1.0f); Приоритет оператора ?: ниже, чем у оператора умножения *.
  • 22. И так далее, и так далее… FCE Ultra if((t=(char *)realloc( next->name, strlen(name+1)))) if((t=(char *)realloc( next->name, strlen(name)+1))) minX=max(0,minX+mcLeftStart-2); minY=max(0,minY+mcTopStart-2); maxX=min((int)width,maxX+mcRightEnd-1); maxY=min((int)height,maxX+mcBottomEnd-1); minX=max(0,minX+mcLeftStart-2); minY=max(0,minY+mcTopStart-2); maxX=min((int)width,maxX+mcRightEnd-1); maxY=min((int)height,maxY+mcBottomEnd-1);
  • 23. Низкоуровневые операции работы с памятью ID_INLINE mat3_t::mat3_t( float src[3][3] ) { memcpy( mat, src, sizeof( src ) ); } Return to Castle Wolfenstein itemInfo_t *itemInfo; memset( itemInfo, 0, sizeof( &itemInfo ) ); memset( itemInfo, 0, sizeof( *itemInfo ) ); ID_INLINE mat3_t::mat3_t( float (&src)[3][3] ) { memcpy( mat, src, sizeof( src ) ); }
  • 24. Низкоуровневые операции работы с памятью CxImage - открытая библиотека обработки изображений. memset(tcmpt->stepsizes, 0, sizeof(tcmpt->numstepsizes * sizeof(uint_fast16_t))); memset(tcmpt->stepsizes, 0, tcmpt->numstepsizes * sizeof(uint_fast16_t));
  • 25. Низкоуровневые операции работы с памятью dgInt32 faceOffsetHitogram[256]; dgSubMesh* mainSegmenst[256]; memset (faceOffsetHitogram, 0, sizeof (faceOffsetHitogram)); memset (mainSegmenst, 0, sizeof (faceOffsetHitogram)); Скопировали код и не полностью поправили. В результате в Win64 размер указателя станет не равен размеру типа dgInt32 и мы очистим только часть массива mainSegmenst. Красивый пример 64-битной ошибки:
  • 26. Низкоуровневые операции работы с памятью #define CONT_MAP_MAX 50 int _iContMap[CONT_MAP_MAX]; ... memset(_iContMap, -1, CONT_MAP_MAX); memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));
  • 27. Низкоуровневые операции работы с памятью Да, сейчас это не ошибка. Но это мина! Real w, x, y, z; ... inline Quaternion(Real* valptr) { memcpy(&w, valptr, sizeof(Real)*4); } OGRE (Object-Oriented Graphics Rendering Engine) - объектно-ориентированный графический движок с открытым исходным кодом, написанный на C++.
  • 28. И много-много других ошибок в известных проектах • Qt 5 • Unreal Engine 4 • Analysis of Microsoft Code Contracts • Wine • LibreOffice • Linux kernel • ReactOS Здесь ссылки на статьи с описанием ошибок: http://www.viva64.com/ru/pvs-studio/
  • 29. Типы обнаруживаемых дефектов • ошибки из-за copy-paste; • неверные строки формата (printf); • переполнение буфера (buffer overflow); • некорректное использования STL, WinAPI; • ... • ошибки миграции 32-битных приложений на 64-битные системы (Viva64);
  • 30. Интеграция • Visual Studio 2010 и выше; • MinGW: C, C++. • MSBuild • Независимое отслеживание вызовов компилятора
  • 31. Особенности PVS-Studio • Incremental Analysis – проверка только что скомпилированных файлов; • проверка файлов, модифицированных за последние несколько дней; • проверка файлов по списку имен из текстового файла; • интеграция с системами continuous integration; • интеграция с version control systems; • возможность запуска из командной строки; • отметка «ложных срабатываний»; • сохранение и загрузка результатов анализа; • работа на всех ядрах и процессорах; • поддержка IncrediBuild; • интерактивные фильтры; • online-справка на русском и английском языке; • документация в pdf;
  • 33. Incremental Analysis – проверка только что скомпилированных файлов • просто работаете в Visual Studio; • компилируетесь по F7; • в фоновом режиме автоматически запускается проверка скомпилированных файлов; • в конце проверки будет уведомление, можно посмотреть на обнаруженные ошибки
  • 34. Поддержка VCS и CI (контроль версий, непрерывная интеграции) • запуск из командной строки: • отправка найденных проблем по почте: • готовые команды запуска для CruiseControl.Net, Hudson, Microsoft TFS "C:Program Files (x86)PVS-Studiox64PVS-Studio.exe" --sln-file "C:UsersevgDocuments OmniSampleOmniSample (vs2008).sln" --plog-file "C:UsersevgDocumentsresult.plog" --vcinstalldir "C:Program Files (x86)Microsoft Visual Studio 9.0VC" --platform "x64" --configuration "Release” cmd.exe /c type result-log.plog.only_new_messages.txt
  • 35. Интерактивные фильтры • фильтрация сообщений без перезапуска анализа; • фильтрация по коду ошибок, по именам файлов (включая маски), по тексту сообщений, по уровню важности (warning level); • показ/скрытие ложных срабатываний (false alarms).
  • 37. Информация о компании ООО «СиПроВер» 300034, Россия, Тула, Революции 39, офис 308. www.viva64.com [email protected] Рабочее время: 09:00 – 18:00 (GMT +3:00)