[英]Sanitizing memory management in Go + SWIG + C++ code
我正在通过 SWIG 使用来自 Go 的 C++ 库。 SWIG 不负责 memory 管理,因此 Go 端看起来像这样:
f := NewFoo()
defer DeleteFoo(f)
在我创建f
时调用DeleteFoo(f)
很容易,但是对于 C++ 函数的返回值,很容易忽略它。
我想自动检查我的代码是否正确。
我看到为 GCC 和 Clang 实施了 Address Sanitizer,这听起来是正确的。 但是我找不到明确的方法来说明如何为我的go test
命令启用它。
我认为CC="clang -fsanitize=address" go test
或CC="gcc -fsanitize=address" go test
应该有效。
Defer
在块内的工作(函数等)中非常有用。 然而,这并不总是足够的。
你需要什么runtime.SetFinalizer
直接,我认为您无法使用 Go 检查其他任何东西的 memory 状态。 (所以 memory 分配在 C 或 C++ 中。)
如果我是你,我会将 C 代码的一部分编译为共享。 稍后使用 clang 之类的工具对我来说很容易检查。 如果您的 C 代码显示没有问题,则您无法干扰 Go 的 gc。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.