SlideShare une entreprise Scribd logo
1  sur  37
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)

Contenu connexe

Tendances

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

Tendances (20)

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

En vedette

Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010khaberl
 
Hi-Lite erts2012
Hi-Lite erts2012Hi-Lite erts2012
Hi-Lite erts2012AdaCore
 
Program Verification / Automated Theorem Proving
Program Verification / Automated Theorem ProvingProgram Verification / Automated Theorem Proving
Program Verification / Automated Theorem Provinglokeshwer2
 
Bcb Pp Presentation, 10 10 (2)
Bcb Pp Presentation, 10 10 (2)Bcb Pp Presentation, 10 10 (2)
Bcb Pp Presentation, 10 10 (2)Enyonam
 
Formal Verification
Formal VerificationFormal Verification
Formal VerificationIlia Levin
 
09 - Program verification
09 - Program verification09 - Program verification
09 - Program verificationTudor Girba
 

En vedette (7)

Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
Analytic Scorecarding - TDWI NW Chapter Presentation Jan 2010
 
Hi-Lite erts2012
Hi-Lite erts2012Hi-Lite erts2012
Hi-Lite erts2012
 
Program Verification / Automated Theorem Proving
Program Verification / Automated Theorem ProvingProgram Verification / Automated Theorem Proving
Program Verification / Automated Theorem Proving
 
Bcb Pp Presentation, 10 10 (2)
Bcb Pp Presentation, 10 10 (2)Bcb Pp Presentation, 10 10 (2)
Bcb Pp Presentation, 10 10 (2)
 
Formal Verification
Formal VerificationFormal Verification
Formal Verification
 
09 - Program verification
09 - Program verification09 - Program verification
09 - Program verification
 
The Pyramid of Hate
The Pyramid of HateThe Pyramid of Hate
The Pyramid of Hate
 

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

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

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

Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
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#
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программах
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 

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 support@viva64.com Рабочее время: 09:00 – 18:00 (GMT +3:00)