Unit testing 如何在Ubuntu18.04上使用-msan选项运行go测试?

Unit testing 如何在Ubuntu18.04上使用-msan选项运行go测试?,unit-testing,go,memory-leaks,Unit Testing,Go,Memory Leaks,当我尝试运行带有内存健全性检查的go单元测试系统时,我得到一条错误消息,我确信我可以通过将编译器设置为CLANG来解决这个问题 对这件事的讨论有点简短 -msan enable interoperation with memory sanitizer. Supported only on linux/amd64, linux/arm64 and only with Clang/LLVM as the host C compiler. On linux/arm64,

当我尝试运行带有内存健全性检查的go单元测试系统时,我得到一条错误消息,我确信我可以通过将编译器设置为CLANG来解决这个问题

对这件事的讨论有点简短

-msan
    enable interoperation with memory sanitizer.
    Supported only on linux/amd64, linux/arm64
    and only with Clang/LLVM as the host C compiler.
    On linux/arm64, pie build mode will be used.
过去我是通过打电话来实现这一目标的:

CC=clang go test -msan ./..
但是,当我现在这样做时,会出现以下错误:

g++: error: unrecognized argument to -fsanitize= option: ‘memory’
在Ubuntu18:04下,我需要做什么才能使用内存消毒器运行我的golang测试


我目前正在使用以下版本的工具:

$ go version
go version go1.14 linux/amd64
$ clang --version
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

它需要一个LLVM版本,该版本在运行程序的Ubuntu 18.04版本上支持-fsanize=内存。请尝试更新,然后重试

还要注意,在Linux上,至少需要LLVM3.8才能获得-fsanize标志

Go工具会根据clang链接所需,自动将-fsanize=memory选项添加到CGO_CPPFLAGS标志中,这就是导致您出错的原因

另外,确保同时添加CC和CXX(对于clang++)标志,以便在与C/C++互操作程序时使用clang进行编译,即

CC=clang-CXX=clang++go-build-msan
也请参考此链接:

(bash脚本)

(或)

(*.go文件)


它将帮助您测试消毒剂是否适用于您的设置。

go1.7和go1.14测试完全不同。脚本无声地完成了,我想这意味着它通过了。一步一步地运行每一步似乎表明它也在通过。类似地,go1.14中基于.go的测试也通过了。正如我所预期的那样,我使用的是Clang3.8或6.0,两者都很重要。因此,我正在从事的项目中一定有一些东西破坏了构建的msan部分。我将进一步检查。您的建议帮助我获得了信心,相信我的开发系统一定在工作,并且问题存在于项目代码中的某个地方(无论如何,这是合理的确定性)。如果你可以更新它,如果不是默认的话,我会很高兴地接受C++的使用。先前的评论。我在对我的问题的评论中含糊地写了一些注释,但没有你的回答。如果你能给下一个读者添加一些提示,你可能需要为Ubuntu将CC和CXX都设置为clang,那么我很乐意接受你的回答。似乎我已经找到了一些相关的东西。我导入的包之一现在包含C++代码。Cc= CLAN处理设置C编译器,而不是C++编译器。当我使用CC=clang CXX=clang运行时,我会收到一条新的错误消息供我调查。线索可能应该是提到G++(它可以是C和C++编译器)。修复最后一条错误消息。Clang不默认为假设。h文件是C++文件,因此如果需要,则需要在C++文件中添加<代码> //μcgo LDFLAGS:-LSTDC++/<代码> .cpp文件的HPP。在依赖项目添加C++和C文件之后,我的问题似乎已经出现了,这意味着我需要添加<代码> CXX= CLAN/<代码>。