Представим ситуацию: у вас имеется большой и взрослый проект с legacy-кодом. Вы установили статический анализатор, проверили код вашего проекта и получили отчёт о найденных ошибках. Сколько там их будет? По нашей статистике – несколько тысяч. В видео расскажем, как исправить ситуацию, затратив на это минимум ресурсов.
Как исправить сотни ошибок в legacy-коде и не умереть (на примере Unreal Engine 4)
1. Как исправить сотни ошибок в
legacy-коде и не умереть
(на примере Unreal Engine 4)
Георгий Грибков
2. Докладчик
Георгий Грибков
Программист C++, разработчик
статического анализатора кода PVS-Studio
Помогаю нашим клиентам бороться с
ошибками
Автор статей о поиске ошибок
в проектах с открытым
исходным кодом
gribkov@viva64.com
2
4. Как бороться с ошибками legacy-коде?
Стоит ли вообще это делать?
Проблематика
4
5. Как бороться с ошибками legacy-коде?
Стоит ли вообще это делать?
Что делать, если ошибок сотни или даже тысячи?
Проблематика
5
6. Как бороться с ошибками legacy-коде?
Стоит ли вообще это делать?
Что делать, если ошибок сотни или даже тысячи?
(обычно так и бывает)
Проблематика
6
7. Как бороться с ошибками legacy-коде?
Стоит ли вообще это делать?
Что делать, если ошибок сотни или даже тысячи?
(обычно так и бывает)
Как не затратить на это много-много человеко-часов?
Проблематика
7
8. Как бороться с ошибками legacy-коде?
Стоит ли вообще это делать?
Что делать, если ошибок сотни или даже тысячи?
(обычно так и бывает)
Как не затратить на это много-много человеко-часов?
И всё-таки, как вы работали с Unreal Engine?
Проблематика
8
26. 1. Настроить непрерывный анализ
2. Защититься от появления новых ошибок
3.
Как легко справиться со старыми ошибками
26
27. 1. Настроить непрерывный анализ
2. Защититься от появления новых ошибок
3. Обработать отчёт анализатора постепенно и
малыми затратами
Как легко справиться со старыми ошибками
27
28. Как 2 наших программиста
исправили 2000 срабатываний в Unreal Engine 4
за 17 рабочих дней
28
31. Мой босс нашел ошибки в
UE 4 и написал статью
Разработчикам из Epic
Games понравилось
Они захотели исправить
больше ошибок и передали
это дело нам
С чего всё началось
31
33. Самый удобный способ: проверить проект
через Visual Studio
Хорошо, что UE имеет набор скриптов для
генерации .vcxproj-файлов
Первая проверка
33
36. Сгенерированные проектные файлы – лишь
обёртка
Эти обёртки вызывают Unreal Build Tool
Unreal Build Tool вызывает cl.exe (или clang
при сборке под Linux)
Как устроена сборка Unreal Engine
36
37. Сгенерированные проектные файлы – лишь
обёртка
Эти обёртки вызывают Unreal Build Tool
Unreal Build Tool вызывает cl.exe (или clang
при сборке под Linux)
Из-за этих прослоек анализатор не может
собрать параметры компиляции
Как устроена сборка Unreal Engine
37
39. Что, если отлавливать непосредственно
вызовы компилятора?
Вторая проверка
39
40. Что, если отлавливать непосредственно
вызовы компилятора?
Хорошо, что у нас есть специальная утилита
для мониторинга компиляции
Вторая проверка
40
41. Вторая попытка анализа
41
1. Перед сборкой запускаем утилиту
мониторинга компиляции
2. Утилита собирает все
необходимые данные
3. Сразу после окончания сборки
запускается анализ
4. ???????
5.
42. 1. Перед сборкой запускаем утилиту
мониторинга компиляции
2. Утилита собирает все
необходимые данные
3. Сразу после окончания сборки
запускается анализ
4. ???????
5. EPIC WIN!!!
Вторая попытка анализа
42
44. Результаты анализа
44
1192 предупреждения наивысшего уровня
(Level 1)
629 предупреждений второго уровня
(Level 2)
Суммарно 1821 предупреждения
(без Level 3)
61. 2. Защититься от появления новых ошибок
61
Как разглядеть новые срабатывания среди
старых?
Способ 1: инкрементальный анализ
Способ 2: массовое подавление
предупреждений (suppress-базы)
62. Как работать с suppress-базой
62
Прячем все старые срабатывания
При следующем прогоне получаем 0
предупреждений
С этого момента свежие ошибки будут
обнаруживаться сразу
65. Как работать с suppress-базой
65
Старые предупреждения никуда не деваются!
Мы лишь работаем с ними отдельно от
новых
66. Инкрементальный анализ или suppress-базы?
66
Работая с Unreal Engine 4, мы использовали
только инкрементальный анализ
Suppress-базы удобнее, если проект
развивается непосредственно вами
Можно использовать оба способа
одновременно
70. Принцип Парето
70
Чтобы исправить 80% ошибок, достаточно
рассмотреть 20% предупреждений
Эти доли уже заранее разделены и готовы к
использованию
75. Суммарное количество предупреждений
закладывается в систему контроля версий
Допускаются только те изменения, которые не
увеличивают это количество
Метод храповика
75
85. Разработчики из Epic Games остались довольны
Теперь они регулярно пользуются статическим
анализом
Ну а мы… а мы написали про это еще одну статью :)
Итого
85
88. Если предупреждений тысячи:
88
1. Настройте непрерывный анализ
2. Защититесь от новых ошибок
3. Обработайте отчёт анализатора постепенно
(принцип Парето и метод храповика)