? Аргуард
Linter для GO, который проверяет статические аргументы вызовов против функциональных охранников (он же контракты).
Пример
Допустим, у вас есть следующая функция:
func div ( n , d float64 ) float64 {
if d == 0 {
panic ( "denominator must not be zero" )
}
return n / d
} А потом вы называете это так:
Даже если мы не знаем userInput , мы видим, что этот вызов функции будет паниковать во время выполнения, потому что второй аргумент всегда равен нулю.
Линтер находит и сообщает о таких местах, используя безопасное выполнение частичного кода и черную магию.
? Установка
go install github.com/orsinium-labs/arguard@latest
Использование
Доступные флаги:
-
-contracts.follow-imports : установите этот флаг на false, чтобы не извлекать контракты из импортированных модулей. Другими словами, нарушения контракта (охрана) будут сообщать только о том, что функция с контрактом и вызовом функции будет расположена в том же анализируемом пакете. Полезно для лучшей производительности . -
-contracts.report-contracts : издайте сообщение для каждого обнаруженного договора. Полезно для отладки , чтобы увидеть, был ли контракт обнаружен линтером или нет. -
-arguard.report-errors : установите этот флаг, чтобы показать неудачи во время выполнения контракта. По умолчанию, если Arguard не выполняет контракт, он просто движется дальше, не сообщая ничего. Полезно для отладки , чтобы понять, почему ошибка контракта не была сообщена.
? QNA
- ? Как это работает? Внутри есть два анализатора. Первый обнаруживает безопасные до контрактов (охранники) в коде. Второй обнаруживает вызовы по функциям с известными контрактами, извлекает статически известные аргументы и выполняет контракты, которые могут быть выполнены с использованием Yaegi.
- ? Что такое охранник (контракт)? Условие IF в начале функции (только другие контракты могут идти перед ней) с проверкой для безопасной до эксплуатации, а корпус только возвращает ошибку или вызов
panic . - ? Насколько надежны результаты? Если он сообщает об ошибке, скорее всего, есть ошибка. Если это не сообщает об ошибке, все еще может быть ошибка. Это Линтер, а не официальный верификатор.
- ⚖ Насколько стабилен проект? Статический анализ в GO может быть грязным, особенно когда мы также выполняем выполнение частичного кода. Линтер может потерпеть неудачу, быть неправым или быть не таким умным, как может быть. Тем не менее, это статический анализатор, а не производственная зависимость, поэтому должно быть безопасно использовать его в любом проекте в любой среде. Имейте в виду, однако, что все еще есть частичное выполнение кода, поэтому вам, вероятно, не следует запускать его на ненадежном коде, просто чтобы быть в безопасности.
- ? Будут ли нарушенные изменения? Проект следует за Semver. Тем не менее, каждый релиз, даже патч, может начать сообщать о новых нарушениях в вашем коде. Итак, в некотором смысле, каждый релиз может сломать.
- ? Есть ли интеграция Golangci-Lint? Еще нет, но в конечном итоге будет. Легко интегрировать любое аналитическое линтер с Golangci-Lint, а Arguard мощно. Следите за обновлениями.
- ✏ Есть ли интеграция IDE? Еще нет. Когда у нас будет интеграция Golangci-Lint, IDE Integration будет бесплатно.
- ? Это новая идея? Проект реализует одну из вещей, которые имеют дело, может сделать моя библиотека Python для проектирования по контракту. Сама сделка построена на мудрости поколений, см. В этой временной шкале.
- Есть ли API GO, чтобы я мог использовать его в качестве библиотеки? Да. Анализованный пакет обеспечивает насыщенный способ составления анализаторов, и именно так вы можете использовать проект. См. Main.go для примера того, как создать и составить несколько экземпляров
analysis.Analyzer . - ? ? ️ это активно поддерживается? Проект, в лучших традициях Unix-Way, имеет очень маленький и четко определенный объем. Я мог бы время от времени возвращаться к нему и приносить новые интересные идеи, которые у меня были во время бессонных ночей, но ежедневно нечего поддерживать. Если он работает сегодня, завтра он не сломается, благодаря короткому списку зависимостей и обещанию совместимости GO 1.
- ? Что если я нашел ошибку? Разбейте проект, исправьте ошибку, напишите несколько тестов и откройте запрос на тягу. Я обычно объединяю и выпускаю любые взносы в течение дня.