unit-testing - 如何在 Ubuntu 18.04 上使用 -msan 选项运行 go test?
问题描述
当我尝试运行带有内存完整性检查的 go 单元测试系统时,我收到一条错误消息,我确信我可以通过将编译器设置为 CLANG 来解决该错误消息。
Go 命令文档对此事做了一些简短的介绍。
-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’
为了在 Ubuntu 18:04 下使用 memory sanitizer 运行我的 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
解决方案
它需要一个支持-fsanitize=memory在程序运行的Ubuntu 18.04版本上的 LLVM 版本。请尝试更新,然后重试。
另请注意,在Linux上,您至少需要LLVM 3.8才能获得-fsanitize标志。
Go工具会根据clang 的要求自动将 -fsanitize=memory 选项添加到CGO_CPPFLAGS标志以进行链接,这就是它导致您出错的地方。
此外,请确保添加CC和CXX(对于clang++)标志,以便在您与C/C++互操作程序时使用Clang启用编译,即,
CC=clang CXX=clang++ go build -msan
也请参考此链接:
https://go.googlesource.com/go/+/go1.7/misc/cgo/testsanitizers/test.bash(bash脚本)
(或者)
https://github.com/golang/go/tree/master/misc/cgo/testsanitizers(*.go文件)
它将帮助您测试消毒剂是否适用于您的设置。
推荐阅读
- julia - 从矩阵构建数据框 - 指定列类型
- spring-webflow - 更好地集成 Spring Webflow 和 REST 公开的指针
- postgresql - PostgreSQL 是否会为未指定主键的表创建一个内部键(可能是 int 类型)作为主键?
- c++ - QAbstractItemModel::match() 不搜索整个模型
- python - 找不到烧瓶上传文件
- php - 我在 PHP 中有 2 小时的值,如何运行 foreach 循环来获取它们之间的所有时间?
- database - 连接 Postgresql 和 MongoDB 的方法
- corda - 如何将安全哈希传递给事务构建器
- c# - 实体框架:通过子集合的属性查询父级
- node.js - 尝试安装 Firebase 时出现安装错误