SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Цена ошибки
Андрей Карпов
ООО «СиПроВер»
karpov@viva64.com
О докладчике
• Карпов Андрей Николаевич, 1981
• Технический директор ООО «СиПроВер»
• Кандидат физико-математических наук
• MVP в категории Visual C++
• Intel Black Belt Software Developer
• Один из основателей проекта PVS-Studio
(статический анализатор кода для языков
C/C++).
• Присутствует на Habrahabr под именем
Andrey2008 - habrahabr.ru/users/andrey2008/
www.viva64.com
Часто программисты даже не догадываются,
как дорого обходится ошибка
• У меня нет статистики по средней цене ошибки. Слишком они
бывают разные и обнаруживаются на разных этапах.
• Зато я знаю, столько в среднем по индустрии стоит 1 строка кода.
Попробуйте угадать.
www.viva64.com
Сколько стоит написать одну строчку кода?
www.viva64.com
Сколько стоит написать одну строчку кода?
28 $
www.viva64.com
Почему так много?
• В больших программных проектах пишется не так много строк
кода.
• Не учитываются накладные расходы.
www.viva64.com
Про что не помнят программисты
• Программист занимается написанием кода вовсе не 100%
рабочего времени;
• Налоги и премии;
• Отпуска и болезни;
• Обслуживание (бухгалтерия, админ, уборщица);
• Рабочее место, компьютер, интернет, аренда, печеньки, бумага в
принтере;
• Программное обеспечение;
• Прочее.
www.viva64.com
К чему я веду?
• Цена ошибки намного выше, чем кажется программисту.
• Если человек просидел над ошибкой час, то не только он потерял
час.
• Этот час простоя нужно умножать на приличный коэффициент.
• А если баг дошёл до тестировщика, то это вообще ужас.
www.viva64.com
Очень важно, чтобы ошибки
обнаруживались на самых ранних этапах
• Чем раньше ошибка обнаружена, тем ниже цена её исправления.
• Методики для раннего обнаружения:
• Разработка через тестирование (TDD);
• Статический анализ кода;
• Защитное программирование.
• Все три методики дополняют друг друга.
www.viva64.com
Мы будем говорить о статическом анализе
кода и как можно заранее защититься от
некоторых ошибок
• Рекомендации на все случаи я дать не могу, но дам повод
задуматься о самосовершенствовании при написании кода.
• Опыт основан на результате проверки более 200 открытых
проектов, написанных на Си и Си++. База ошибок:
http://www.viva64.com/ru/examples/
www.viva64.com
Как разработчики
видят себя
Как я вижу
разработчиков
Эффект последней строки
• Про альпинистов;
• Статистика была собрана мной из базы, когда
там содержалось около 1500 примеров ошибок.
• Я выявил 84 подходящих фрагмента.
• В 43 случаях ошибка была в последней строке.
TrinityCore
inline Vector3int32& operator+=(const Vector3int32& other) {
x += other.x;
y += other.y;
z += other.y;
return *this;
}
www.viva64.com
Эффект последней строки
Source Engine SDK
inline void Init(
float ix=0,
float iy=0,
float iz=0,
float iw = 0 )
{
SetX( ix );
SetY( iy );
SetZ( iz );
SetZ( iw );
}
Chromium
if (access & FILE_WRITE_ATTRIBUTES)
output.append(ASCIIToUTF16("tFILE_WRITE_ATTRIBUTESn"));
if (access & FILE_WRITE_DATA)
output.append(ASCIIToUTF16("tFILE_WRITE_DATAn"));
if (access & FILE_WRITE_EA)
output.append(ASCIIToUTF16("tFILE_WRITE_EAn"));
if (access & FILE_WRITE_EA)
output.append(ASCIIToUTF16("tFILE_WRITE_EAn"));
break;
www.viva64.com
Эффект последней строки
qreal x = ctx->callData->args[0].toNumber(); Qt
qreal y = ctx->callData->args[1].toNumber();
qreal w = ctx->callData->args[2].toNumber();
qreal h = ctx->callData->args[3].toNumber();
if (!qIsFinite(x) || !qIsFinite(y) ||
!qIsFinite(w) || !qIsFinite(w))
if (!strncmp(vstart, "ASCII", 5)) OpenSSL
arg->format = ASN1_GEN_FORMAT_ASCII;
else if (!strncmp(vstart, "UTF8", 4))
arg->format = ASN1_GEN_FORMAT_UTF8;
else if (!strncmp(vstart, "HEX", 3))
arg->format = ASN1_GEN_FORMAT_HEX;
else if (!strncmp(vstart, "BITLIST", 3))
arg->format = ASN1_GEN_FORMAT_BITLIST;
www.viva64.com
Эффект последней строки
1. Самое простое. Нужно знать
про этот эффект и внимательней
проверять правки.
2. Нереализуемое на практике.
Поменьше делайте Copy-Paste.
3. Выравнивайте однородные
блоки, чтобы ошибка была
сразу заметна.
4. Используйте «таблицы».0
10
20
30
40
50
1 2 3 4 5
www.viva64.com
Где ещё поможет форматирование таблицей
Asterisk
static char
*token_equivs1[] =
{
....
"KW_IF",
"KW_IGNOREPAT",
"KW_INCLUDES"
"KW_JUMP",
"KW_MACRO",
"KW_PATTERN",
....
};
www.viva64.com
Где ещё поможет форматирование таблицей
static char
*token_equivs1[] =
{
....
"KW_IF" ,
"KW_IGNOREPAT" ,
"KW_INCLUDES"
"KW_JUMP" ,
"KW_MACRO" ,
"KW_PATTERN" ,
....
};
Asterisk
static char
*token_equivs1[] =
{
....
"KW_IF",
"KW_IGNOREPAT",
"KW_INCLUDES"
"KW_JUMP",
"KW_MACRO",
"KW_PATTERN",
....
};
static char
*token_equivs1[] =
{
....
, "KW_IF"
, "KW_IGNOREPAT"
, "KW_INCLUDES"
"KW_JUMP"
, "KW_MACRO"
, "KW_PATTERN"
....
};
www.viva64.com
«Во всём виноват компилятор»
Надо понять, что происходит, а не спешить вставлять костыли.
Ffdshow
TprintPrefs::TprintPrefs(....)
{
memset(this, 0, sizeof(this)); // This doesn't seem to
// help after optimization.
dx = dy = 0;
isOSD = false;
xpos = ypos = 0;
align = 0;
linespacing = 0;
sizeDx = 0;
sizeDy = 0;
...
}
www.viva64.com
Конструкции, защищающие от ошибок.
CountOf(). Плохо.
Shareaza
#define countof(array) (sizeof(array) / sizeof((array)[0]))
size_t AnsiDecodeChar(..., TCHAR arrChar[2], ....)
{
....
nCharSize = MultiByteToWideChar(....,
arrChar, countof(arrChar));
....
}
www.viva64.com
Конструкции, защищающие от ошибок.
CountOf(). Хорошо.
Chromium
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
Подробности можно узнать в статье “PVS-Studio vs Chromium”:
http://www.viva64.com/ru/a/0074/
www.viva64.com
Конструкции, защищающие от ошибок.
CountOf(). Хорошо.
Chromium
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
void Test(int C[3])
{
int A[3];
int *B = Foo();
size_t x = arraysize(A); // Ok
x = arraysize(B); // Compilation error
x = arraysize(C); // Compilation error
}
www.viva64.com
Конструкции, защищающие от ошибок.
Автоматическое вычисление размера.
errno_t _strupr_s(char * _Str, size_t _Size);
template <size_t _Size> errno_t _strupr_s(char (&_String)[_Size]);
Устройство:
template <size_t _Size>
inline errno_t _strupr_s(_DstType (&_Dst)[_Size])
{
return _strupr_s(_Dst, _Size);
}
www.viva64.com
Не жадничайте на скобках и лишних
строчках
Wine
if ((hr = SafeArrayGetUBound( sa, 1, &size ) != S_OK))
{
SafeArrayUnaccessData( sa );
return hr;
}
MongoDB
ss << (sizeof(char *) == 8) ? " 64bit" : " 32bit";
// Красивый пример.
// Будет напечатано 0 или 1 вместо "32bit" / "64bit".
www.viva64.com
Не жадничайте на скобках и лишних
строчках
Qt
bool QConfFileSettingsPrivate::readIniLine(....)
{
....
char ch;
while (i < dataLen &&
((ch = data.at(i) != 'n') && ch != 'r'))
++i;
....
}
www.viva64.com
Используйте статический анализатор
• Пример использования PVS-Studio: “ошибка, на обнаружение которой
было безуспешно потрачено около 50 часов, при помощи однократного
запуска анализатора была обнаружена и исправлена менее чем за час!”
(Источник: http://habrahabr.ru/post/198836/)
• Можно обнаружить проблемы, о существовании которых программист
может даже не подозревать.
www.viva64.com
Ошибки, о существовании которых не
подозревают: char c = memcmp().
Такая ошибка послужила причиной серьезной уязвимости в MySQL/MariaDB до версий 5.1.61,
5.2.11, 5.3.5, 5.5.22. Суть в том, что при подключении пользователя MySQL /MariaDB вычисляется
токен (SHA от пароля и хэша), который сравнивается с ожидаемым значением функцией
'memcmp'. На некоторых платформах возвращаемое значение может выпадать из диапазона
[-128..127]. В итоге, в 1 случае из 256 процедура сравнения хэша с ожидаемым значением всегда
возвращает значение 'true', независимо от хэша. В результате, простая команда на bash даёт
злоумышленнику рутовый доступ к уязвимому серверу MySQL, даже если он не знает пароль.
typedef char my_bool;
...
my_bool check(...) {
return memcmp(...);
}
Подробнее: Security vulnerability in MySQL/MariaD - http://seclists.org/oss-sec/2012/q2/493
www.viva64.com
Ошибки, о существовании которых не
подозревают: memset + оптимизация.
Перезаписывать память – зачем? - http://habrahabr.ru/company/abbyy/blog/127259/
V597. The compiler could delete the 'memset' function call, which is used to flush 'Foo' buffer. The
RtlSecureZeroMemory() function should be used to erase the private data -
http://www.viva64.com/ru/d/0208/
php
char* php_md5_crypt_r(const char *pw,const char *salt, char *out)
{
static char passwd[MD5_HASH_MAX_LEN], *p;
unsigned char final[16];
....
/* Don't leave anything around in vm they could use. */
memset(final, 0, sizeof(final));
return (passwd);
}
www.viva64.com
Ошибки, о существовании которых не
подозревают: strncat.
char *strncat(
char *strDest,
const char *strSource,
size_t count
);
MSDN: strncat does not check for
sufficient space in strDest; it
is therefore a potential cause
of buffer overruns. Keep in mind
that count limits the number of
characters appended; it is not a
limit on the size of strDest.
www.viva64.com
Ошибки, о существовании которых не
подозревают: strncat.
char newProtoFilter[2048] = "....";
strncat(newProtoFilter, szTemp, 2048);
strncat(newProtoFilter, "|", 2048);
char filename[NNN];
...
strncat(filename,
dcc->file_info.filename,
sizeof(filename) - strlen(filename));
www.viva64.com
strncat(...., sizeof(filename) - strlen(filename) - 1);
Дополнительная защита. Тестируем тесты.
Chromium: profile_sync_service_password_unittest.cc 261
static bool PasswordFormComparator(const PasswordForm& pf1,
const PasswordForm& pf2) {
......
if (pf1.username_value < pf2.username_value)
return true;
if (pf1.username_value < pf2.username_value)
return true;
if (pf1.password_element < pf2.password_element)
return true;
if (pf1.password_value < pf2.password_value)
return true;
return false;
}
Лучше перестраховаться. Одна методика дополняет другую.
www.viva64.com
Итого:
• Программист больше времени тратит на чтение кода, а не на
написание.
• Пишите понятный и простой код.
• Не экономьте на скобках, запятых, пробелах и строках.
• Форматируйте код.
• Используйте статический анализ.
• Используйте «защищённое программирование».
• Устраивайте обзоры кода.
Ответы на вопросы
E-Mail: Karpov@viva64.com
Я в twitter: https://twitter.com/Code_Analysis
PVS-Studio: http://www.viva64.com/ru/pvs-studio/
www.viva64.com

Weitere ähnliche Inhalte

Was ist angesagt?

хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...corehard_by
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
How to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life longHow to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life longTimur Shemsedinov
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексYandex
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Andrey Karpov
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работуcorehard_by
 
Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyVladimir Kochetkov
 
SSL/TLS: история уязвимостей
SSL/TLS: история уязвимостейSSL/TLS: история уязвимостей
SSL/TLS: история уязвимостейPositive Hack Days
 

Was ist angesagt? (20)

хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
How to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life longHow to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life long
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работу
 
Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.Cryptography
 
SSL/TLS: история уязвимостей
SSL/TLS: история уязвимостейSSL/TLS: история уязвимостей
SSL/TLS: история уязвимостей
 

Andere mochten auch

PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...
PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...
PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...Andrey Karpov
 
Crange: Clang based tool to index and cross-reference C/C++ source code
Crange: Clang based tool to index and cross-reference C/C++ source code Crange: Clang based tool to index and cross-reference C/C++ source code
Crange: Clang based tool to index and cross-reference C/C++ source code Anurag Patel
 
Just Enough C For Open Source Projects
Just Enough C For Open Source ProjectsJust Enough C For Open Source Projects
Just Enough C For Open Source ProjectsAndy Lester
 
Weather report project
Weather report projectWeather report project
Weather report projectalzambra
 
A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...
A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...
A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...Nurul Haszeli Ahmad
 
C language mini project By Arbab Ahmed
C language mini project By Arbab AhmedC language mini project By Arbab Ahmed
C language mini project By Arbab AhmedArbab Ahmed
 
Random Quiz Maker in C Language Project Slide
Random Quiz Maker in C Language Project SlideRandom Quiz Maker in C Language Project Slide
Random Quiz Maker in C Language Project SlideRaiyad Raad
 
Writing c code for the 8051
Writing c code for the 8051Writing c code for the 8051
Writing c code for the 8051Quản Minh Tú
 
weather and climate ppt for students..
weather and climate ppt for students..weather and climate ppt for students..
weather and climate ppt for students..Aditya Ghosh
 
Erin's Weather Presentation
Erin's Weather PresentationErin's Weather Presentation
Erin's Weather PresentationPantheon
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksSlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShareSlideShare
 

Andere mochten auch (13)

EVIDENCIA: MINI FAMILY TREE PROJECT 2° C
EVIDENCIA: MINI FAMILY TREE PROJECT 2° CEVIDENCIA: MINI FAMILY TREE PROJECT 2° C
EVIDENCIA: MINI FAMILY TREE PROJECT 2° C
 
PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...
PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...
PVS-Studio, a static analyzer detecting errors in the source code of C/C++/C+...
 
Crange: Clang based tool to index and cross-reference C/C++ source code
Crange: Clang based tool to index and cross-reference C/C++ source code Crange: Clang based tool to index and cross-reference C/C++ source code
Crange: Clang based tool to index and cross-reference C/C++ source code
 
Just Enough C For Open Source Projects
Just Enough C For Open Source ProjectsJust Enough C For Open Source Projects
Just Enough C For Open Source Projects
 
Weather report project
Weather report projectWeather report project
Weather report project
 
A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...
A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...
A SOURCE CODE PERSPECTIVE C OVERFLOW VULNERABILITIES EXPLOIT TAXONOMY BASED...
 
C language mini project By Arbab Ahmed
C language mini project By Arbab AhmedC language mini project By Arbab Ahmed
C language mini project By Arbab Ahmed
 
Random Quiz Maker in C Language Project Slide
Random Quiz Maker in C Language Project SlideRandom Quiz Maker in C Language Project Slide
Random Quiz Maker in C Language Project Slide
 
Writing c code for the 8051
Writing c code for the 8051Writing c code for the 8051
Writing c code for the 8051
 
weather and climate ppt for students..
weather and climate ppt for students..weather and climate ppt for students..
weather and climate ppt for students..
 
Erin's Weather Presentation
Erin's Weather PresentationErin's Weather Presentation
Erin's Weather Presentation
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

Ähnlich wie Цена ошибки

200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 
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
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеAndrey Karpov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenAndrey Karpov
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиAndrey Karpov
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 

Ähnlich wie Цена ошибки (20)

200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
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#
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 

Mehr von Andrey Karpov

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developerAndrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesAndrey Karpov
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewAndrey Karpov
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Andrey Karpov
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesAndrey Karpov
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?Andrey Karpov
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaAndrey Karpov
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)Andrey Karpov
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Andrey Karpov
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerAndrey Karpov
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareAndrey Karpov
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsAndrey Karpov
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++Andrey Karpov
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?Andrey Karpov
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youAndrey Karpov
 

Mehr von Andrey Karpov (20)

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developer
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error Examples
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature Overview
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
PVS-Studio в 2021
PVS-Studio в 2021PVS-Studio в 2021
PVS-Studio в 2021
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' Mistakes
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and Java
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical Reviewer
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal Engine
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for you
 

Цена ошибки

  • 1. Цена ошибки Андрей Карпов ООО «СиПроВер» karpov@viva64.com
  • 2. О докладчике • Карпов Андрей Николаевич, 1981 • Технический директор ООО «СиПроВер» • Кандидат физико-математических наук • MVP в категории Visual C++ • Intel Black Belt Software Developer • Один из основателей проекта PVS-Studio (статический анализатор кода для языков C/C++). • Присутствует на Habrahabr под именем Andrey2008 - habrahabr.ru/users/andrey2008/ www.viva64.com
  • 3. Часто программисты даже не догадываются, как дорого обходится ошибка • У меня нет статистики по средней цене ошибки. Слишком они бывают разные и обнаруживаются на разных этапах. • Зато я знаю, столько в среднем по индустрии стоит 1 строка кода. Попробуйте угадать. www.viva64.com
  • 4. Сколько стоит написать одну строчку кода? www.viva64.com
  • 5. Сколько стоит написать одну строчку кода? 28 $ www.viva64.com
  • 6. Почему так много? • В больших программных проектах пишется не так много строк кода. • Не учитываются накладные расходы. www.viva64.com
  • 7. Про что не помнят программисты • Программист занимается написанием кода вовсе не 100% рабочего времени; • Налоги и премии; • Отпуска и болезни; • Обслуживание (бухгалтерия, админ, уборщица); • Рабочее место, компьютер, интернет, аренда, печеньки, бумага в принтере; • Программное обеспечение; • Прочее. www.viva64.com
  • 8. К чему я веду? • Цена ошибки намного выше, чем кажется программисту. • Если человек просидел над ошибкой час, то не только он потерял час. • Этот час простоя нужно умножать на приличный коэффициент. • А если баг дошёл до тестировщика, то это вообще ужас. www.viva64.com
  • 9. Очень важно, чтобы ошибки обнаруживались на самых ранних этапах • Чем раньше ошибка обнаружена, тем ниже цена её исправления. • Методики для раннего обнаружения: • Разработка через тестирование (TDD); • Статический анализ кода; • Защитное программирование. • Все три методики дополняют друг друга. www.viva64.com
  • 10. Мы будем говорить о статическом анализе кода и как можно заранее защититься от некоторых ошибок • Рекомендации на все случаи я дать не могу, но дам повод задуматься о самосовершенствовании при написании кода. • Опыт основан на результате проверки более 200 открытых проектов, написанных на Си и Си++. База ошибок: http://www.viva64.com/ru/examples/ www.viva64.com
  • 11. Как разработчики видят себя Как я вижу разработчиков
  • 12. Эффект последней строки • Про альпинистов; • Статистика была собрана мной из базы, когда там содержалось около 1500 примеров ошибок. • Я выявил 84 подходящих фрагмента. • В 43 случаях ошибка была в последней строке. TrinityCore inline Vector3int32& operator+=(const Vector3int32& other) { x += other.x; y += other.y; z += other.y; return *this; } www.viva64.com
  • 13. Эффект последней строки Source Engine SDK inline void Init( float ix=0, float iy=0, float iz=0, float iw = 0 ) { SetX( ix ); SetY( iy ); SetZ( iz ); SetZ( iw ); } Chromium if (access & FILE_WRITE_ATTRIBUTES) output.append(ASCIIToUTF16("tFILE_WRITE_ATTRIBUTESn")); if (access & FILE_WRITE_DATA) output.append(ASCIIToUTF16("tFILE_WRITE_DATAn")); if (access & FILE_WRITE_EA) output.append(ASCIIToUTF16("tFILE_WRITE_EAn")); if (access & FILE_WRITE_EA) output.append(ASCIIToUTF16("tFILE_WRITE_EAn")); break; www.viva64.com
  • 14. Эффект последней строки qreal x = ctx->callData->args[0].toNumber(); Qt qreal y = ctx->callData->args[1].toNumber(); qreal w = ctx->callData->args[2].toNumber(); qreal h = ctx->callData->args[3].toNumber(); if (!qIsFinite(x) || !qIsFinite(y) || !qIsFinite(w) || !qIsFinite(w)) if (!strncmp(vstart, "ASCII", 5)) OpenSSL arg->format = ASN1_GEN_FORMAT_ASCII; else if (!strncmp(vstart, "UTF8", 4)) arg->format = ASN1_GEN_FORMAT_UTF8; else if (!strncmp(vstart, "HEX", 3)) arg->format = ASN1_GEN_FORMAT_HEX; else if (!strncmp(vstart, "BITLIST", 3)) arg->format = ASN1_GEN_FORMAT_BITLIST; www.viva64.com
  • 15. Эффект последней строки 1. Самое простое. Нужно знать про этот эффект и внимательней проверять правки. 2. Нереализуемое на практике. Поменьше делайте Copy-Paste. 3. Выравнивайте однородные блоки, чтобы ошибка была сразу заметна. 4. Используйте «таблицы».0 10 20 30 40 50 1 2 3 4 5 www.viva64.com
  • 16. Где ещё поможет форматирование таблицей Asterisk static char *token_equivs1[] = { .... "KW_IF", "KW_IGNOREPAT", "KW_INCLUDES" "KW_JUMP", "KW_MACRO", "KW_PATTERN", .... }; www.viva64.com
  • 17. Где ещё поможет форматирование таблицей static char *token_equivs1[] = { .... "KW_IF" , "KW_IGNOREPAT" , "KW_INCLUDES" "KW_JUMP" , "KW_MACRO" , "KW_PATTERN" , .... }; Asterisk static char *token_equivs1[] = { .... "KW_IF", "KW_IGNOREPAT", "KW_INCLUDES" "KW_JUMP", "KW_MACRO", "KW_PATTERN", .... }; static char *token_equivs1[] = { .... , "KW_IF" , "KW_IGNOREPAT" , "KW_INCLUDES" "KW_JUMP" , "KW_MACRO" , "KW_PATTERN" .... }; www.viva64.com
  • 18. «Во всём виноват компилятор» Надо понять, что происходит, а не спешить вставлять костыли. Ffdshow TprintPrefs::TprintPrefs(....) { memset(this, 0, sizeof(this)); // This doesn't seem to // help after optimization. dx = dy = 0; isOSD = false; xpos = ypos = 0; align = 0; linespacing = 0; sizeDx = 0; sizeDy = 0; ... } www.viva64.com
  • 19. Конструкции, защищающие от ошибок. CountOf(). Плохо. Shareaza #define countof(array) (sizeof(array) / sizeof((array)[0])) size_t AnsiDecodeChar(..., TCHAR arrChar[2], ....) { .... nCharSize = MultiByteToWideChar(...., arrChar, countof(arrChar)); .... } www.viva64.com
  • 20. Конструкции, защищающие от ошибок. CountOf(). Хорошо. Chromium template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array))) Подробности можно узнать в статье “PVS-Studio vs Chromium”: http://www.viva64.com/ru/a/0074/ www.viva64.com
  • 21. Конструкции, защищающие от ошибок. CountOf(). Хорошо. Chromium template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array))) void Test(int C[3]) { int A[3]; int *B = Foo(); size_t x = arraysize(A); // Ok x = arraysize(B); // Compilation error x = arraysize(C); // Compilation error } www.viva64.com
  • 22. Конструкции, защищающие от ошибок. Автоматическое вычисление размера. errno_t _strupr_s(char * _Str, size_t _Size); template <size_t _Size> errno_t _strupr_s(char (&_String)[_Size]); Устройство: template <size_t _Size> inline errno_t _strupr_s(_DstType (&_Dst)[_Size]) { return _strupr_s(_Dst, _Size); } www.viva64.com
  • 23. Не жадничайте на скобках и лишних строчках Wine if ((hr = SafeArrayGetUBound( sa, 1, &size ) != S_OK)) { SafeArrayUnaccessData( sa ); return hr; } MongoDB ss << (sizeof(char *) == 8) ? " 64bit" : " 32bit"; // Красивый пример. // Будет напечатано 0 или 1 вместо "32bit" / "64bit". www.viva64.com
  • 24. Не жадничайте на скобках и лишних строчках Qt bool QConfFileSettingsPrivate::readIniLine(....) { .... char ch; while (i < dataLen && ((ch = data.at(i) != 'n') && ch != 'r')) ++i; .... } www.viva64.com
  • 25. Используйте статический анализатор • Пример использования PVS-Studio: “ошибка, на обнаружение которой было безуспешно потрачено около 50 часов, при помощи однократного запуска анализатора была обнаружена и исправлена менее чем за час!” (Источник: http://habrahabr.ru/post/198836/) • Можно обнаружить проблемы, о существовании которых программист может даже не подозревать. www.viva64.com
  • 26. Ошибки, о существовании которых не подозревают: char c = memcmp(). Такая ошибка послужила причиной серьезной уязвимости в MySQL/MariaDB до версий 5.1.61, 5.2.11, 5.3.5, 5.5.22. Суть в том, что при подключении пользователя MySQL /MariaDB вычисляется токен (SHA от пароля и хэша), который сравнивается с ожидаемым значением функцией 'memcmp'. На некоторых платформах возвращаемое значение может выпадать из диапазона [-128..127]. В итоге, в 1 случае из 256 процедура сравнения хэша с ожидаемым значением всегда возвращает значение 'true', независимо от хэша. В результате, простая команда на bash даёт злоумышленнику рутовый доступ к уязвимому серверу MySQL, даже если он не знает пароль. typedef char my_bool; ... my_bool check(...) { return memcmp(...); } Подробнее: Security vulnerability in MySQL/MariaD - http://seclists.org/oss-sec/2012/q2/493 www.viva64.com
  • 27. Ошибки, о существовании которых не подозревают: memset + оптимизация. Перезаписывать память – зачем? - http://habrahabr.ru/company/abbyy/blog/127259/ V597. The compiler could delete the 'memset' function call, which is used to flush 'Foo' buffer. The RtlSecureZeroMemory() function should be used to erase the private data - http://www.viva64.com/ru/d/0208/ php char* php_md5_crypt_r(const char *pw,const char *salt, char *out) { static char passwd[MD5_HASH_MAX_LEN], *p; unsigned char final[16]; .... /* Don't leave anything around in vm they could use. */ memset(final, 0, sizeof(final)); return (passwd); } www.viva64.com
  • 28. Ошибки, о существовании которых не подозревают: strncat. char *strncat( char *strDest, const char *strSource, size_t count ); MSDN: strncat does not check for sufficient space in strDest; it is therefore a potential cause of buffer overruns. Keep in mind that count limits the number of characters appended; it is not a limit on the size of strDest. www.viva64.com
  • 29. Ошибки, о существовании которых не подозревают: strncat. char newProtoFilter[2048] = "...."; strncat(newProtoFilter, szTemp, 2048); strncat(newProtoFilter, "|", 2048); char filename[NNN]; ... strncat(filename, dcc->file_info.filename, sizeof(filename) - strlen(filename)); www.viva64.com strncat(...., sizeof(filename) - strlen(filename) - 1);
  • 30. Дополнительная защита. Тестируем тесты. Chromium: profile_sync_service_password_unittest.cc 261 static bool PasswordFormComparator(const PasswordForm& pf1, const PasswordForm& pf2) { ...... if (pf1.username_value < pf2.username_value) return true; if (pf1.username_value < pf2.username_value) return true; if (pf1.password_element < pf2.password_element) return true; if (pf1.password_value < pf2.password_value) return true; return false; } Лучше перестраховаться. Одна методика дополняет другую. www.viva64.com
  • 31. Итого: • Программист больше времени тратит на чтение кода, а не на написание. • Пишите понятный и простой код. • Не экономьте на скобках, запятых, пробелах и строках. • Форматируйте код. • Используйте статический анализ. • Используйте «защищённое программирование». • Устраивайте обзоры кода.
  • 32. Ответы на вопросы E-Mail: Karpov@viva64.com Я в twitter: https://twitter.com/Code_Analysis PVS-Studio: http://www.viva64.com/ru/pvs-studio/ www.viva64.com