SlideShare a Scribd company logo
1 of 49
Download to read offline
Приватные байки от
разработчика анализатора
кода
Андрей Карпов
ООО «СиПроВер»
www.viva64.com
О докладчике
• Карпов Андрей Николаевич, 1981
• Присутствует на Habrahabr под именем
Andrey2008 - habrahabr.ru/users/andrey2008/
• Технический директор ООО «СиПроВер»
• MVP в категории Visual C++
• Intel Black Belt Software Developer
• Один из основателей проекта PVS-Studio
(статический анализатор кода для языков
C/C++/C#).
www.viva64.com
Содержание
• Пункт N1
• Пункт N2
• Пункт N3
• Я буду рассказывать о том,
о чем не могу писать в
статьях.
А ведь накопилось. И о странном.
www.viva64.com
На экономический вопрос «Почему программное обеспечение такое
дорогое?» столь же экономическим ответом был бы такой: «Потому
что его пытаются получить при помощи дешевого труда». А почему
пытаются? Да потому, что присущие ему трудности повсеместно
сильно недооцениваются.
Эдсгер Дейкстра
Как так получилось, что требуются
вспомогательные инструменты?
www.viva64.com
Чувствуется пренебрежение к сложности
При сдвиге >> знакового типа
int левые биты заполняются
копией знакового бита.
На самом деле, это
implementation-defined.
www.viva64.com
Ещё пример из той же книги по электронике
Файлы file1.c, file2.c, file3.c
можно подключить с
помощью директивы #include
#include "file1.h"
#include "file2.h"
#include "file3.h"
#include "file1.c"
#include "file2.c"
#include "file3.c"
www.viva64.com
Ещё пример из той же книги по электронике
Пространство, занимаемое
структурой в памяти,
равняется сумме размеров
всех элементов.
www.viva64.com
Что же делать? Да здравствуют костыли!
• Мы все молодцы. Но нас заставляют делать быстро и дёшево.
• Компромисс: вспомогательные инструменты.
• Например, отладчики, статические анализаторы кода.
• Это не хорошо и не плохо. Так устроен мир.
Начало. Viva64
• Актуальность: нет
инструмента для поиска 64-
битных ошибок
• Казалось, надо приложить
немного усилий и будет
много денег
• Суровая реальность
www.viva64.com
Стартап
• Ожидание
• Я буду генерировать
интересные креативные
идеи и воплощать их в
жизнь
• Реальность
• Сгорела проводка
• Важный сотрудник
заболел
• 10 $
• 1 копейка
www.viva64.com
Действительность
Как начать?
• "Я готов отчитаться за каждый
доллар, но не спрашивайте меня,
как я заработал первый
миллион." — Генри Форд.
• Чем только не приходится
заниматься…
• Любая подработка
• Гранты
• Аутсорсинг
www.viva64.com
2008
www.viva64.com
2015
www.viva64.com
Краткая история
• Viva64
• VivaMP
• VivaCore
• PVS-Studio
• PVS-Studio + C++Builder
• CppCat
• PVS-Studio + C#
www.viva64.com
Особенности маркетинга для C++
программистов
www.viva64.com
О сравнении анализаторов
•Я не могу написать, что пришлось отбирать
проекты
• Visual Studio падал
• Cppcheck зависал
•На самом деле, всё сводится к «шарику»
www.viva64.com
Всегда есть кому дорого и про Хобби
Не знаю, в каком мире вы живете, но, мне кажется, что многие компании
склонны переоценивать важность своего софта.
На 9000 рублей можно кормить двух человек месяц, проехать 3000
километров, пролететь четверть земли. Купить более 20 книг, сделать
операцию на глазу.
www.viva64.com
Ну тупые (c) Задорнов
char m_buffer[BUF_SIZE];
memset( m_buffer, 0, sizeof(*m_buffer) );
В этой строке очищается столько байт, сколько хранится в
первом элементе массива.
Про это некрасиво писать, но программисты часто
не видят ошибки. Это грустно, так как мешает
продавать инструмент.
www.viva64.com
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
memcpy( mat, src, sizeof( src ) );
}
Ну тупые (c) Задорнов
V511. The sizeof() operator returns size of the pointer, and not of the array, in 'sizeof(src)' expression.
Except it doesn't. The sizeof() operator returns the size of the object, and
src is not a pointer - it is a float[3][3]. sizeof() correctly returns 36 on my
machine.
Позже: Oop - yup - I essentially tested with with "char A[100];" rather
than "void Foo(char B[100])"
www.viva64.com
SHFILEOPSTRUCT Data;
....
Data.pTo = L"";
Описание тоже никто не читает
V540 Member 'pTo' should point to string terminated by two 0 characters.
В C++ sizeof(*L"") == sizeof(wchar_t) == 2,
так что ошибки тут нет.
www.viva64.com
Тяжела и неказиста жизнь простого
продвиженца
• Помочь опубликовать я не могу, т.к. не открываю вложения
• - Так ведь в статье были ссылки.
- Я не перехожу по обернутым ссылкам. (речь про bit.ly)
• Analyzer
• https
www.viva64.com
Как раз там, где нужен статический анализ,
его продать невозможно
• Требуется не устранить максимальное количество ошибок, а
пройти сертификацию.
• Заземлённые указатели
www.viva64.com
Байки разработчика с одной из АЭС
• «Некоторые персонажи в персонале
станций могут дать фору Гомеру Симпсону»
• «Зачем нам git? Вот смотри, у меня всё в
тетрадке записано».
• Ещё пример из жизни: в конструкторе
копирования у класса происходит открытие
файла конфигурации и полный его парсинг.
www.viva64.com
Он иногда присылал мне примечательные
фрагменты
• В следующие две строки программист умудрился уместить
как минимум 3 WTF:
inline virtual Foo& operator=(const Foo& x) {
if (&x); return *this;
}
www.viva64.com
if(a_input_a) a_input_a2 = adupl(a_input_a, type_array1);
else a_input_a2 = 0L;
if(a_time_a) a_time_a2 = adupl(a_time_a, type_array1);
else a_time_a2 = 0L;
if(a_update_ia) a_update_a2 = adupl(a_update_ia, type_array);
else a_update_a2 = 0L;
if(a_input_d) a_input_d2 = adupl(a_input_d, type_array1);
else a_input_d2 = 0L;
if(a_time_d) a_time_d2 = adupl(a_time_d, type_array1);
else a_time_d2 = 0L;
if(a_update_id) a_update_d2 = adupl(a_update_id, type_array);
else a_update_d2 = 0L;
if(a_input_av) a_input_av2 = adupl(a_input_av, type_array1);
else a_input_av2 = 0L;
if(a_time_av) a_time_av2 = adupl(a_time_av, type_array1);
else a_time_av2 = 0L;
if(a_update_iav) a_update_av2 = adupl(a_update_iav, type_array);
else a_update_av2 = 0L;
if(a_input_dv) a_input_dv2 = adupl(a_input_dv, type_array1);
else a_input_dv2 = 0L;
if(a_time_dv) a_time_dv2 = adupl(a_time_dv, type_array1);
else a_time_dv2 = 0L;
if(a_update_idv) a_update_dv2 = adupl(a_update_idv, type_array);
else a_update_dv2 = 0L;
if(a_input_df) a_input_df2 = adupl(a_input_df, type_array1);
else a_input_df2 = 0L;
if(a_time_df) a_time_df2 = adupl(a_time_df, type_array1);
else a_time_df2 = 0L;
if(a_update_idf) a_update_df2 = adupl(a_update_idf, type_array);
else a_update_df2 = 0L;
Разгребая Авгиевы конюшни
www.viva64.com
Ещё впечатления
• Рядом с этим кодом был комментарий, в котором
программист объяснял, что в новом стандарте C++ bool будет
то же самое, что и int. Год написания комментария не
известен.
#if !defined(BOOL_DEFINED)
typedef int bool;
#endif
www.viva64.com
О разработке PVS-Studio
www.viva64.com
Я за Си
Любой дурак может написать код, понятный компьютеру. Хорошие
программисты пишут код, понятный людям.
Мартин Фаулер
www.viva64.com
Я за Си (с точки зрения разработчика PVS-Studio)
Свой класс строки - это норма
• Рано или поздно, в любом
состоявшемся проекте появляется свой
класс строки.
• Я ждал, появится ли он в PVS-Studio.
• Он появился, и это было обосновано.
• Это нормально. Не стесняйтесь это
делать.
www.viva64.com
Самое сложное в статическом анализе: не
ругаться
• Испытания C++: 105 открытых проектов
• Испытания C#: 49 открытых проектов
• Пример V501
• Пример V640
V501.
Опасным считается инфиксная операция, если
совпадает левый и правый операнд.
while (X < X)
if (A == B || A == B)
www.viva64.com
V501. Дьявол кроется в деталях
• X*X
• while (*p++ == *a++ && *p++ == *a++)
• Слева и справа находятся числовые литералы
if (0 == 0)
… 15 | 15 …
• #define M1 100
#define M2 100
if (x == M1 || x == M2)
• float x = foo();
if (x == x)
www.viva64.com
V501. Дьявол кроется в деталях
• / или - применяются к числовым константам: 1./1.
• Строка из Zlib:
if (opaque) items += size - size; / * make compiler happy * /
• rand() - rand()
rand() % N - rand() % N
• Слева и справа от '|', '&', '^', '%' находятся классы.
if (str == str) – ищем
if (vect ^ vect) – лучше пропускать
• sizeof(__int64) < sizeof(__int64)
www.viva64.com
V501. Дьявол кроется в деталях
• 0 << 31 | 0 << 30 | ...
(0 << 6) | (0 << 3) | …
• '0' == 0x30 && 'A' == 0x41 && 'a' == 0x61
• Эта шаблонная функция для определения NaN чисел.
• Read(x) && Read(x)
• #define USEDPARAM(p) ((&p) == (&p)) и прочие
• Слева и справа расположен вызов функций с такими
именами как pop, _pop.
• И так далее
www.viva64.com
V640.
Текст оформлен так, как будто
выполняются все действия.
if (a==1)
b = c; foo(b);
if (a==1)
b = c;
foo(b);
www.viva64.com
Дьявол кроется в деталях
• Все выражения находятся на 1 строке: if (a==1) b = c; F(b);
• В разных строках не совпадает количество символов
табуляции
• if (a)
return x;
foo();
• else else else for(..;..;..)
foo(); foo(); foo();
foo(); foo(); foo();
• Присутствуют #if, #else, #endif, #pragma и т.п.
• И так далее.
www.viva64.com
Редкие ключевые слова и расширения
• Приходится поддерживать редкое или нестандартное
• Это скрыто от глаз пользователей
• Примеры
www.viva64.com
VisualC++
• __forceinline
• __identifier
• __if_exists
• __if_not_exists
• __int3264
• __noop
• __pragma
• Вообще нигде не описаны: _int8, _int16, _int32, _int64
www.viva64.com
GCC
• __float80, __float128
• __int128
• __builtin_offsetof
• __imag__
• __real__
• __inline__
• __extension__
• __asm__
www.viva64.com
GCC
• struct { int a; int b; } X = { a : 0, b : 1 };
• func c_open(name *byte, mode int, perm int) int __asm__
("open");
• __is_same (type1, type2)
• Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
www.viva64.com
GCC (есть даже полезное для простых
программистов, но лучше не использовать)
При использовании оператора "switch", вы можете задать диапазон значений
для "case".
switch (x)
{
case 1 ... 5: Foo1(); break;
case 'A' ... 'Z': Foo1(); break;
}
a = x ?: y;  a = x ? x : y;
www.viva64.com
GCC. Аналог
анонимных
функций для Си
int Foo(int a) {
int x = Foo1(a);
Foo2();
return x;
}
// Можно записать так:
int Foo(int a) {
return ({ int x = Foo1(a); Foo2(); x; });
}
www.viva64.com
Наличие подобных конструкций связано с попыткой помочь делать макросы
более безопасными. Вспомним классическую ошибку при использовании
макроса max:
#define max(a,b) ((a) > (b) ? (a) : (b))
x = max(a++, b);
Операция "++" будет выполнена 2 раза, что не соответствует задуманному
программистом. Чтобы этого избежать, предлагается написать так:
#define maxint(a,b) 
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
www.viva64.com
GCC. Вложенные функции
double square_sum (double a, double b)
{
double square (double z)
{
return z * z;
}
return square(a) + square(b);
}
www.viva64.com
• Ещё один пример. Перенос строки в конце файла.
• Когда люди говорят «да это максимум на неделю дел то», они
просто не понимают, о чём говорят.
• 500 т.р., это дорого! Будем писать сами.
• Программисты часто не различают «поделку» и программный
продукт.
• Работа в разных условиях
• Масштабируемость
• Интерфейс
• Документация
• И т.д.
Редкие ключевые слова и расширения
www.viva64.com
Разное
• Почему нет цен на сайте?
• Программисты не умеют считать
• Почему сайт www.viva64.com такой страшный?
• Зато он приносит нам деньги
• Вы ещё сайт Abraxas Software не видели  http://www.abxsoft.com/
• Почему единорог?
• А вы что думаете?
www.viva64.com
Готов отвечать на коварные вопросы
Андрей Карпов
karpov@viva64.com

More Related Content

What's hot

Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Haskell
HaskellHaskell
HaskellDevDay
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 

What's hot (20)

Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Haskell
HaskellHaskell
Haskell
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 

Similar to Андрей Карпов, Приватные байки от разработчиков анализатора кода

Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenAndrey Karpov
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...corehard_by
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!Roman Dvornov
 
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
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Fwdays
 
Паттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхПаттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхAndrey Karpov
 

Similar to Андрей Карпов, Приватные байки от разработчиков анализатора кода (20)

Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
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#
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороны
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"
 
Паттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхПаттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играх
 
Как разраба
Как разрабаКак разраба
Как разраба
 

More from Sergey Platonov

Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itSergey Platonov
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейSergey Platonov
 
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаSergey Platonov
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Sergey Platonov
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioSergey Platonov
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17Sergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtSergey Platonov
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereSergey Platonov
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеSergey Platonov
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Sergey Platonov
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Sergey Platonov
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Sergey Platonov
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLSergey Platonov
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляSergey Platonov
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Sergey Platonov
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортSergey Platonov
 

More from Sergey Platonov (20)

Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.io
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI веке
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуля
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репорт
 

Андрей Карпов, Приватные байки от разработчиков анализатора кода

  • 1. Приватные байки от разработчика анализатора кода Андрей Карпов ООО «СиПроВер» www.viva64.com
  • 2. О докладчике • Карпов Андрей Николаевич, 1981 • Присутствует на Habrahabr под именем Andrey2008 - habrahabr.ru/users/andrey2008/ • Технический директор ООО «СиПроВер» • MVP в категории Visual C++ • Intel Black Belt Software Developer • Один из основателей проекта PVS-Studio (статический анализатор кода для языков C/C++/C#). www.viva64.com
  • 3. Содержание • Пункт N1 • Пункт N2 • Пункт N3 • Я буду рассказывать о том, о чем не могу писать в статьях. А ведь накопилось. И о странном. www.viva64.com
  • 4. На экономический вопрос «Почему программное обеспечение такое дорогое?» столь же экономическим ответом был бы такой: «Потому что его пытаются получить при помощи дешевого труда». А почему пытаются? Да потому, что присущие ему трудности повсеместно сильно недооцениваются. Эдсгер Дейкстра Как так получилось, что требуются вспомогательные инструменты? www.viva64.com
  • 5. Чувствуется пренебрежение к сложности При сдвиге >> знакового типа int левые биты заполняются копией знакового бита. На самом деле, это implementation-defined. www.viva64.com
  • 6. Ещё пример из той же книги по электронике Файлы file1.c, file2.c, file3.c можно подключить с помощью директивы #include #include "file1.h" #include "file2.h" #include "file3.h" #include "file1.c" #include "file2.c" #include "file3.c" www.viva64.com
  • 7. Ещё пример из той же книги по электронике Пространство, занимаемое структурой в памяти, равняется сумме размеров всех элементов. www.viva64.com
  • 8. Что же делать? Да здравствуют костыли! • Мы все молодцы. Но нас заставляют делать быстро и дёшево. • Компромисс: вспомогательные инструменты. • Например, отладчики, статические анализаторы кода. • Это не хорошо и не плохо. Так устроен мир.
  • 9. Начало. Viva64 • Актуальность: нет инструмента для поиска 64- битных ошибок • Казалось, надо приложить немного усилий и будет много денег • Суровая реальность www.viva64.com
  • 10. Стартап • Ожидание • Я буду генерировать интересные креативные идеи и воплощать их в жизнь • Реальность • Сгорела проводка • Важный сотрудник заболел • 10 $ • 1 копейка www.viva64.com
  • 12. Как начать? • "Я готов отчитаться за каждый доллар, но не спрашивайте меня, как я заработал первый миллион." — Генри Форд. • Чем только не приходится заниматься… • Любая подработка • Гранты • Аутсорсинг www.viva64.com
  • 15. Краткая история • Viva64 • VivaMP • VivaCore • PVS-Studio • PVS-Studio + C++Builder • CppCat • PVS-Studio + C# www.viva64.com
  • 16. Особенности маркетинга для C++ программистов www.viva64.com
  • 17. О сравнении анализаторов •Я не могу написать, что пришлось отбирать проекты • Visual Studio падал • Cppcheck зависал •На самом деле, всё сводится к «шарику» www.viva64.com
  • 18. Всегда есть кому дорого и про Хобби Не знаю, в каком мире вы живете, но, мне кажется, что многие компании склонны переоценивать важность своего софта. На 9000 рублей можно кормить двух человек месяц, проехать 3000 километров, пролететь четверть земли. Купить более 20 книг, сделать операцию на глазу. www.viva64.com
  • 19. Ну тупые (c) Задорнов char m_buffer[BUF_SIZE]; memset( m_buffer, 0, sizeof(*m_buffer) ); В этой строке очищается столько байт, сколько хранится в первом элементе массива. Про это некрасиво писать, но программисты часто не видят ошибки. Это грустно, так как мешает продавать инструмент. www.viva64.com
  • 20. ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy( mat, src, sizeof( src ) ); } Ну тупые (c) Задорнов V511. The sizeof() operator returns size of the pointer, and not of the array, in 'sizeof(src)' expression. Except it doesn't. The sizeof() operator returns the size of the object, and src is not a pointer - it is a float[3][3]. sizeof() correctly returns 36 on my machine. Позже: Oop - yup - I essentially tested with with "char A[100];" rather than "void Foo(char B[100])" www.viva64.com
  • 21. SHFILEOPSTRUCT Data; .... Data.pTo = L""; Описание тоже никто не читает V540 Member 'pTo' should point to string terminated by two 0 characters. В C++ sizeof(*L"") == sizeof(wchar_t) == 2, так что ошибки тут нет. www.viva64.com
  • 22. Тяжела и неказиста жизнь простого продвиженца • Помочь опубликовать я не могу, т.к. не открываю вложения • - Так ведь в статье были ссылки. - Я не перехожу по обернутым ссылкам. (речь про bit.ly) • Analyzer • https www.viva64.com
  • 23. Как раз там, где нужен статический анализ, его продать невозможно • Требуется не устранить максимальное количество ошибок, а пройти сертификацию. • Заземлённые указатели www.viva64.com
  • 24. Байки разработчика с одной из АЭС • «Некоторые персонажи в персонале станций могут дать фору Гомеру Симпсону» • «Зачем нам git? Вот смотри, у меня всё в тетрадке записано». • Ещё пример из жизни: в конструкторе копирования у класса происходит открытие файла конфигурации и полный его парсинг. www.viva64.com
  • 25. Он иногда присылал мне примечательные фрагменты • В следующие две строки программист умудрился уместить как минимум 3 WTF: inline virtual Foo& operator=(const Foo& x) { if (&x); return *this; } www.viva64.com
  • 26. if(a_input_a) a_input_a2 = adupl(a_input_a, type_array1); else a_input_a2 = 0L; if(a_time_a) a_time_a2 = adupl(a_time_a, type_array1); else a_time_a2 = 0L; if(a_update_ia) a_update_a2 = adupl(a_update_ia, type_array); else a_update_a2 = 0L; if(a_input_d) a_input_d2 = adupl(a_input_d, type_array1); else a_input_d2 = 0L; if(a_time_d) a_time_d2 = adupl(a_time_d, type_array1); else a_time_d2 = 0L; if(a_update_id) a_update_d2 = adupl(a_update_id, type_array); else a_update_d2 = 0L; if(a_input_av) a_input_av2 = adupl(a_input_av, type_array1); else a_input_av2 = 0L; if(a_time_av) a_time_av2 = adupl(a_time_av, type_array1); else a_time_av2 = 0L; if(a_update_iav) a_update_av2 = adupl(a_update_iav, type_array); else a_update_av2 = 0L; if(a_input_dv) a_input_dv2 = adupl(a_input_dv, type_array1); else a_input_dv2 = 0L; if(a_time_dv) a_time_dv2 = adupl(a_time_dv, type_array1); else a_time_dv2 = 0L; if(a_update_idv) a_update_dv2 = adupl(a_update_idv, type_array); else a_update_dv2 = 0L; if(a_input_df) a_input_df2 = adupl(a_input_df, type_array1); else a_input_df2 = 0L; if(a_time_df) a_time_df2 = adupl(a_time_df, type_array1); else a_time_df2 = 0L; if(a_update_idf) a_update_df2 = adupl(a_update_idf, type_array); else a_update_df2 = 0L; Разгребая Авгиевы конюшни www.viva64.com
  • 27. Ещё впечатления • Рядом с этим кодом был комментарий, в котором программист объяснял, что в новом стандарте C++ bool будет то же самое, что и int. Год написания комментария не известен. #if !defined(BOOL_DEFINED) typedef int bool; #endif www.viva64.com
  • 29. Я за Си Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям. Мартин Фаулер www.viva64.com
  • 30. Я за Си (с точки зрения разработчика PVS-Studio)
  • 31. Свой класс строки - это норма • Рано или поздно, в любом состоявшемся проекте появляется свой класс строки. • Я ждал, появится ли он в PVS-Studio. • Он появился, и это было обосновано. • Это нормально. Не стесняйтесь это делать. www.viva64.com
  • 32. Самое сложное в статическом анализе: не ругаться • Испытания C++: 105 открытых проектов • Испытания C#: 49 открытых проектов • Пример V501 • Пример V640
  • 33. V501. Опасным считается инфиксная операция, если совпадает левый и правый операнд. while (X < X) if (A == B || A == B) www.viva64.com
  • 34. V501. Дьявол кроется в деталях • X*X • while (*p++ == *a++ && *p++ == *a++) • Слева и справа находятся числовые литералы if (0 == 0) … 15 | 15 … • #define M1 100 #define M2 100 if (x == M1 || x == M2) • float x = foo(); if (x == x) www.viva64.com
  • 35. V501. Дьявол кроется в деталях • / или - применяются к числовым константам: 1./1. • Строка из Zlib: if (opaque) items += size - size; / * make compiler happy * / • rand() - rand() rand() % N - rand() % N • Слева и справа от '|', '&', '^', '%' находятся классы. if (str == str) – ищем if (vect ^ vect) – лучше пропускать • sizeof(__int64) < sizeof(__int64) www.viva64.com
  • 36. V501. Дьявол кроется в деталях • 0 << 31 | 0 << 30 | ... (0 << 6) | (0 << 3) | … • '0' == 0x30 && 'A' == 0x41 && 'a' == 0x61 • Эта шаблонная функция для определения NaN чисел. • Read(x) && Read(x) • #define USEDPARAM(p) ((&p) == (&p)) и прочие • Слева и справа расположен вызов функций с такими именами как pop, _pop. • И так далее www.viva64.com
  • 37. V640. Текст оформлен так, как будто выполняются все действия. if (a==1) b = c; foo(b); if (a==1) b = c; foo(b); www.viva64.com
  • 38. Дьявол кроется в деталях • Все выражения находятся на 1 строке: if (a==1) b = c; F(b); • В разных строках не совпадает количество символов табуляции • if (a) return x; foo(); • else else else for(..;..;..) foo(); foo(); foo(); foo(); foo(); foo(); • Присутствуют #if, #else, #endif, #pragma и т.п. • И так далее. www.viva64.com
  • 39. Редкие ключевые слова и расширения • Приходится поддерживать редкое или нестандартное • Это скрыто от глаз пользователей • Примеры www.viva64.com
  • 40. VisualC++ • __forceinline • __identifier • __if_exists • __if_not_exists • __int3264 • __noop • __pragma • Вообще нигде не описаны: _int8, _int16, _int32, _int64 www.viva64.com
  • 41. GCC • __float80, __float128 • __int128 • __builtin_offsetof • __imag__ • __real__ • __inline__ • __extension__ • __asm__ www.viva64.com
  • 42. GCC • struct { int a; int b; } X = { a : 0, b : 1 }; • func c_open(name *byte, mode int, perm int) int __asm__ ("open"); • __is_same (type1, type2) • Some_Class A __attribute__ ((init_priority (2000))); Some_Class B __attribute__ ((init_priority (543))); www.viva64.com
  • 43. GCC (есть даже полезное для простых программистов, но лучше не использовать) При использовании оператора "switch", вы можете задать диапазон значений для "case". switch (x) { case 1 ... 5: Foo1(); break; case 'A' ... 'Z': Foo1(); break; } a = x ?: y;  a = x ? x : y; www.viva64.com
  • 44. GCC. Аналог анонимных функций для Си int Foo(int a) { int x = Foo1(a); Foo2(); return x; } // Можно записать так: int Foo(int a) { return ({ int x = Foo1(a); Foo2(); x; }); } www.viva64.com
  • 45. Наличие подобных конструкций связано с попыткой помочь делать макросы более безопасными. Вспомним классическую ошибку при использовании макроса max: #define max(a,b) ((a) > (b) ? (a) : (b)) x = max(a++, b); Операция "++" будет выполнена 2 раза, что не соответствует задуманному программистом. Чтобы этого избежать, предлагается написать так: #define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) www.viva64.com
  • 46. GCC. Вложенные функции double square_sum (double a, double b) { double square (double z) { return z * z; } return square(a) + square(b); } www.viva64.com
  • 47. • Ещё один пример. Перенос строки в конце файла. • Когда люди говорят «да это максимум на неделю дел то», они просто не понимают, о чём говорят. • 500 т.р., это дорого! Будем писать сами. • Программисты часто не различают «поделку» и программный продукт. • Работа в разных условиях • Масштабируемость • Интерфейс • Документация • И т.д. Редкие ключевые слова и расширения www.viva64.com
  • 48. Разное • Почему нет цен на сайте? • Программисты не умеют считать • Почему сайт www.viva64.com такой страшный? • Зато он приносит нам деньги • Вы ещё сайт Abraxas Software не видели  http://www.abxsoft.com/ • Почему единорог? • А вы что думаете? www.viva64.com
  • 49. Готов отвечать на коварные вопросы Андрей Карпов karpov@viva64.com