SlideShare une entreprise Scribd logo
1  sur  85
Télécharger pour lire hors ligne
PVS-Studio
ООО «СиПроВер»
Сайт: www.viva64.com
Контакты: support@viva64.com
Статический анализатор кода
Windows/Linux, C/C++/C#
2017
Статический анализатор кода PVS-Studio
• Выполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#
• Поддерживаются проекты, разрабатываемые с помощью:
• Windows: Visual C++, Clang, MinGW, Visual C#
• Linux: Clang, GCC
• Plugin для Visual Studio 2010-2015
• Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta
DevStudio и т.д.
• Утилита Standalone
На начало 2017 года в PVS-Studio
реализовано
• C, C++ диагностик: 349
• C# диагностик: 130
• Подробная on-line документация на
русском и английском языке
• PDF
Основные возможности
• Быстрый старт (мониторинг компиляции)
• Windows утилита: CLMonitoring
• Linux утилита: pvs-studio-analyzer
• Прямая интеграция анализатора в системы автоматизации сборки
и утилита BlameNotifier (рассылка писем)
• Режим автоматического анализа изменённых файлов
• Отличная масштабируемость
• Работа с ложными срабатываниями
Почему нужны анализаторы кода?
Почему команда PVS-Studio выбрала
C, C++ и C#?
Почему C и C++?
• Эффективные, но сложные языки, в которых легко допустить
ошибку
• Причём, так дело обстоит десятилетиями и вряд ли изменится
• Давайте проверим с помощью PVS-Studio первую версию
компилятора Cfront, вышедшую в свет в 1985.
• “К тридцатилетию первого C++ компилятора: ищем ошибки в Cfront”
http://www.viva64.com/ru/b/0355/
Ошибка в компиляторе Cfront (1985)
Pexpr expr::typ(Ptable tbl)
{
....
Pclass cl;
....
cl = (Pclass) nn->tp;
cl->permanent=1;
if (cl == 0) error('i',"%k %s'sT missing",CLASS,s);
В начале указатель разыменовывается. Далее идёт проверка,
которая говорит нам, что указатель мог быть nullptr.
Прошло 30 лет
• Ничего не изменилось. Язык C++ всё так же сложен и опасен.
• Размер кодовой базы растёт, и все важнее использовать
инструменты статического анализа
• Давайте проверим с помощью PVS-Studio код современного
компилятора Clang
• 2016 год. “Находим ошибки в коде проекта LLVM с помощью анализатора
PVS-Studio”
http://www.viva64.com/ru/b/0446/
Clang (ошибка найдена в октябре 2016)
bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
....
MachineModuleInfoMachO &MMIMacho =
MMI->getObjFileInfo<MachineModuleInfoMachO>();
if (MAI->doesSupportExceptionHandling() && MMI) {
Вначале указатель разыменовывается.
Далее идёт проверка, которая говорит нам,
что указатель мог быть nullptr.
Почему C#?
• Быть может с C# ситуация лучше?
• Некоторые типы ошибок в C# невозможны
• Поэтому лучше, но не сильно
• На месте остаются опечатки, логические ошибки и т.д.
• Да и от того, что указатели назвали ссылками лучше не стало
• Мы видим всё ту же ошибку с нулевой ссылкой
• Давайте проверим, например, проект Microsoft PowerShell:
http://www.viva64.com/ru/b/0447/
Такие ошибки актуальны и для C#
public CommandMetadata(CommandMetadata other)
{
....
_parameters = new Dictionary<string, ParameterMetadata>(
other.Parameters.Count, .....);
if (other.Parameters != null)
Ошибка в проекте PowerShell: в начале
используем ссылку, а затем проверяем.
Мы можем очень долго демонстрировать
подобные примеры
• Анализатор PVS-Studio легко находит ошибки в известных
проектах:
• Linux kernel - http://www.viva64.com/ru/b/0460/
• GCC - http://www.viva64.com/ru/b/0425/
• MSBuild - http://www.viva64.com/ru/b/0424/
• Qt - http://www.viva64.com/ru/b/0424/
• И так далее - http://www.viva64.com/ru/inspections/
• Это говорит о востребованности статического анализа кода
• Давайте посмотрим какие ошибки умеет искать PVS-Studio
Диагностические возможности PVS-Studio
Ошибки при переносе кода на 64-битные
платформы
Эту ошибку мы нашли с помощью PVS-Studio в проекте TortoiseSVN
DialogBoxParam(g_hmodThisDll,
MAKEINTRESOURCE(IDD_LOGIN),
g_hwndMain,
(DLGPROC)(LoginDialogProc),
(long)this);
V220 Suspicious sequence of types castings: memsize -> 32-bit integer ->
memsize. The value being casted: 'this'. logindialog.cpp 105
Пояснение. Тип long в Win64 по прежнему 32-битный. В 64-битной программе объект может быть
создан за пределами младших 4 Гигабайт памяти. В этом случае значение указателя будет
испорчено. Неприятная ошибка, которая может проявляться очень редко после долгой работы
программы. Правильно: (LPARAM)(this).
Адрес локальной переменной
возвращается из функции по ссылке
Эту ошибку мы нашли с помощью PVS-Studio в проекте LLVM
V558 Function returns the reference to temporary local object: res. LiveInterval.h
679
SingleLinkedListIterator<T> &operator++(int) {
SingleLinkedListIterator res = *this;
++*this;
return res;
}
Арифметическое переполнение, потеря
значимости
Эту ошибку мы нашли с помощью PVS-Studio в проекте OpenXRay
V636 The '1 / 100' expression was implicitly cast from 'int' type to 'float' type.
Consider utilizing an explicit type cast to avoid the loss of a fractional part. An
example: double A = (double)(X) / Y;. gl_rendertarget.cpp 245
float CRenderTarget::im_noise_time;
....
param_noise_fps = 25.f;
param_noise_scale = 1.f;
im_noise_time = 1/100;
....
Выход за границу массива
Эту ошибку мы нашли с помощью PVS-Studio в проекте Notepad++
V557 Array overrun is possible. The value of 'i' index could reach 46. Notepad++
preferencedlg.cpp 984
int encodings[] = {1250, 1251, 1252, .... };
for (int i = 0; i <= sizeof(encodings)/sizeof(int); i++)
{
int cmdID = em->getIndexFromEncoding(encodings[i]);
....
}
Мёртвый код
Эту ошибку мы нашли с помощью PVS-Studio в проекте Unreal Engine 4
V607 Ownerless expression 'NumByteProperties'. codegenerator.cpp 633
int32 NumByteProperties = 0;
....
if (bIsByteProperty)
{
NumByteProperties;
}
Недостижимый код
Эту ошибку мы нашли с помощью PVS-Studio в проекте Linux Kernel
V695 Range intersections are possible within conditional expressions. Example: if
(A < 5) { ... } else if (A < 2) { ... }. Check lines: 439, 441. ad5933.c 441
if (val > 511)
val = (val >> 1) | (1 << 9);
else if (val > 1022)
val = (val >> 2) | (3 << 9);
Неинициализированные переменные
Эту ошибку мы нашли с помощью PVS-Studio в проекте Mono
V3070 Uninitialized variable 'schema' is used when initializing the
'ResourceSchema' variable. ResXResourceWriter.cs 59
class ResXResourceWriter : IResourceWriter, IDisposable
{
public static readonly string ResourceSchema = schema;
....
static string schema = ....;
}
Пояснение. На момент инициализации ResourceSchema поле schema будет
проинициализировано значением по умолчанию (null в данном случае).
Неиспользуемые переменные и аргументы
Эту ошибку мы нашли с помощью PVS-Studio в проекте Xenko
V3065 Parameter 'height' is not utilized inside method's body. SiliconStudio.Xenko
Image.cs 473
public static Image New3D(int width, int height, int depth, ....)
{
return new Image(
CreateDescription(
TextureDimension.Texture3D,
width, width, depth,
mipMapCount, format, 1),
dataPointer, 0, null, false);
}
Некорректные операции сдвига
Эту ошибку мы нашли с помощью PVS-Studio в проекте Bitcoin
V629 Consider inspecting the '0x80 << (8 * (vch.size() - 1))' expression. Bit shifting
of the 32-bit value with a subsequent expansion to the 64-bit type. script.h 169
Пояснение. Происходит переполнение при сдвиге 32-битного значения 0x80.
Сейчас исправленный вариант кода выглядит так:
static int64_t set_vch(....) {
int64_t result = 0;
....
return -(result & ~(0x80 << (8 * (vch.size() - 1))));
return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1)))));
Неопределенное поведение
Эту ошибку мы нашли с помощью PVS-Studio в проекте
Network Security Services
V567 Undefined behavior. The 'j' variable is modified while being used twice
between sequence points. pk11slot.c 1926
waste[j & 0xf] = j++;
Неправильная работа с типами
Эту ошибку мы нашли с помощью PVS-Studio в проекте VirtualBox
V745 A 'wchar_t *' type string is incorrectly converted to 'BSTR' type string.
Consider using 'SysAllocString' function. vboxcredentialprovider.cpp 231
HRESULT EventClassID(BSTR bstrEventClassID);
static HRESULT VBoxCredentialProviderRegisterSENS(void)
{
hr = pIEventSubscription->put_EventClassID(
L"{d5978630-5b9f-11d1-8dd2-00aa004abd5e}");
Неправильное представление о работе
функции/класса
Эту ошибку мы нашли с помощью PVS-Studio в проекте Unity3D
V3057 Invalid regular expression patern in constructor. Inspect the first argument.
AssetBundleDemo ExecuteInternalMono.cs 48
private static readonly Regex UnsafeCharsWindows =
new Regex("[^A-Za-z0-9_-.:,/@]");
Пояснение. При попытке создания экземпляра класса Regex с данным
паттерном мы получим исключение System.ArgumentException с сообщением:
parsing "[^A-Za-z0-9_-.:,/@]" -
Unrecognized escape sequence '_'.
Отсутствие виртуального деструктора
Все примеры длинные и их сложно поместить в
презентацию. Поверьте, мы ищем такие проблемы.
А пока предлагаю заварить чашечку кофе. Впереди у
нас ещё долгий интересный путь.
Оформление кода не совпадает с логикой
его работы
Эту ошибку мы нашли с помощью PVS-Studio в проекте Sony ATF
V3043 The code's operational logic does not correspond with its formatting. The
statement is indented to the right, but it is always executed. It is possible that
curly brackets are missing. Atf.Core.vs2010 QuatF.cs 282
public static QuatF Slerp(QuatF q1, QuatF q2, float t)
{
double dot = q2.X * q1.X + q2.Y * q1.Y +
q2.Z * q1.Z + q2.W * q1.W;
if (dot < 0)
q1.X = -q1.X; q1.Y = -q1.Y; q1.Z = -q1.Z; q1.W = -q1.W;
Ошибки при работе с исключениями
Эту ошибку мы нашли с помощью PVS-Studio в проекте OpenMW
V596 The object was created but it is not being used. The 'throw' keyword could
be missing: throw logic_error(FOO); components exprparser.cpp 101
if (t1==t2)
mOperands.push_back (t1);
else if (t1=='f' || t2=='f')
mOperands.push_back ('f');
else
std::logic_error ("failed to ....... ");throw
Переполнение буфера
Эту ошибку мы нашли с помощью PVS-Studio в проекте FreeBSD
V512 A call of the 'strcpy' function will lead to overflow of the buffer 'p->vendor'.
aacraid_cam.c 571
#define SID_VENDOR_SIZE 8
char vendor[SID_VENDOR_SIZE];
....
strcpy(p->vendor,"Adaptec ");
Пояснение. Строка содержит 8 символов. Однако, следует учитывать, что
функция strcpy добавит терминальный ноль. Он будет записан за пределами
буфера.
Проблемы безопасности
Эту ошибку мы нашли с помощью PVS-Studio в проекте PostgreSQL
V597 The compiler could delete the 'memset' function call, which is used to flush
'final' buffer. The RtlSecureZeroMemory() function should be used to erase the
private data. pgcrypto crypt-md5.c 157
Компилятор удаляет вызов функции memset: http://www.viva64.com/ru/w/V597/
char *px_crypt_md5(....) {
unsigned char final[MD5_SIZE];
....
/* Don't leave anything around in vm they could use. */
memset(final, 0, sizeof final);
}
Путаница с приоритетом операций
Эту ошибку мы нашли с помощью PVS-Studio в проекте Linux Kernel
V502 Perhaps the '?:' operator works in a different way than it was expected. The
'?:' operator has a lower priority than the '|' operator. core.c 1046
static int nvme_pr_preempt(struct block_device *bdev,
u64 old, u64 new, pr_type type, bool abort)
{
u32 cdw10 = nvme_pr_type(type) << 8 | abort ? 2 : 1;
1
2
Разыменование нулевого указателя /
нулевой ссылки
Эту ошибку мы нашли с помощью PVS-Studio в проекте LibreOffice
V595 The 'pSysWin' pointer was utilized before it was verified against nullptr.
Check lines: 738, 739. updatecheckui.cxx 738
MenuBar *pMBar = pSysWin->GetMenuBar();
if ( pSysWin && pMBar )
{
AddMenuBarIcon( pSysWin, true );
}
Ошибки синхронизации
Эту ошибку мы нашли с помощью PVS-Studio в проекте Unity3D
V3083 Unsafe invocation of event 'unload', NullReferenceException is possible.
Consider assigning event to a local variable before invoking it. AssetBundleDemo
AssetBundleManager.cs 47
internal void OnUnload()
{
m_AssetBundle.Unload(false);
if (unload != null)
unload();
}
Целочисленное деление на 0
Эту ошибку мы нашли с помощью PVS-Studio в проекте Inkscape
V609 Divide by zero. Denominator range [0..999]. lpe-fillet-chamfer.cpp 607
} else if (type >= 3000 && type < 4000) {
unsigned int chamferSubs = type-3000;
double chamfer_stepsTime = 1.0/chamferSubs;
Диапазон
[0..999]
Опечатки и Copy-Paste
• Анализатор PVS-Studio эффективно выявляет опечатки и
последствия неудачного Copy-Paste
• В анализаторе реализовано много диагностик для выявления
ошибок этого рода
• Остановимся на них чуть подробнее и рассмотрим несколько
примеров ошибок этого типа
• Дополнительно рекомендуем для чтения интересную статью
“Эффект последней строки” - http://www.viva64.com/ru/b/0260/
Опечатки и Copy-Paste (пример N1)
Эту ошибку мы нашли с помощью PVS-Studio в проекте Clang
V501 There are identical sub-expressions 'OpcodeLHS == BO_LE' to the left and to
the right of the '||' operator. RedundantExpressionCheck.cpp 174
if ((OpcodeLHS == BO_EQ ||
OpcodeLHS == BO_LE ||
OpcodeLHS == BO_LE)
&&
(OpcodeRHS == BO_EQ ||
OpcodeRHS == BO_GT ||
OpcodeRHS == BO_GE))
Опечатки и Copy-Paste (пример N2)
Эту ошибку мы нашли с помощью PVS-Studio в проекте GCC
V501 There are identical sub-expressions '!strcmp(a->v.val_vms_delta.lbl1, b-
>v.val_vms_delta.lbl1)' to the left and to the right of the '&&' operator.
dwarf2out.c 1428
return (!strcmp (a->v.val_vms_delta.lbl1,
b->v.val_vms_delta.lbl1)
&& !strcmp (a->v.val_vms_delta.lbl1,
b->v.val_vms_delta.lbl1));
Опечатки и Copy-Paste (пример N3)
Эту ошибку мы нашли с помощью PVS-Studio в проекте MySQL
V525 The code containing the
collection of similar blocks. Check
items '0', '1', '2', '3', '4', '1', '6' in
lines 680, 682, 684, 689, 691, 693,
695. sql records.cc 680
static int rr_cmp(uchar *a,uchar *b)
{
if (a[0] != b[0])
return (int) a[0] - (int) b[0];
if (a[1] != b[1])
return (int) a[1] - (int) b[1];
if (a[2] != b[2])
return (int) a[2] - (int) b[2];
if (a[3] != b[3])
return (int) a[3] - (int) b[3];
if (a[4] != b[4])
return (int) a[4] - (int) b[4];
if (a[5] != b[5])
return (int) a[1] - (int) b[5];
if (a[6] != b[6])
return (int) a[6] - (int) b[6];
return (int) a[7] - (int) b[7];
}
5
Опечатки и Copy-Paste (пример N4)
Эту ошибку мы нашли с помощью PVS-Studio в проекте PowerShell
V3001 There are identical sub-expressions 'BaseMaximumVersion != null' to the
left and to the right of the '&&' operator. System.Management.Automation
ImportModuleCommand.cs 1663
internal Version BaseMinimumVersion { get; set; }
internal Version BaseMaximumVersion { get; set; }
protected override void ProcessRecord()
{
if (BaseMaximumVersion != null &&
BaseMaximumVersion != null &&
BaseMaximumVersion < BaseMinimumVersion)
Опечатки и Copy-Paste (пример N5)
Эту ошибку мы нашли с помощью PVS-Studio в проекте Roslyn
V3004 The 'then' statement is
equivalent to the 'else' statement.
GetSemanticInfoTests.cs 2269
if (i % 2 == 0)
{
thread1.Start();
thread2.Start();
}
else
{
thread1.Start();
thread2.Start();
}
Опечатки и Copy-Paste (пример N6)
Эту ошибку мы нашли с помощью PVS-Studio в проекте MonoDevelop
V3012 The '?:' operator, regardless of its conditional expression, always returns
one and the same value: result.Test.FullName. GuiUnit_NET_4_5
NUnit2XmlOutputWriter.cs 207
xmlWriter.WriteAttributeString("name",
suite.TestType == "Assembly" ?
result.Test.FullName : result.Test.FullName);
Мы показали вам малую часть того, что
может находить анализатор PVS-Studio
• Подробная таблица диагностических
возможностей:
http://www.viva64.com/ru/w/
• Там же вы найдете подробное описание всех
диагностик
Main PVS-Studio diagnostic
abilities
C, C++ diagnostics C# diagnostics
64-bit issues
V101-V128, V201-V207,V220,
V221, V301-V303
-
Check that addresses to stack
memory does not leave the
function
V506, V507, V558, V758 -
Arithmetic over/underflow V636, V658 V3040, V3041
Array index out of bounds V557, V582, V643 V3106
Check for double-free V586, V749 -
Dead code V606, V607 -
Microoptimization V801-V815 -
Unreachable code V551, V695, V734 -
Uninitialized variables V573, V614, V679, V730, V737 V3070
Unused variables V603, V751, V763 V3061, V3065, V3077
Illegal bitwise/shift operations V610, V629, V673, V684 -
Undefined/unspecified
behavior
V567, V610, V611, V681, V704,
V708, V726, V736
-
Incorrect handling of the types
(HRESULT, BSTR, BOOL,
VARIANT_BOOL)
V543, V544, V545, V716, V721,
V724, V745, V750, V676, V767
-
Improper understanding of
function/class operation logic
V518, V530, V540, V541, V554,
V575, V597, V598, V618, V630,
V632, V663, V668, V698, V701,
V702, V717, V718, V720, V723,
V725, V727, V738, V742, V743,
V748, V762, V764
V3010, V3057, V3068, V3072,
V3073, V3074, V3082, V3084,
V3094, V3096, V3097, V3102,
V3103, V3104, V3108
Misprints
V501, V503, V504, V508, V511,
V516, V519, V520, V521, V525,
V527, V528, V529, V532, V533,
V534, V535, V536, V537, V539,
V546, V549, V552, V556, V559,
V560, V561, V564, V568, V570,
V571, V575, V577, V578, V584,
V587, V588, V589, V590, V592,
V600, V602, V604, V606, V607,
V616, V617, V620, V621, V622,
V625, V626, V627, V633, V637,
V638, V639, V644, V646, V650,
V651, V653, V654, V655, V660,
V661, V662, V666, V669, V671,
V672, V678, V682, V683, V693,
V715, V722, V735, V747, V754,
V756, V765, V767
V3001, V3003, V3005, V3007,
V3008, V3009, V3011, V3012,
V3014, V3015, V3016, V3020,
V3028, V3029, V3034, V3035,
V3036, V3037, V3038, V3050,
V3055, V3056, V3057, V3062,
V3063, V3066, V3081, V3086,
V3091, V3092, V3107, V3109
Missing Virtual destructor V599, V689 -
Coding style not matching the
operation logic of the source
code
V563, V612, V628, V640, V646,
V705
V3018, V3033, V3043, V3067,
V3069
Copy-Paste
V501, V517, V519, V523, V524,
V571, V581, V649, V656, V691,
V760, V766
V3001, V3003, V3004, V3008,
V3012, V3013, V3021, V3030,
V3058
Incorrect usage of exceptions
V509, V565, V596, V667, V740,
V741, V746, V759
V3006, V3052, V3100
Buffer overrun
V512, V514, V594, V635, V641,
V645, V752, V755
-
Security issues
V505, V510, V511, V512, V518,
V531, V541, V547, V559, V560,
V569, V570, V575, V576, V579,
V583, V597, V598, V618, V623,
V642, V645, V675, V676, V724,
V727, V729, V733, V743, V745,
V750
V3022, V3023, V3025, V3027,
V3053, V3063
Operation priority V502, V562, V593, V634, V648 -
Null pointer pointer/null
reference dereference
V522, V595, V664, V757
V3019, V3042, V3080, V3095,
V3105
Unchecked parameter
dereference
V595, V664 V3095
Synchronization errors V712
V3032, V3054, V3079, V3083,
V3089, V3090
WPF usage errors - V3044 - V3049
Check for integer division by
zero
V609 V3064
Customized user rules V2001-V2013 -
Демонстрация возможностей PVS-Studio
• Для демонстрации возможностей анализатора мы проверяем
открытые проекты. На начало 2017 года нами проверено 280
проектов.
• Побочный результат: в этих проектах нашей командой было
найдено 10700 ошибок
• Это именно 10700 ошибок, а не количество сообщений,
выданных анализатором
Демонстрация возможностей PVS-Studio
• Благодаря нашей команде и анализатору PVS-Studio, в открытых
проектах исправили более 10000 ошибок
• Вы можете увидеть все эти ошибки здесь:
http://www.viva64.com/ru/examples/
• База ошибок постоянно пополнятся и её можно использовать при
написании статей о качестве кода и составлении стандартов
кодирования
Демонстрация возможностей PVS-Studio
• В среднем, в одном открытом проекте мы нашли 10700 / 280 = 38
ошибок
• 38 ошибок на проект - это мало
• Поэтому важно подчеркнуть, что это - побочный эффект
• У нас нет цели найти как можно больше ошибок. Часто мы
останавливаемся, когда нашли достаточное количество дефектов
в проекте для написания статьи.
Демонстрация возможностей PVS-Studio
• Мы добились колоссальных результатов в устранении ошибок в
мире open-source проектов, не ставя такую цель
• В этом нам помогли:
• мощные диагностические возможности PVS-Studio
• возможность быстрого анализа даже незнакомых проектов
Правильный сценарий использования
• Конечно, интересно и полезно запустить анализатор PVS-Studio и
найти ошибку, которую до этого безуспешно искали 50 часов
• http://www.viva64.com/ru/b/0221/
• Хорошо проверять проекты и описывать найденные ошибки, как
делаем это мы в рекламных целях
• http://www.viva64.com/ru/inspections/
• Но следует помнить, что разовые проверки - это неправильный
способ использования анализаторов кода!
Правильный сценарий использования
• Статический анализатор приносит пользу, когда он используется
регулярно
• Два основных варианта:
• Автоматический анализ изменённого кода
• Ночные проверки
• Подробнее эти режимы рассмотрены в документации
Кратко о внутреннем устройстве PVS-Studio
Используемые технологии
• На примерах было продемонстрировано, что PVS-Studio
эффективно выявляет разнообразные типы ошибок
• Кратко перечислим технологии, которые положены в основу
анализатора
• Подробнее эта тема раскрыта в статье
“Как PVS-Studio ищет ошибки: методики и технологии”
http://www.viva64.com/ru/b/0466/
Используемые технологии
• Сопоставление с шаблоном (pattern-based analysis) на основе
абстрактного синтаксического дерева применяется для поиска
мест в исходном коде, которые похожи на известные шаблоны
кода с ошибкой.
Пример. Иногда не там прибавляют 1 при
использовании функции strlen:
realloc(name, strlen(name+1))
На самом деле следовало написать:
realloc(name, strlen(name)+1)
Используемые технологии
• Вывод типов (type inference) на основе семантической модели
программы позволяет анализатору иметь полную информацию о
всех переменных и выражениях, встречающихся в коде.
Самый просто пример: чтобы знать, что
функция printf используется неправильно,
нужно знать типы фактических аргументов.
Используемые технологии
• Символьное выполнение (symbolic execution) позволяет
вычислять значения переменных, которые могут приводить к
ошибкам, производить проверку диапазонов (range checking)
значений
• Анализ потока данных (data-flow analysis) используется для
вычисления ограничений, накладываемых на значения
переменных при обработке различных конструкций языка.
Например, какие значения может принимать переменная внутри
блоков if/else.
Используемые технологии
• Аннотированние методов (method annotations) предоставляет
больше информации об используемых методах, чем может быть
получено путём анализа только их сигнатуры.
• C/C++. На данный момент проаннотировано 6570 функций
(стандартные библиотеки C и C++, POSIX, MFC, Qt, ZLib и так
далее).
• C#. На данный момент проаннотировано 920 функций.
Используемые технологии
• Для разработки
эффективных диагностик
наша команда
использует большой
набор регрессионных
тестов
• Написан специальный
инструментарий для
работы с тестовой базой
открытых проектов
Используемые технологии
• Тестовая база:
• C++ Windows (Visual C++): 120 проектов
• C++ Linux (GCC): ещё 34 проекта
• C# Windows: 54 проекта
• Всего мы используем 7 методик тестирования нашего проекта
• См. раздел “Тестирование PVS-Studio” http://www.viva64.com/ru/b/0466/
Использование PVS-Studio
• Думаю, вы уже устали, поэтому минутка юмора
• Кратко суть статического анализа кода сводится к следующему:
Опять
Copy-Paste!
Использование PVS-Studio: внедрение
• Бывает непросто начать использовать статический анализ в
большом проекте
• Непонятно, что делать с сообщениями в старом коде…
• Мы предлагаем решение: база разметки
• Подробнее: http://www.viva64.com/ru/b/0364/
Использование PVS-Studio: подавление
ложных срабатываний
• Различные способы подавить ложные срабатывания в
конкретных строках кода
• Подавление ложных срабатываний в макросах
• Подавление ложных предупреждений с помощью файлов
конфигурации диагностик pvsconfig
• Подробнее: http://www.viva64.com/ru/m/0017/
Использование PVS-Studio: исключение из
анализа
• Возможность исключить из анализа файлы по имени, папке или
маске
• Интерактивная фильтрация результатов анализа (лога) в окне PVS-
Studio:
• по коду диагностики
• по имени файла
• по включению слова в текст диагностики
Использование PVS-Studio: автоматический
анализ файлов после их перекомпиляции
• Наиболее эффективно исправить ошибку сразу после того, как
она появилась в коде
Использование PVS-Studio: масштабируемость
• Поддержка многоядерных и многопроцессорных систем с
настройкой количества используемых ядер
• Поддержка IncrediBuild
Использование PVS-Studio: непрерывная
интеграция
• Запуск из командной строки для проверки всего решения:
позволяет интегрировать PVS-Studio в ночные сборки, чтобы
утром у всех был свежий лог
• Сохранение и загрузка результатов анализа: можно ночью
проверить код, сохранить результаты, а утром загрузить их и
смотреть
• Утилита BlameNotifier: инструмент позволяет рассылать письма
разработчикам об ошибках, которые PVS-Studio нашел во время
ночного прогона
• Использование относительных путей в файлах отчета
Использование PVS-Studio: прочее
• Удобная online-справка по всем диагностикам, которая доступна и
из программы, и на сайте, а также документация в .pdf одним
файлом
• Интерактивная фильтрация результатов анализа (лога) в окне PVS-
Studio
• Статистика ошибок в Excel
• Автоматическая проверка на наличие новых версий PVS-Studio
Использование PVS-Studio: Linux
• С PVS-Studio легко работать в Linux
• Но, чтобы не гадать с настройками и ключами запуска, просим
познакомиться с инструкцией
• Как запустить PVS-Studio в Linux:
http://www.viva64.com/ru/m/0036/
• Я знаю, что мы все не любим читать инструкции. Но поверьте,
этот тот случай, когда всё просто, кратко и экономит ваше время!
Использование PVS-Studio: быстрый старт
• Отдельного внимания заслуживает возможность быстро
попробовать PVS-Studio на любом проекте
• Для этого можно отследить запуски компилятора и собрать всю
необходимую для анализа информацию
• Windows:
• Утилита Standalone
• Инструкция: http://www.viva64.com/ru/m/0033/
• Linux
• Утилита pvs-studio-analyzer
• Инструкция: см. «Быстрый старт» в документе
http://www.viva64.com/ru/m/0036/
Использование PVS-Studio: SonarQube
• Для импорта результатов анализа в
SonarQube мы разработали плагин
sonar-pvs-studio-plugin
• Использование плагина позволяет
добавлять сообщения, найденные
анализатором PVS-Studio, в базу
сообщений сервера SonarQube
Использование PVS-Studio: SonarQube
• Подробности изложены в статье
«Контролируем качество кода с помощью платформы SonarQube»
http://www.viva64.com/ru/b/0452/
Скачать и попробовать PVS-Studio
Скачать и попробовать PVS-Studio
• Можно скачать и попробовать демонстрационную версию
• Windows: http://www.viva64.com/ru/pvs-studio-download/
• Linux: http://www.viva64.com/ru/pvs-studio-download-linux/
• Про ограничения демонстрационной версии:
http://www.viva64.com/ru/m/0009/
• Вы можете написать нам и получить на время полную версию:
support@viva64.com
Клиенты
Клиенты:
Клиенты:
Купить PVS-Studio
Типы лицензий
Team License Enterprise License
Подходит небольшим отделам, обычно это первый опыт
использования анализаторов
Подходит сразу для нескольких отделов в компании
Только Windows-версия Версии для Linux и Windows
Поддержка систем непрерывной интеграции
(continuous integration)
Интеграция с SonarQube
Инструмент BlameNotifier
Возможность предлагать для реализации собственные
диагностики.
Лицензию возможно купить только на 1 год Лицензию возможно купить на 1, 2 или 3 года
Ответ на письма в течение 48 часов Ответ на письма в течение 24 часов
Обычно используется в командах до 9 человек В основном используется при размере команд более 10
человек
Индивидуальные лицензии
• Мы позиционируем свой продукт как B2B решение и у нас нет
индивидуальных лицензий
• Почему так получилось: http://www.viva64.com/ru/b/0320/
• Индивидуальные разработчики могут воспользоваться вариантом
бесплатного лицензирования
• Как использовать PVS-Studio бесплатно:
http://www.viva64.com/ru/b/0457/
Купить PVS-Studio
• Для заказа лицензии и получения информации о ценах,
пожалуйста, напишите нам: support@viva64.com
Помимо приобретения лицензии на
статический анализатор кода PVS-Studio
возможны другие варианты сотрудничества
Сотрудничество: аудит
• Выполнение аудита кода и правка ошибок
• Примеры сотрудничества подобного типа:
• Как команда PVS-Studio улучшила код Unreal Engine:
http://www.viva64.com/ru/b/0330/
• Как перенести проект размером в 9 млн строк кода на 64-битную
платформу: http://www.viva64.com/ru/b/0342/
• Мы можем на регулярной основе контролировать качество кода и
вносить в него правки
• Имеем опыт работ в этом направлении, но эта информация попадает под
NDA
Сотрудничество
• На базе нашего анализатора мы можем разработать на заказ
специализированное решение
• Мы также готовы обсуждать сотрудничество, кто готов за процент
с продаж привести к нам клиентов
• По этим и другим вопросам: support@viva64.com
Презентация подходит к концу
Спасибо всем, кто добрался сюда
Полезные ссылки
• Расскажем о некоторых интересных и полезных материалах,
которые можно найти на сайте компании
• Электронная книга «Главный вопрос программирования,
рефакторинга и всего такого» - http://www.viva64.com/ru/b/0391/
• Электронная книга «Разработки 64-битных приложений на языке
Си/Си++» - http://www.viva64.com/ru/l/full/
Полезные ссылки
• Как 10 лет назад начинался проект PVS-Studio:
http://www.viva64.com/ru/b/0465/
• Контролируем качество кода с помощью платформы SonarQube:
http://www.viva64.com/ru/b/0452/
• Руководство по разработке модулей расширений на C# для Visual
Studio 2005-2012 и Atmel Studio:
http://www.viva64.com/ru/a/0082/
Всем спасибо! До свидания
• Написать письмо: support@viva64.com
• Подписаться на твиттер: @Code_Analysis
• Скачать PVS-Studio для Windows:
http://www.viva64.com/ru/pvs-studio/
• Скачать PVS-Studio для Linux:
http://www.viva64.com/ru/pvs-studio-download-linux/

Contenu connexe

Tendances

Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenAndrey Karpov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Статический анализ как ответ на вопрос о повышении качества кода
Статический анализ как ответ на вопрос о повышении качества кодаСтатический анализ как ответ на вопрос о повышении качества кода
Статический анализ как ответ на вопрос о повышении качества кодаAndrey Karpov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеAndrey Karpov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеYakubovichDA
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.YakubovichDA
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 

Tendances (20)

Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Статический анализ как ответ на вопрос о повышении качества кода
Статический анализ как ответ на вопрос о повышении качества кодаСтатический анализ как ответ на вопрос о повышении качества кода
Статический анализ как ответ на вопрос о повышении качества кода
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программирование
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 

En vedette

PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017Andrey Karpov
 
PVS-Studio advertisement - static analysis of C/C++ code
PVS-Studio advertisement - static analysis of C/C++ codePVS-Studio advertisement - static analysis of C/C++ code
PVS-Studio advertisement - static analysis of C/C++ codeAndrey Karpov
 
Листування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава СурковаЛистування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава Сурковаtsnua
 
Листування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава СурковаЛистування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава Сурковаtsnua
 
Rambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOSRambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOSRAMBLER&Co
 
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Andrey Akinshin
 
Consultative Selling for New Managers - A How-to Guide
Consultative Selling for New Managers - A How-to GuideConsultative Selling for New Managers - A How-to Guide
Consultative Selling for New Managers - A How-to GuideAniruddha Guha Sarkar
 
Case Alert Adecco UK Ltd - Upper Tribunal
Case Alert   Adecco UK Ltd - Upper TribunalCase Alert   Adecco UK Ltd - Upper Tribunal
Case Alert Adecco UK Ltd - Upper TribunalGraham Brearley
 
как разбить системный диск на два логических диска средствами Windows 10
как разбить системный диск на два логических диска средствами Windows 10как разбить системный диск на два логических диска средствами Windows 10
как разбить системный диск на два логических диска средствами Windows 10Татьяна Мишевская
 
Account-Based Content Marketing: Building an effective content strategy to su...
Account-Based Content Marketing: Building an effective content strategy to su...Account-Based Content Marketing: Building an effective content strategy to su...
Account-Based Content Marketing: Building an effective content strategy to su...Adam Monago
 
Healthcare Compliance: A Short Guide For Businesspeople
Healthcare Compliance: A Short Guide For BusinesspeopleHealthcare Compliance: A Short Guide For Businesspeople
Healthcare Compliance: A Short Guide For BusinesspeopleScott Maurice
 
Going for-growth-oecd-2017-policies-for-growth-to-benefit-all
Going for-growth-oecd-2017-policies-for-growth-to-benefit-allGoing for-growth-oecd-2017-policies-for-growth-to-benefit-all
Going for-growth-oecd-2017-policies-for-growth-to-benefit-allOECD, Economics Department
 
Apache Spark II (SparkSQL)
Apache Spark II (SparkSQL)Apache Spark II (SparkSQL)
Apache Spark II (SparkSQL)Datio Big Data
 
4 Ridiculous Reasons Why You Weren’t Hired
4 Ridiculous Reasons Why You Weren’t Hired4 Ridiculous Reasons Why You Weren’t Hired
4 Ridiculous Reasons Why You Weren’t HiredResume Valley
 
Data & Analytic Innovations: 5 lessons from our customers
Data & Analytic Innovations: 5 lessons from our customersData & Analytic Innovations: 5 lessons from our customers
Data & Analytic Innovations: 5 lessons from our customersNick Smith
 
44CON 2014: Using hadoop for malware, network, forensics and log analysis
44CON 2014: Using hadoop for malware, network, forensics and log analysis44CON 2014: Using hadoop for malware, network, forensics and log analysis
44CON 2014: Using hadoop for malware, network, forensics and log analysisMichael Boman
 

En vedette (19)

PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
PVS-Studio. Static code analyzer. Windows/Linux, C/C++/C#. 2017
 
PVS-Studio advertisement - static analysis of C/C++ code
PVS-Studio advertisement - static analysis of C/C++ codePVS-Studio advertisement - static analysis of C/C++ code
PVS-Studio advertisement - static analysis of C/C++ code
 
Листування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава СурковаЛистування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава Суркова
 
Листування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава СурковаЛистування помічника президента Росії Владислава Суркова
Листування помічника президента Росії Владислава Суркова
 
Rambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOSRambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOS
 
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
 
Consultative Selling for New Managers - A How-to Guide
Consultative Selling for New Managers - A How-to GuideConsultative Selling for New Managers - A How-to Guide
Consultative Selling for New Managers - A How-to Guide
 
Lab manual 8th
Lab manual 8th Lab manual 8th
Lab manual 8th
 
Lab manual 10th
Lab manual 10thLab manual 10th
Lab manual 10th
 
Case Alert Adecco UK Ltd - Upper Tribunal
Case Alert   Adecco UK Ltd - Upper TribunalCase Alert   Adecco UK Ltd - Upper Tribunal
Case Alert Adecco UK Ltd - Upper Tribunal
 
как разбить системный диск на два логических диска средствами Windows 10
как разбить системный диск на два логических диска средствами Windows 10как разбить системный диск на два логических диска средствами Windows 10
как разбить системный диск на два логических диска средствами Windows 10
 
Account-Based Content Marketing: Building an effective content strategy to su...
Account-Based Content Marketing: Building an effective content strategy to su...Account-Based Content Marketing: Building an effective content strategy to su...
Account-Based Content Marketing: Building an effective content strategy to su...
 
Healthcare Compliance: A Short Guide For Businesspeople
Healthcare Compliance: A Short Guide For BusinesspeopleHealthcare Compliance: A Short Guide For Businesspeople
Healthcare Compliance: A Short Guide For Businesspeople
 
Traslado de residuos
Traslado de residuosTraslado de residuos
Traslado de residuos
 
Going for-growth-oecd-2017-policies-for-growth-to-benefit-all
Going for-growth-oecd-2017-policies-for-growth-to-benefit-allGoing for-growth-oecd-2017-policies-for-growth-to-benefit-all
Going for-growth-oecd-2017-policies-for-growth-to-benefit-all
 
Apache Spark II (SparkSQL)
Apache Spark II (SparkSQL)Apache Spark II (SparkSQL)
Apache Spark II (SparkSQL)
 
4 Ridiculous Reasons Why You Weren’t Hired
4 Ridiculous Reasons Why You Weren’t Hired4 Ridiculous Reasons Why You Weren’t Hired
4 Ridiculous Reasons Why You Weren’t Hired
 
Data & Analytic Innovations: 5 lessons from our customers
Data & Analytic Innovations: 5 lessons from our customersData & Analytic Innovations: 5 lessons from our customers
Data & Analytic Innovations: 5 lessons from our customers
 
44CON 2014: Using hadoop for malware, network, forensics and log analysis
44CON 2014: Using hadoop for malware, network, forensics and log analysis44CON 2014: Using hadoop for malware, network, forensics and log analysis
44CON 2014: Using hadoop for malware, network, forensics and log analysis
 

Similaire à PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#

Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteTatyanazaxarova
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Andrey Karpov
 
C++/CLI Now Supported in PVS-Studio and CppCat
C++/CLI Now Supported in PVS-Studio and CppCatC++/CLI Now Supported in PVS-Studio and CppCat
C++/CLI Now Supported in PVS-Studio and CppCatAndrey Karpov
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиAndrey Karpov
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 

Similaire à PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C# (20)

Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-Paste
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 
PVS-Studio в 2019
PVS-Studio в 2019PVS-Studio в 2019
PVS-Studio в 2019
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
 
C++/CLI Now Supported in PVS-Studio and CppCat
C++/CLI Now Supported in PVS-Studio and CppCatC++/CLI Now Supported in PVS-Studio and CppCat
C++/CLI Now Supported in PVS-Studio and CppCat
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 

Plus de 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
 

Plus de 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
 

PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#

  • 1. PVS-Studio ООО «СиПроВер» Сайт: www.viva64.com Контакты: support@viva64.com Статический анализатор кода Windows/Linux, C/C++/C# 2017
  • 2. Статический анализатор кода PVS-Studio • Выполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C# • Поддерживаются проекты, разрабатываемые с помощью: • Windows: Visual C++, Clang, MinGW, Visual C# • Linux: Clang, GCC • Plugin для Visual Studio 2010-2015 • Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. • Утилита Standalone
  • 3. На начало 2017 года в PVS-Studio реализовано • C, C++ диагностик: 349 • C# диагностик: 130 • Подробная on-line документация на русском и английском языке • PDF
  • 4. Основные возможности • Быстрый старт (мониторинг компиляции) • Windows утилита: CLMonitoring • Linux утилита: pvs-studio-analyzer • Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем) • Режим автоматического анализа изменённых файлов • Отличная масштабируемость • Работа с ложными срабатываниями
  • 5. Почему нужны анализаторы кода? Почему команда PVS-Studio выбрала C, C++ и C#?
  • 6. Почему C и C++? • Эффективные, но сложные языки, в которых легко допустить ошибку • Причём, так дело обстоит десятилетиями и вряд ли изменится • Давайте проверим с помощью PVS-Studio первую версию компилятора Cfront, вышедшую в свет в 1985. • “К тридцатилетию первого C++ компилятора: ищем ошибки в Cfront” http://www.viva64.com/ru/b/0355/
  • 7. Ошибка в компиляторе Cfront (1985) Pexpr expr::typ(Ptable tbl) { .... Pclass cl; .... cl = (Pclass) nn->tp; cl->permanent=1; if (cl == 0) error('i',"%k %s'sT missing",CLASS,s); В начале указатель разыменовывается. Далее идёт проверка, которая говорит нам, что указатель мог быть nullptr.
  • 8. Прошло 30 лет • Ничего не изменилось. Язык C++ всё так же сложен и опасен. • Размер кодовой базы растёт, и все важнее использовать инструменты статического анализа • Давайте проверим с помощью PVS-Studio код современного компилятора Clang • 2016 год. “Находим ошибки в коде проекта LLVM с помощью анализатора PVS-Studio” http://www.viva64.com/ru/b/0446/
  • 9. Clang (ошибка найдена в октябре 2016) bool PPCDarwinAsmPrinter::doFinalization(Module &M) { .... MachineModuleInfoMachO &MMIMacho = MMI->getObjFileInfo<MachineModuleInfoMachO>(); if (MAI->doesSupportExceptionHandling() && MMI) { Вначале указатель разыменовывается. Далее идёт проверка, которая говорит нам, что указатель мог быть nullptr.
  • 10. Почему C#? • Быть может с C# ситуация лучше? • Некоторые типы ошибок в C# невозможны • Поэтому лучше, но не сильно • На месте остаются опечатки, логические ошибки и т.д. • Да и от того, что указатели назвали ссылками лучше не стало • Мы видим всё ту же ошибку с нулевой ссылкой • Давайте проверим, например, проект Microsoft PowerShell: http://www.viva64.com/ru/b/0447/
  • 11. Такие ошибки актуальны и для C# public CommandMetadata(CommandMetadata other) { .... _parameters = new Dictionary<string, ParameterMetadata>( other.Parameters.Count, .....); if (other.Parameters != null) Ошибка в проекте PowerShell: в начале используем ссылку, а затем проверяем.
  • 12. Мы можем очень долго демонстрировать подобные примеры • Анализатор PVS-Studio легко находит ошибки в известных проектах: • Linux kernel - http://www.viva64.com/ru/b/0460/ • GCC - http://www.viva64.com/ru/b/0425/ • MSBuild - http://www.viva64.com/ru/b/0424/ • Qt - http://www.viva64.com/ru/b/0424/ • И так далее - http://www.viva64.com/ru/inspections/ • Это говорит о востребованности статического анализа кода • Давайте посмотрим какие ошибки умеет искать PVS-Studio
  • 14. Ошибки при переносе кода на 64-битные платформы Эту ошибку мы нашли с помощью PVS-Studio в проекте TortoiseSVN DialogBoxParam(g_hmodThisDll, MAKEINTRESOURCE(IDD_LOGIN), g_hwndMain, (DLGPROC)(LoginDialogProc), (long)this); V220 Suspicious sequence of types castings: memsize -> 32-bit integer -> memsize. The value being casted: 'this'. logindialog.cpp 105 Пояснение. Тип long в Win64 по прежнему 32-битный. В 64-битной программе объект может быть создан за пределами младших 4 Гигабайт памяти. В этом случае значение указателя будет испорчено. Неприятная ошибка, которая может проявляться очень редко после долгой работы программы. Правильно: (LPARAM)(this).
  • 15. Адрес локальной переменной возвращается из функции по ссылке Эту ошибку мы нашли с помощью PVS-Studio в проекте LLVM V558 Function returns the reference to temporary local object: res. LiveInterval.h 679 SingleLinkedListIterator<T> &operator++(int) { SingleLinkedListIterator res = *this; ++*this; return res; }
  • 16. Арифметическое переполнение, потеря значимости Эту ошибку мы нашли с помощью PVS-Studio в проекте OpenXRay V636 The '1 / 100' expression was implicitly cast from 'int' type to 'float' type. Consider utilizing an explicit type cast to avoid the loss of a fractional part. An example: double A = (double)(X) / Y;. gl_rendertarget.cpp 245 float CRenderTarget::im_noise_time; .... param_noise_fps = 25.f; param_noise_scale = 1.f; im_noise_time = 1/100; ....
  • 17. Выход за границу массива Эту ошибку мы нашли с помощью PVS-Studio в проекте Notepad++ V557 Array overrun is possible. The value of 'i' index could reach 46. Notepad++ preferencedlg.cpp 984 int encodings[] = {1250, 1251, 1252, .... }; for (int i = 0; i <= sizeof(encodings)/sizeof(int); i++) { int cmdID = em->getIndexFromEncoding(encodings[i]); .... }
  • 18. Мёртвый код Эту ошибку мы нашли с помощью PVS-Studio в проекте Unreal Engine 4 V607 Ownerless expression 'NumByteProperties'. codegenerator.cpp 633 int32 NumByteProperties = 0; .... if (bIsByteProperty) { NumByteProperties; }
  • 19. Недостижимый код Эту ошибку мы нашли с помощью PVS-Studio в проекте Linux Kernel V695 Range intersections are possible within conditional expressions. Example: if (A < 5) { ... } else if (A < 2) { ... }. Check lines: 439, 441. ad5933.c 441 if (val > 511) val = (val >> 1) | (1 << 9); else if (val > 1022) val = (val >> 2) | (3 << 9);
  • 20. Неинициализированные переменные Эту ошибку мы нашли с помощью PVS-Studio в проекте Mono V3070 Uninitialized variable 'schema' is used when initializing the 'ResourceSchema' variable. ResXResourceWriter.cs 59 class ResXResourceWriter : IResourceWriter, IDisposable { public static readonly string ResourceSchema = schema; .... static string schema = ....; } Пояснение. На момент инициализации ResourceSchema поле schema будет проинициализировано значением по умолчанию (null в данном случае).
  • 21. Неиспользуемые переменные и аргументы Эту ошибку мы нашли с помощью PVS-Studio в проекте Xenko V3065 Parameter 'height' is not utilized inside method's body. SiliconStudio.Xenko Image.cs 473 public static Image New3D(int width, int height, int depth, ....) { return new Image( CreateDescription( TextureDimension.Texture3D, width, width, depth, mipMapCount, format, 1), dataPointer, 0, null, false); }
  • 22. Некорректные операции сдвига Эту ошибку мы нашли с помощью PVS-Studio в проекте Bitcoin V629 Consider inspecting the '0x80 << (8 * (vch.size() - 1))' expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type. script.h 169 Пояснение. Происходит переполнение при сдвиге 32-битного значения 0x80. Сейчас исправленный вариант кода выглядит так: static int64_t set_vch(....) { int64_t result = 0; .... return -(result & ~(0x80 << (8 * (vch.size() - 1)))); return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1)))));
  • 23. Неопределенное поведение Эту ошибку мы нашли с помощью PVS-Studio в проекте Network Security Services V567 Undefined behavior. The 'j' variable is modified while being used twice between sequence points. pk11slot.c 1926 waste[j & 0xf] = j++;
  • 24. Неправильная работа с типами Эту ошибку мы нашли с помощью PVS-Studio в проекте VirtualBox V745 A 'wchar_t *' type string is incorrectly converted to 'BSTR' type string. Consider using 'SysAllocString' function. vboxcredentialprovider.cpp 231 HRESULT EventClassID(BSTR bstrEventClassID); static HRESULT VBoxCredentialProviderRegisterSENS(void) { hr = pIEventSubscription->put_EventClassID( L"{d5978630-5b9f-11d1-8dd2-00aa004abd5e}");
  • 25. Неправильное представление о работе функции/класса Эту ошибку мы нашли с помощью PVS-Studio в проекте Unity3D V3057 Invalid regular expression patern in constructor. Inspect the first argument. AssetBundleDemo ExecuteInternalMono.cs 48 private static readonly Regex UnsafeCharsWindows = new Regex("[^A-Za-z0-9_-.:,/@]"); Пояснение. При попытке создания экземпляра класса Regex с данным паттерном мы получим исключение System.ArgumentException с сообщением: parsing "[^A-Za-z0-9_-.:,/@]" - Unrecognized escape sequence '_'.
  • 26. Отсутствие виртуального деструктора Все примеры длинные и их сложно поместить в презентацию. Поверьте, мы ищем такие проблемы. А пока предлагаю заварить чашечку кофе. Впереди у нас ещё долгий интересный путь.
  • 27. Оформление кода не совпадает с логикой его работы Эту ошибку мы нашли с помощью PVS-Studio в проекте Sony ATF V3043 The code's operational logic does not correspond with its formatting. The statement is indented to the right, but it is always executed. It is possible that curly brackets are missing. Atf.Core.vs2010 QuatF.cs 282 public static QuatF Slerp(QuatF q1, QuatF q2, float t) { double dot = q2.X * q1.X + q2.Y * q1.Y + q2.Z * q1.Z + q2.W * q1.W; if (dot < 0) q1.X = -q1.X; q1.Y = -q1.Y; q1.Z = -q1.Z; q1.W = -q1.W;
  • 28. Ошибки при работе с исключениями Эту ошибку мы нашли с помощью PVS-Studio в проекте OpenMW V596 The object was created but it is not being used. The 'throw' keyword could be missing: throw logic_error(FOO); components exprparser.cpp 101 if (t1==t2) mOperands.push_back (t1); else if (t1=='f' || t2=='f') mOperands.push_back ('f'); else std::logic_error ("failed to ....... ");throw
  • 29. Переполнение буфера Эту ошибку мы нашли с помощью PVS-Studio в проекте FreeBSD V512 A call of the 'strcpy' function will lead to overflow of the buffer 'p->vendor'. aacraid_cam.c 571 #define SID_VENDOR_SIZE 8 char vendor[SID_VENDOR_SIZE]; .... strcpy(p->vendor,"Adaptec "); Пояснение. Строка содержит 8 символов. Однако, следует учитывать, что функция strcpy добавит терминальный ноль. Он будет записан за пределами буфера.
  • 30. Проблемы безопасности Эту ошибку мы нашли с помощью PVS-Studio в проекте PostgreSQL V597 The compiler could delete the 'memset' function call, which is used to flush 'final' buffer. The RtlSecureZeroMemory() function should be used to erase the private data. pgcrypto crypt-md5.c 157 Компилятор удаляет вызов функции memset: http://www.viva64.com/ru/w/V597/ char *px_crypt_md5(....) { unsigned char final[MD5_SIZE]; .... /* Don't leave anything around in vm they could use. */ memset(final, 0, sizeof final); }
  • 31. Путаница с приоритетом операций Эту ошибку мы нашли с помощью PVS-Studio в проекте Linux Kernel V502 Perhaps the '?:' operator works in a different way than it was expected. The '?:' operator has a lower priority than the '|' operator. core.c 1046 static int nvme_pr_preempt(struct block_device *bdev, u64 old, u64 new, pr_type type, bool abort) { u32 cdw10 = nvme_pr_type(type) << 8 | abort ? 2 : 1; 1 2
  • 32. Разыменование нулевого указателя / нулевой ссылки Эту ошибку мы нашли с помощью PVS-Studio в проекте LibreOffice V595 The 'pSysWin' pointer was utilized before it was verified against nullptr. Check lines: 738, 739. updatecheckui.cxx 738 MenuBar *pMBar = pSysWin->GetMenuBar(); if ( pSysWin && pMBar ) { AddMenuBarIcon( pSysWin, true ); }
  • 33. Ошибки синхронизации Эту ошибку мы нашли с помощью PVS-Studio в проекте Unity3D V3083 Unsafe invocation of event 'unload', NullReferenceException is possible. Consider assigning event to a local variable before invoking it. AssetBundleDemo AssetBundleManager.cs 47 internal void OnUnload() { m_AssetBundle.Unload(false); if (unload != null) unload(); }
  • 34. Целочисленное деление на 0 Эту ошибку мы нашли с помощью PVS-Studio в проекте Inkscape V609 Divide by zero. Denominator range [0..999]. lpe-fillet-chamfer.cpp 607 } else if (type >= 3000 && type < 4000) { unsigned int chamferSubs = type-3000; double chamfer_stepsTime = 1.0/chamferSubs; Диапазон [0..999]
  • 35. Опечатки и Copy-Paste • Анализатор PVS-Studio эффективно выявляет опечатки и последствия неудачного Copy-Paste • В анализаторе реализовано много диагностик для выявления ошибок этого рода • Остановимся на них чуть подробнее и рассмотрим несколько примеров ошибок этого типа • Дополнительно рекомендуем для чтения интересную статью “Эффект последней строки” - http://www.viva64.com/ru/b/0260/
  • 36. Опечатки и Copy-Paste (пример N1) Эту ошибку мы нашли с помощью PVS-Studio в проекте Clang V501 There are identical sub-expressions 'OpcodeLHS == BO_LE' to the left and to the right of the '||' operator. RedundantExpressionCheck.cpp 174 if ((OpcodeLHS == BO_EQ || OpcodeLHS == BO_LE || OpcodeLHS == BO_LE) && (OpcodeRHS == BO_EQ || OpcodeRHS == BO_GT || OpcodeRHS == BO_GE))
  • 37. Опечатки и Copy-Paste (пример N2) Эту ошибку мы нашли с помощью PVS-Studio в проекте GCC V501 There are identical sub-expressions '!strcmp(a->v.val_vms_delta.lbl1, b- >v.val_vms_delta.lbl1)' to the left and to the right of the '&&' operator. dwarf2out.c 1428 return (!strcmp (a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1) && !strcmp (a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1));
  • 38. Опечатки и Copy-Paste (пример N3) Эту ошибку мы нашли с помощью PVS-Studio в проекте MySQL V525 The code containing the collection of similar blocks. Check items '0', '1', '2', '3', '4', '1', '6' in lines 680, 682, 684, 689, 691, 693, 695. sql records.cc 680 static int rr_cmp(uchar *a,uchar *b) { if (a[0] != b[0]) return (int) a[0] - (int) b[0]; if (a[1] != b[1]) return (int) a[1] - (int) b[1]; if (a[2] != b[2]) return (int) a[2] - (int) b[2]; if (a[3] != b[3]) return (int) a[3] - (int) b[3]; if (a[4] != b[4]) return (int) a[4] - (int) b[4]; if (a[5] != b[5]) return (int) a[1] - (int) b[5]; if (a[6] != b[6]) return (int) a[6] - (int) b[6]; return (int) a[7] - (int) b[7]; } 5
  • 39. Опечатки и Copy-Paste (пример N4) Эту ошибку мы нашли с помощью PVS-Studio в проекте PowerShell V3001 There are identical sub-expressions 'BaseMaximumVersion != null' to the left and to the right of the '&&' operator. System.Management.Automation ImportModuleCommand.cs 1663 internal Version BaseMinimumVersion { get; set; } internal Version BaseMaximumVersion { get; set; } protected override void ProcessRecord() { if (BaseMaximumVersion != null && BaseMaximumVersion != null && BaseMaximumVersion < BaseMinimumVersion)
  • 40. Опечатки и Copy-Paste (пример N5) Эту ошибку мы нашли с помощью PVS-Studio в проекте Roslyn V3004 The 'then' statement is equivalent to the 'else' statement. GetSemanticInfoTests.cs 2269 if (i % 2 == 0) { thread1.Start(); thread2.Start(); } else { thread1.Start(); thread2.Start(); }
  • 41. Опечатки и Copy-Paste (пример N6) Эту ошибку мы нашли с помощью PVS-Studio в проекте MonoDevelop V3012 The '?:' operator, regardless of its conditional expression, always returns one and the same value: result.Test.FullName. GuiUnit_NET_4_5 NUnit2XmlOutputWriter.cs 207 xmlWriter.WriteAttributeString("name", suite.TestType == "Assembly" ? result.Test.FullName : result.Test.FullName);
  • 42. Мы показали вам малую часть того, что может находить анализатор PVS-Studio • Подробная таблица диагностических возможностей: http://www.viva64.com/ru/w/ • Там же вы найдете подробное описание всех диагностик Main PVS-Studio diagnostic abilities C, C++ diagnostics C# diagnostics 64-bit issues V101-V128, V201-V207,V220, V221, V301-V303 - Check that addresses to stack memory does not leave the function V506, V507, V558, V758 - Arithmetic over/underflow V636, V658 V3040, V3041 Array index out of bounds V557, V582, V643 V3106 Check for double-free V586, V749 - Dead code V606, V607 - Microoptimization V801-V815 - Unreachable code V551, V695, V734 - Uninitialized variables V573, V614, V679, V730, V737 V3070 Unused variables V603, V751, V763 V3061, V3065, V3077 Illegal bitwise/shift operations V610, V629, V673, V684 - Undefined/unspecified behavior V567, V610, V611, V681, V704, V708, V726, V736 - Incorrect handling of the types (HRESULT, BSTR, BOOL, VARIANT_BOOL) V543, V544, V545, V716, V721, V724, V745, V750, V676, V767 - Improper understanding of function/class operation logic V518, V530, V540, V541, V554, V575, V597, V598, V618, V630, V632, V663, V668, V698, V701, V702, V717, V718, V720, V723, V725, V727, V738, V742, V743, V748, V762, V764 V3010, V3057, V3068, V3072, V3073, V3074, V3082, V3084, V3094, V3096, V3097, V3102, V3103, V3104, V3108 Misprints V501, V503, V504, V508, V511, V516, V519, V520, V521, V525, V527, V528, V529, V532, V533, V534, V535, V536, V537, V539, V546, V549, V552, V556, V559, V560, V561, V564, V568, V570, V571, V575, V577, V578, V584, V587, V588, V589, V590, V592, V600, V602, V604, V606, V607, V616, V617, V620, V621, V622, V625, V626, V627, V633, V637, V638, V639, V644, V646, V650, V651, V653, V654, V655, V660, V661, V662, V666, V669, V671, V672, V678, V682, V683, V693, V715, V722, V735, V747, V754, V756, V765, V767 V3001, V3003, V3005, V3007, V3008, V3009, V3011, V3012, V3014, V3015, V3016, V3020, V3028, V3029, V3034, V3035, V3036, V3037, V3038, V3050, V3055, V3056, V3057, V3062, V3063, V3066, V3081, V3086, V3091, V3092, V3107, V3109 Missing Virtual destructor V599, V689 - Coding style not matching the operation logic of the source code V563, V612, V628, V640, V646, V705 V3018, V3033, V3043, V3067, V3069 Copy-Paste V501, V517, V519, V523, V524, V571, V581, V649, V656, V691, V760, V766 V3001, V3003, V3004, V3008, V3012, V3013, V3021, V3030, V3058 Incorrect usage of exceptions V509, V565, V596, V667, V740, V741, V746, V759 V3006, V3052, V3100 Buffer overrun V512, V514, V594, V635, V641, V645, V752, V755 - Security issues V505, V510, V511, V512, V518, V531, V541, V547, V559, V560, V569, V570, V575, V576, V579, V583, V597, V598, V618, V623, V642, V645, V675, V676, V724, V727, V729, V733, V743, V745, V750 V3022, V3023, V3025, V3027, V3053, V3063 Operation priority V502, V562, V593, V634, V648 - Null pointer pointer/null reference dereference V522, V595, V664, V757 V3019, V3042, V3080, V3095, V3105 Unchecked parameter dereference V595, V664 V3095 Synchronization errors V712 V3032, V3054, V3079, V3083, V3089, V3090 WPF usage errors - V3044 - V3049 Check for integer division by zero V609 V3064 Customized user rules V2001-V2013 -
  • 43. Демонстрация возможностей PVS-Studio • Для демонстрации возможностей анализатора мы проверяем открытые проекты. На начало 2017 года нами проверено 280 проектов. • Побочный результат: в этих проектах нашей командой было найдено 10700 ошибок • Это именно 10700 ошибок, а не количество сообщений, выданных анализатором
  • 44. Демонстрация возможностей PVS-Studio • Благодаря нашей команде и анализатору PVS-Studio, в открытых проектах исправили более 10000 ошибок • Вы можете увидеть все эти ошибки здесь: http://www.viva64.com/ru/examples/ • База ошибок постоянно пополнятся и её можно использовать при написании статей о качестве кода и составлении стандартов кодирования
  • 45. Демонстрация возможностей PVS-Studio • В среднем, в одном открытом проекте мы нашли 10700 / 280 = 38 ошибок • 38 ошибок на проект - это мало • Поэтому важно подчеркнуть, что это - побочный эффект • У нас нет цели найти как можно больше ошибок. Часто мы останавливаемся, когда нашли достаточное количество дефектов в проекте для написания статьи.
  • 46. Демонстрация возможностей PVS-Studio • Мы добились колоссальных результатов в устранении ошибок в мире open-source проектов, не ставя такую цель • В этом нам помогли: • мощные диагностические возможности PVS-Studio • возможность быстрого анализа даже незнакомых проектов
  • 47. Правильный сценарий использования • Конечно, интересно и полезно запустить анализатор PVS-Studio и найти ошибку, которую до этого безуспешно искали 50 часов • http://www.viva64.com/ru/b/0221/ • Хорошо проверять проекты и описывать найденные ошибки, как делаем это мы в рекламных целях • http://www.viva64.com/ru/inspections/ • Но следует помнить, что разовые проверки - это неправильный способ использования анализаторов кода!
  • 48. Правильный сценарий использования • Статический анализатор приносит пользу, когда он используется регулярно • Два основных варианта: • Автоматический анализ изменённого кода • Ночные проверки • Подробнее эти режимы рассмотрены в документации
  • 49. Кратко о внутреннем устройстве PVS-Studio
  • 50. Используемые технологии • На примерах было продемонстрировано, что PVS-Studio эффективно выявляет разнообразные типы ошибок • Кратко перечислим технологии, которые положены в основу анализатора • Подробнее эта тема раскрыта в статье “Как PVS-Studio ищет ошибки: методики и технологии” http://www.viva64.com/ru/b/0466/
  • 51. Используемые технологии • Сопоставление с шаблоном (pattern-based analysis) на основе абстрактного синтаксического дерева применяется для поиска мест в исходном коде, которые похожи на известные шаблоны кода с ошибкой. Пример. Иногда не там прибавляют 1 при использовании функции strlen: realloc(name, strlen(name+1)) На самом деле следовало написать: realloc(name, strlen(name)+1)
  • 52. Используемые технологии • Вывод типов (type inference) на основе семантической модели программы позволяет анализатору иметь полную информацию о всех переменных и выражениях, встречающихся в коде. Самый просто пример: чтобы знать, что функция printf используется неправильно, нужно знать типы фактических аргументов.
  • 53. Используемые технологии • Символьное выполнение (symbolic execution) позволяет вычислять значения переменных, которые могут приводить к ошибкам, производить проверку диапазонов (range checking) значений • Анализ потока данных (data-flow analysis) используется для вычисления ограничений, накладываемых на значения переменных при обработке различных конструкций языка. Например, какие значения может принимать переменная внутри блоков if/else.
  • 54. Используемые технологии • Аннотированние методов (method annotations) предоставляет больше информации об используемых методах, чем может быть получено путём анализа только их сигнатуры. • C/C++. На данный момент проаннотировано 6570 функций (стандартные библиотеки C и C++, POSIX, MFC, Qt, ZLib и так далее). • C#. На данный момент проаннотировано 920 функций.
  • 55. Используемые технологии • Для разработки эффективных диагностик наша команда использует большой набор регрессионных тестов • Написан специальный инструментарий для работы с тестовой базой открытых проектов
  • 56. Используемые технологии • Тестовая база: • C++ Windows (Visual C++): 120 проектов • C++ Linux (GCC): ещё 34 проекта • C# Windows: 54 проекта • Всего мы используем 7 методик тестирования нашего проекта • См. раздел “Тестирование PVS-Studio” http://www.viva64.com/ru/b/0466/
  • 58. • Думаю, вы уже устали, поэтому минутка юмора • Кратко суть статического анализа кода сводится к следующему: Опять Copy-Paste!
  • 59. Использование PVS-Studio: внедрение • Бывает непросто начать использовать статический анализ в большом проекте • Непонятно, что делать с сообщениями в старом коде… • Мы предлагаем решение: база разметки • Подробнее: http://www.viva64.com/ru/b/0364/
  • 60. Использование PVS-Studio: подавление ложных срабатываний • Различные способы подавить ложные срабатывания в конкретных строках кода • Подавление ложных срабатываний в макросах • Подавление ложных предупреждений с помощью файлов конфигурации диагностик pvsconfig • Подробнее: http://www.viva64.com/ru/m/0017/
  • 61. Использование PVS-Studio: исключение из анализа • Возможность исключить из анализа файлы по имени, папке или маске • Интерактивная фильтрация результатов анализа (лога) в окне PVS- Studio: • по коду диагностики • по имени файла • по включению слова в текст диагностики
  • 62. Использование PVS-Studio: автоматический анализ файлов после их перекомпиляции • Наиболее эффективно исправить ошибку сразу после того, как она появилась в коде
  • 63. Использование PVS-Studio: масштабируемость • Поддержка многоядерных и многопроцессорных систем с настройкой количества используемых ядер • Поддержка IncrediBuild
  • 64. Использование PVS-Studio: непрерывная интеграция • Запуск из командной строки для проверки всего решения: позволяет интегрировать PVS-Studio в ночные сборки, чтобы утром у всех был свежий лог • Сохранение и загрузка результатов анализа: можно ночью проверить код, сохранить результаты, а утром загрузить их и смотреть • Утилита BlameNotifier: инструмент позволяет рассылать письма разработчикам об ошибках, которые PVS-Studio нашел во время ночного прогона • Использование относительных путей в файлах отчета
  • 65. Использование PVS-Studio: прочее • Удобная online-справка по всем диагностикам, которая доступна и из программы, и на сайте, а также документация в .pdf одним файлом • Интерактивная фильтрация результатов анализа (лога) в окне PVS- Studio • Статистика ошибок в Excel • Автоматическая проверка на наличие новых версий PVS-Studio
  • 66. Использование PVS-Studio: Linux • С PVS-Studio легко работать в Linux • Но, чтобы не гадать с настройками и ключами запуска, просим познакомиться с инструкцией • Как запустить PVS-Studio в Linux: http://www.viva64.com/ru/m/0036/ • Я знаю, что мы все не любим читать инструкции. Но поверьте, этот тот случай, когда всё просто, кратко и экономит ваше время!
  • 67. Использование PVS-Studio: быстрый старт • Отдельного внимания заслуживает возможность быстро попробовать PVS-Studio на любом проекте • Для этого можно отследить запуски компилятора и собрать всю необходимую для анализа информацию • Windows: • Утилита Standalone • Инструкция: http://www.viva64.com/ru/m/0033/ • Linux • Утилита pvs-studio-analyzer • Инструкция: см. «Быстрый старт» в документе http://www.viva64.com/ru/m/0036/
  • 68. Использование PVS-Studio: SonarQube • Для импорта результатов анализа в SonarQube мы разработали плагин sonar-pvs-studio-plugin • Использование плагина позволяет добавлять сообщения, найденные анализатором PVS-Studio, в базу сообщений сервера SonarQube
  • 69. Использование PVS-Studio: SonarQube • Подробности изложены в статье «Контролируем качество кода с помощью платформы SonarQube» http://www.viva64.com/ru/b/0452/
  • 71. Скачать и попробовать PVS-Studio • Можно скачать и попробовать демонстрационную версию • Windows: http://www.viva64.com/ru/pvs-studio-download/ • Linux: http://www.viva64.com/ru/pvs-studio-download-linux/ • Про ограничения демонстрационной версии: http://www.viva64.com/ru/m/0009/ • Вы можете написать нам и получить на время полную версию: support@viva64.com
  • 76. Типы лицензий Team License Enterprise License Подходит небольшим отделам, обычно это первый опыт использования анализаторов Подходит сразу для нескольких отделов в компании Только Windows-версия Версии для Linux и Windows Поддержка систем непрерывной интеграции (continuous integration) Интеграция с SonarQube Инструмент BlameNotifier Возможность предлагать для реализации собственные диагностики. Лицензию возможно купить только на 1 год Лицензию возможно купить на 1, 2 или 3 года Ответ на письма в течение 48 часов Ответ на письма в течение 24 часов Обычно используется в командах до 9 человек В основном используется при размере команд более 10 человек
  • 77. Индивидуальные лицензии • Мы позиционируем свой продукт как B2B решение и у нас нет индивидуальных лицензий • Почему так получилось: http://www.viva64.com/ru/b/0320/ • Индивидуальные разработчики могут воспользоваться вариантом бесплатного лицензирования • Как использовать PVS-Studio бесплатно: http://www.viva64.com/ru/b/0457/
  • 78. Купить PVS-Studio • Для заказа лицензии и получения информации о ценах, пожалуйста, напишите нам: support@viva64.com
  • 79. Помимо приобретения лицензии на статический анализатор кода PVS-Studio возможны другие варианты сотрудничества
  • 80. Сотрудничество: аудит • Выполнение аудита кода и правка ошибок • Примеры сотрудничества подобного типа: • Как команда PVS-Studio улучшила код Unreal Engine: http://www.viva64.com/ru/b/0330/ • Как перенести проект размером в 9 млн строк кода на 64-битную платформу: http://www.viva64.com/ru/b/0342/ • Мы можем на регулярной основе контролировать качество кода и вносить в него правки • Имеем опыт работ в этом направлении, но эта информация попадает под NDA
  • 81. Сотрудничество • На базе нашего анализатора мы можем разработать на заказ специализированное решение • Мы также готовы обсуждать сотрудничество, кто готов за процент с продаж привести к нам клиентов • По этим и другим вопросам: support@viva64.com
  • 82. Презентация подходит к концу Спасибо всем, кто добрался сюда
  • 83. Полезные ссылки • Расскажем о некоторых интересных и полезных материалах, которые можно найти на сайте компании • Электронная книга «Главный вопрос программирования, рефакторинга и всего такого» - http://www.viva64.com/ru/b/0391/ • Электронная книга «Разработки 64-битных приложений на языке Си/Си++» - http://www.viva64.com/ru/l/full/
  • 84. Полезные ссылки • Как 10 лет назад начинался проект PVS-Studio: http://www.viva64.com/ru/b/0465/ • Контролируем качество кода с помощью платформы SonarQube: http://www.viva64.com/ru/b/0452/ • Руководство по разработке модулей расширений на C# для Visual Studio 2005-2012 и Atmel Studio: http://www.viva64.com/ru/a/0082/
  • 85. Всем спасибо! До свидания • Написать письмо: support@viva64.com • Подписаться на твиттер: @Code_Analysis • Скачать PVS-Studio для Windows: http://www.viva64.com/ru/pvs-studio/ • Скачать PVS-Studio для Linux: http://www.viva64.com/ru/pvs-studio-download-linux/