我试图通过像这样构建
来使用Undefined Behavior Sanitizergcc -fsanitize=undefined add.c -o add
也
clang -fsanitize=undefined -O add.c -o add
在这两种情况下,我都找不到文件错误:
ld: file not found: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib
这是我在运行gcc -v
和clang -v
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
根据this news release,它可以在GCC中使用,而original homepage则表示它已合并到LLVM中。链接到文章说GCC 4.9有它,我认为我有(至少 - 版本编号似乎不同但文章是几年前编写的,我已经多次更新我的系统。)
问题:如何构建可执行文件以使用UBSan?
答案 0 :(得分:1)
为了使用未定义的行为清理程序,我必须使用clang以及libcxx和libcxxabi安装和构建LLVM,即使我的MacOS已经附带了一个版本的clang。 (结果我现在在计算机上安装了两个版本的clang)。来自llvm getting started page
cd where-you-want-llvm-to-live
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd where-you-want-llvm-to-live
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd where-you-want-llvm-to-live
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
现在,我可以通过运行
来使用未定义的行为清理程序/usr/local/bin/clang -fsanitize=undefined -O add.c -o add
答案 1 :(得分:0)
根据博客Friday Q&A 2015-07-03: Address Sanitizer by Mike Ash:
知道为什么Apple clang不支持
-fsanitize=undefined
?当我尝试时,我得到了:
clang -fsanitize=undefined ub.c ... ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/ bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib
Spencer于2016-12-21 01:23:59:
如果使用
-fsanitize=address,undefined
则可行。希望这个 帮助找到此帖子的其他人像我一样搜索该错误。
它不是我们理想的解决方案,因为它们是独立的组件,我们对环境和工具的控制有限。我们不得不暂停一些Address Sanitizer测试,因为Asan使用GCC内联汇编和使用ebp / rbp作为通用寄存器产生不正确的结果。在这里,环境和工具由Travis CI提供。
在Issue 33201, Apple Clang bundled with Xcode 8 does not reject -fsanitize=undefined when it should向LLVM提交了一份错误报告。它可能因为Apple Clang错误(我们没有iTunes帐户向Apple提交错误)而作为非主题关闭。