在 Windows 上使用 -faddress-sanitizer 进行 Clang
Posted
技术标签:
【中文标题】在 Windows 上使用 -faddress-sanitizer 进行 Clang【英文标题】:Clang with -faddress-sanitizer on Windows 【发布时间】:2012-08-02 03:16:40 【问题描述】:我的意图是在 Windows 上使用 Clang
替代 Valgrind
来查找我编写的 C/C++ 程序中的缓冲区溢出、动态内存滥用等。我已经按照here 提供的说明成功构建了 Clang。
我尝试使用 -faddress-sanitizer 选项(指定 here)编译一个简单的 C 程序,然后抛出以下错误 -
gcc.exe: error: unrecognized command line option '-faddress-sanitizer'
Using built-in specs.
COLLECT_GCC=C:/MinGW/bin/gcc.exe
Target: mingw32
Configured with: ../gcc-4.7.0/configure --enable-languages=c,c++,ada,fortran,objc,obj- c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1-with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.7.0 (GCC)
clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation)
为什么 clang(据我所知)调用 GCC?当然 GCC 不支持 -faddress-sanitizer 选项。
我对使用它的可能性感到非常兴奋,因为一段时间以来我一直在努力寻找一个好的(免费)替代 Valgrind。有人可以帮忙吗?
【问题讨论】:
【参考方案1】:如今,AddressSanitizer 在 Windows 上的效果要好得多(但它仍处于开发阶段)。 https://github.com/google/sanitizers/wiki/AddressSanitizerWindowsPort 有一些文档
【讨论】:
我现在已经修复了指向github.com/google/sanitizers/wiki/AddressSanitizerWindowsPort的链接【参考方案2】:谷歌搜索将我带到this page。
引用,
AddressSanitizer 支持
Linux x86_64(在 Ubuntu 10.04 上测试)。 MacOS 10.6 和 10.7 (i386/x86_64)。对 Linux i386/ARM 的支持正在进行中(它可能有效,但也不能保证)。
关于替换的话题,你看过Dr. Memory吗?
【讨论】:
谢谢,但根据this,Address Sanitizer 似乎应该在 Windows 上工作。我最近确实尝试了 Dr. Memory,它没有捕获缓冲区溢出,但它确实捕获了内存中未初始化的读取。我追求的一个最重要的功能是检测缓冲区溢出。 您是否完全按照这些说明进行操作? 没问题,祝你好运。 Here 是cl
的标志列表,因此您可以移植任何需要使用 MinGW 的内容。
似乎有一个与 GCC 兼容的端口 here。
博士。不幸的是,内存页面说它无法处理 64 位应用程序。以上是关于在 Windows 上使用 -faddress-sanitizer 进行 Clang的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 10 上使用 VS Code 在 iphone 上调试颤振