Очистка управления памятью в коде Go SWIG C

#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 объясняют, что должно работать правильно, и другие детали.