Статический анализатор — это полезный инструмент, и Go разработчики знают это не понаслышке благодаря go vet. Но что, если его возможностей не хватает? Искать новый инструмент? Или сделать… свой?!
В докладе разобрали встроенные в Go инструменты и возможности для разбора кода. Узнали, что лежит под капотом статического анализа, что такое семантическая модель, и построили синтаксическое дерево.
А нужно это всё для того, чтобы в итоге написать собственный анализатор, который будет искать ошибки под ваш конкретный проект.
Вебинар PVS-Studio объясняет, зачем писать собственный статический анализатор для языка Go и какие ошибки в коде стандартные инструменты, такие как go vet и staticcheck, диагностируют не во всех случаях.
О чём видео
Вебинар ведёт Глеб, разработчик PVS-Studio, статического анализатора кода. Он рассказывает, что в этом году команда PVS-Studio начала создавать новый анализатор для Go, и делится опытом, полученным при его разработке и при проверке идеи на стандартных инструментах. Показывается, что go vet встроен в тулчейн Go и применяется при каждой сборке и запуске тестов, а затем на реальных open-source проектах с GitHub (от 10 тысяч до 50 тысяч звёзд и больше) разбираются типичные ошибки: дублирующиеся условия, неверная переменная в проверке, повторяющийся флаг и потерянный результат append. Вебинар завершается постановкой цели: научиться находить такие ошибки собственным анализатором.
Основные темы
Организация вебинара - вопросы можно задавать в чате во время доклада, в конце проходит сессия вопросов и ответов, запись будет отправлена участникам по электронной почте.
Статический анализ в экосистеме Go - go vet входит в состав тулчейна Go, поэтому разработчики используют статический анализ при каждом go build и go test.
Простые ошибки в коде - повторная проверка одного и того же условия; пример из популярного проекта на GitHub, где во вложенной проверке вместо переменной err2 по ошибке указана err.
Условия, которые трудно заметить - три цветовых компонента, из которых один проверяется дважды, а другой не проверяется вовсе; то же условие с переставленными операндами.
Копирование кода (copy-paste) в конфигурации - список флагов, в котором один флаг указан дважды; на работу программы это не влияет, потому что флаги комбинируются побитово.
Value receiver и потерянный результат append - различие между безобидной записью в поле копии и реальной ошибкой, при которой результат append теряется.
Цель вебинара - показать, как создать анализатор, находящий такие ошибки.
Термины и определения
Статический анализ - процесс поиска дефектов, ошибок и других проблем в коде без его запуска. Время в записи: 01:57.
go vet - стандартный анализатор, входящий в состав тулчейна Go; это не отдельный линтер и не расширение, поэтому он работает при go build и go test. Время в записи: 02:18.
Тулчейн (toolchain) Go - набор встроенных инструментов самого Go, частью которого является go vet. Время в записи: 02:29.
Ложное срабатывание (false positive) - предупреждение анализатора в ситуации, когда реальной ошибки в коде нет. Время в записи: 09:34.
Ложноотрицательный результат (false negative) - ситуация, когда анализатор не выдаёт предупреждение, хотя в коде есть реальная ошибка. Время в записи: 10:22.
Value receiver - метод Go с получателем-значением: запись в поле внутри такого метода изменяет копию, а не исходный объект. Время в записи: 08:52.
Побитовые флаги - набор флагов, объединяемых побитовой операцией; повторение одного и того же флага не нарушает работу, но указывает на ошибку copy-paste. Время в записи: 08:11.
Люди, организации и продукты
Глеб - ведущий вебинара, разработчик PVS-Studio.
PVS-Studio - статический анализатор кода; в этом году его команда начала разработку анализатора для языка Go.
go vet - стандартный анализатор языка Go.
staticcheck - линтер для Go, рассмотренный на примере метода с value receiver.
GoCritic - линтер для Go, использованный в сравнении на тех же примерах.
GitHub - платформа, с которой взяты реальные open-source проекты для примеров.
Ключевые числа и даты
От 10 000 звёзд на GitHub - популярность проекта, использованного в первом реальном примере; в других проектах 50 000 звёзд и больше.
Главные выводы
go vet входит в тулчейн Go, поэтому статический анализ используется разработчиками на Go в повседневной работе.
Простые ошибки, такие как дублирующееся условие, не зависят от опыта разработчика, языка и размера проекта.
Разные инструменты по-разному обрабатывают одни и те же шаблоны кода, поэтому собственный анализатор позволяет настроить поиск ошибок под конкретные задачи.
Кому будет полезно
Разработчикам на Go, которые используют go vet и линтеры и хотят понять границы стандартных инструментов, а также тем, кто интересуется устройством статических анализаторов.
0