Базовые действия для безопасной разработки на Go

Есть несколько основных практик в безопасной разработке, которые в общем-то надо бы применять всегда и их наверное знает "в теории" большинство, но далеко не во всех даже очень зрелых проектах эти практики реально используются. Ща расскажу как начать их применять прям сегодня и уверен, что они сразу покажут проблемы практически в любом проекте.
Про тесты я тут говорить не буду. Понятное дело, что это прям ну вот совсем-совсем обязательная штука. Но и без них есть три практики, которые позволят разительно улучшить ваш код.
Линтеры. В отличие от многих других языков в Go есть встроенные молоточки fmt и vet что в какой-то степени уже сразу дает возможность приводить код в некоторый порядок, плюс если мы говорим про работу в Goland, то половину работы с импортами и многими другими базовыми проблемами он берет на себя. Но все же вот список потенциально полезных линтеров на старте. Есть и другие подборки линтеров на любой вкус и цвет. Но если вы никогда ими не пользовались, стоит для начала просто посмотреть на то, что вообще есть.
Статический анализ кода. По-хорошему нужно бы подключить большой развесистый какой-то сторонний анализатор типа PVS, Svace, SonarQube или еще что-то большое, чтобы удобно и полноценно работать с анализом кода в динамике, но это явно не базовое действие. Плюс большие комбайны всё еще имеют так себе поддержку Go и они почти все стоят денег. Да и на самом деле можно и без них. Ведь есть линтеры с неплохим статическим анализом. Самый удобный на мой взгляд - это Staticcheck. Его суть в том, что используя простой статический анализатор и достаточно большое кол-во синтаксических правил он найдет в вашем коде несоответствия, которые IDE пропустила и которые в целом не являются визуально заметными. Ну а вообще линтеров и анализаторов много не бывает и можно например добавить еще go-critic.
Проверка на уязвимости. Это то, чем я например всегда жертвую в своих личных проектах. Ибо понимаю, что все равно особо никому мои поделки не нужны. И это не правильно! Результат анализа иногда показывает не только уязвимости, которые есть в вашем коде потенциально при действиях злоумышленников, но и иногда подсвечивают плавающие проблемы с переполнениями буфферов или утечками памяти, которые мешают штатной работе приложения. Решений как проверять код на уязвимости тоже много, наверное самыми мейнстримными является vuln и gosec.
В общем дабы пост получился не лонгридом, а все же полезным чем-то. Предлагаю вам добавить в ваш Makefile (у вас же он есть в проекте, да? 🤨) вот такую команду, запустить её и посмотреть на результат, скорее всего он вас удивит.
audit:
go mod verify
go vet ./...
go run github.com/jgautheron/goconst/cmd/goconst ./...
go run github.com/mdempsky/unconvert@latest -v
go run honnef.co/go/tools/cmd/staticcheck@latest -checks=all,-ST1000,-U1000 ./...
go run github.com/go-critic/go-critic/cmd/gocritic@latest check ./...
go run golang.org/x/vuln/cmd/govulncheck@latest ./...
go test -race -buildvcs -vet=off ./...
Для staticcheck выключены вот эти два правила:
Конечно это не исчерпывающий и совсем не полностью решающий все проблемы набор команд, которые надо бы запускать на регулярной основе перед сборкой, коммитом и вообще. Но это хорошее начало, что бы начать думать о качестве своего кода не только своими глазами, но и инструментами.
В следующий раз расскажу про чуть более сложные штуки.