Нет смысла искать серебряную пулю, которая одновременно найдёт потенциальные уязвимости, проверит оформление кода, предупредит о запахах кода и вообще сделает "хорошо". Однако есть возможность собрать коллекцию инструментов, которая будет решать те задачи, которые стоят перед разработчиками. Однако, собрать коллекцию мало, нужно ещё иметь возможность единообразно работать со всеми отчётами, предоставляемыми разнородными инструментами, такими как статические анализаторы кода, санитайзеры, компиляторы, инструменты анализа покрытия кода и так далее. Поэтому, поговорим о SonarQube, который может стать такой обобщающей платформой и посмотрим на примерах, как осуществляется интеграция различных средств.
9. Оформление кода: пример
void DoSomething(Things& things, bool remove) {
for (auto i = 0; i < things.Count(); ++i) {
things[i].DoWhatever();
if (remove) {things.Remove(i);
} else { things.ApplyChange(i); } }
}
9
10. Оформление кода: пример
void DoSomething(Things& things, bool remove)
{
for (auto i = 0; i < things.Count(); ++i)
{
things[i].DoWhatever();
if (remove)
things.Remove(i);
else
things.ApplyChange(i);
}
}
10
11. Статический анализ
• Это как code review, только происходит
автоматически
• Хорошо сочетается с другими методами
• Находит ошибочные паттерны, о которых не
догадываются программисты
11
18. AddressSanitizer
==9901==ERROR: AddressSanitizer: heap-use-after-free on address 0x60700000dfb5 at pc 0x45917b bp 0x7fff4490c700
sp 0x7fff4490c6f8
READ of size 1 at 0x60700000dfb5 thread T0
#0 0x45917a in main use-after-free.c:5
#1 0x7fce9f25e76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
#2 0x459074 in _start (a.out+0x459074)
0x60700000dfb5 is located 5 bytes inside of 80-byte region [0x60700000dfb0,0x60700000e000)
freed by thread T0 here:
#0 0x4441ee in __interceptor_free projects/compiler-rt/lib/asan/asan_malloc_linux.cc:64
#1 0x45914a in main use-after-free.c:4
#2 0x7fce9f25e76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
previously allocated by thread T0 here:
#0 0x44436e in __interceptor_malloc projects/compiler-rt/lib/asan/asan_malloc_linux.cc:74
#1 0x45913f in main use-after-free.c:3
#2 0x7fce9f25e76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
SUMMARY: AddressSanitizer: heap-use-after-free use-after-free.c:5 main
18
19. Метрики
• Определение качества существующего
продукта
• Прогнозирование качества продукта
• Улучшение качества продукта
19
20. Количественные метрики
• Строки кода (SLOC)
• Количество и процент комментариев
• Среднее число строк на функцию/класс/файл
• Процент дублирования кода
• Цикломатическая сложность
20
21. Метрика по дефектам в коде
• Плотность дефектов в коде
• Number of Defects – общее количество дефектов
• Size – размер кодовой базы
21
22. • Платформа с открытым исходным кодом для
непрерывного анализа и измерения качества кода
• Содержит ряд анализаторов для разных языков
• Позволяет интегрировать сторонние анализаторы
• Наглядно визуализирует качество вашего продукта
22
24. Что нам понадобится
• JRE 8
• SonarQube LTS
https://www.sonarqube.org/downloads/
• SonarQube C++ Community Plugin
https://github.com/SonarOpenCommunity/sonar-cxx
24
32. CppCheck
• Статический анализатор с открытым исходным
кодом
• Основан на регулярных выражениях
• Позволяет добавлять собственные правила
• http://cppcheck.sourceforge.net/
32
34. Clang-Tidy
• Линтер для языков C и C++
• Позволяет проверять code style
• Позволяет добавлять собственные правила
• Поставляется вместе с LLVM
• https://clang.llvm.org/extra/clang-tidy/
34
36. PVS-Studio
• Статический анализатор для C, C++, C# и Java
• Для подключения к SonarQube нужен
специальный плагин (идет в поставке)
• https://www.viva64.com/
36