【问题标题】:Sanitizing memory management in Go + SWIG + C++ code在 Go + SWIG + C++ 代码中清理内存管理
【发布时间】:2021-03-14 16:34:02
【问题描述】:

我正在通过 SWIG 使用来自 Go 的 C++ 库。 SWIG 不负责内存管理,因此 Go 端看起来像这样:

f := NewFoo()
defer DeleteFoo(f)

在我创建 f 时调用 DeleteFoo(f) 很容易,但对于 C++ 函数的返回值很容易忽略它。

我想自动检查我的代码是否正确。

我看到 Address Sanitizer 是为 GCC 和 Clang 实现的,这听起来是正确的。但我找不到明确的方法来说明如何为我的 go test 命令启用它。

【问题讨论】:

    标签: c++ go swig cgo address-sanitizer


    【解决方案1】:

    我认为CC="clang -fsanitize=address" go testCC="gcc -fsanitize=address" go test 应该可以工作。

    【讨论】:

    • 构建失败。 /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 在块内的工作(函数等)中非常有用。然而,这并不总是足够的。
    你需要什么runtime.SetFinalizer

    直接说,我不认为你可以用 Go 来检查其他任何东西的内存状态。 (所以内存是用 C 或 C++ 分配的。)

    如果我是你,我会将 C 代码的一部分编译为共享的。稍后我可以很容易地使用诸如 clang 之类的工具来检查这一点。 如果你的 C 代码没有问题,你就无法干扰 Go 的 gc。

    【讨论】:

    • 谢谢!我也不认为SetFinalizer 是100% 可靠的解决方案。如果是,SWIG 会设置它。请参阅 github.com/swig/swig/issues/289#issuecomment-79369481 中来自 Ian 的评论。无论如何,这有助于编写好的代码。但我正在寻找一种方法来自动检查现有代码是否良好。
    • @Daniel Darabos SetFinalizer 不提供任何保证。它写在文档中。无论如何,我想说你想错了。你只能在 Go 上检查 Go 的内存。 Go 的测试解释了什么应该正确工作以及其他细节。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多