#c #go #swig #cgo #address-sanitizer
# #c #Вперед #swig #cgo #адрес-дезинфицирующее средство
Вопрос:
Я использую библиотеку C из Go через SWIG. SWIG не заботится об управлении памятью, поэтому сторона Go выглядит примерно так:
f := NewFoo()
defer DeleteFoo(f)
Его достаточно легко вызвать DeleteFoo(f)
при создании f
, но его легко опустить для возвращаемых значений из функций C .
Я хочу автоматически проверять, что мой код работает правильно.
Я вижу, что средство очистки адресов реализовано для GCC и Clang, и это звучит как правильная вещь. Но я не могу найти четкого рецепта того, как я мог бы включить его для своей go test
команды.
Ответ №1:
Я думаю CC="clang -fsanitize=address" go test
или CC="gcc -fsanitize=address" go test
должен работать.
Комментарии:
1. Не удается выполнить сборку.
/usr/bin/ld: $WORK/b054/_cgo_main.o: in function `asan.module_ctor': _cgo_main.c:(.text 0x82): undefined reference to `__asan_init'
Спасибо за ответ, но мне понадобится немного больше поддержки!
Ответ №2:
Defer
может быть очень полезно при работе внутри блока (функции и т. Д.). Однако этого не всегда достаточно.
Что вам нужно во время выполнения.SetFinalizer
Напрямую, я не думаю, что вы можете проверить состояние памяти чего-либо еще с помощью Go. (Таким образом, память выделяется на C или C .)
На вашем месте я бы скомпилировал часть кода C как разделяемый. Мне было бы легко проверить это позже с помощью таких инструментов, как clang. Если ваш код на C не показывает проблем, вы не можете вмешиваться в gc Go.
Комментарии:
1. Спасибо! Я тоже не думаю, что это
SetFinalizer
надежное решение на 100%. Если бы это было так, SWIG настроил бы его. См. Комментарий Яна в github.com/swig/swig/issues/289#issuecomment-79369481 . В любом случае это помогает при написании хорошего кода. Но я ищу способ автоматически проверять исправность существующего кода.2. @Daniel Darabos не дает
SetFinalizer
никаких гарантий. Это записано в документах. В любом случае, я хочу сказать, что вы думаете неправильно. Вы можете проверять память Go только на Go. Тесты Go объясняют, что должно работать правильно, и другие детали.