🔧
Go + Valgrind: Почему это важно и как это работает?Если вы разрабатываете низкоуровневый код или работаете с cgo, вам знакомы проблемы с отслеживанием использования памяти и выявлением багов. А вот теперь, внимание:
в Go добавили поддержку Valgrind! Должно быть интересно для тех, кто хочет глубже проанализировать поведение программы на уровне памяти.
Теперь в Go появились аннотации, которые позволяют интегрировать программу с Valgrind, избегая ложных срабатываний, с которыми сталкивались разработчики раньше.
Как это работает? Встроенная в Go сборка теперь будет использовать инструментальные аннотации для отслеживания использования памяти. Вместо того чтобы добавлять заголовки Valgrind в код и полагаться на cgo, разработчики добавили функцию ассемблера, которая генерирует нужные инструкции для клиентских запросов Valgrind. То есть, теперь можно отслеживать стек и пулы памяти в Go-коде, а это, скажем прямо, не всегда легко для инструментов, которые привыкли к стандартному libc.
Зачем это вообще нужно? С помощью Valgrind теперь можно проанализировать, как Go управляет памятью на уровне рантайма. Это откроет новые возможности для мониторинга, поиска утечек памяти и проверки работы криптографических алгоритмов в постоянном времени. Так, например, Go активно использует алгоритмы шифрования в криптографическом дереве. До сих пор не было удобного способа удостовериться, что эти алгоритмы не подвержены тайминг-атакам, но теперь с Valgrind можно будет замерить, нет ли нежелательных зависимостей от времени выполнения операций.
Но стоит отметить, что пока это экспериментальная фича. Разработчики предлагают включить флаг
-valgrind, чтобы протестировать нововведения, и при этом признают, что реализация пока не идеальна. Например, если запустить даже простую программу, Valgrind всё равно обнаружит несколько сотен ошибок, из-за отсутствия понимания, как Go работает с памятью. Однако с корректным использованием флагов можно минимизировать эти проблемы и максимально использовать возможности инструмента.
P.S. Примечательно, что поддержка Valgrind в Go прошла мимо обычного процесса обсуждений 😅 Закрытый issue на GitHub
Review PR
Valgrind