C++ MinGW-w64的叮当声8:如何使用地址-&;UB消毒液?

C++ MinGW-w64的叮当声8:如何使用地址-&;UB消毒液?,c++,clang,mingw-w64,address-sanitizer,ubsan,C++,Clang,Mingw W64,Address Sanitizer,Ubsan,有这样一条有前途的路线: 允许在MinGW上使用地址消毒剂和未定义的行为消毒剂 然而,我不知道如何正确使用这些 我正在将Clang8.0.0与MSYS2 MinGW GCC一起使用。具体细节在问题的底部 我正在尝试编译以下最小的代码: 1.cpp #include <iostream> int main() { // Testing ubsan int x = 0x7fffffff; x++; std::cout << x <&

有这样一条有前途的路线:

  • 允许在MinGW上使用地址消毒剂和未定义的行为消毒剂
然而,我不知道如何正确使用这些

我正在将Clang8.0.0与MSYS2 MinGW GCC一起使用。具体细节在问题的底部

我正在尝试编译以下最小的代码:

1.cpp

#include <iostream>

int main()
{
    // Testing ubsan
    int x = 0x7fffffff;
    x++;
    std::cout << x << std::endl;

    // Testing asan
    int *y = new int;
    delete y;
    std::cout << *y << std::endl;
}
下面是
-fsanize=undefined

# /z/Lander/LLVM/bin/clang++ -target x86_64-w64-windows-gnu -fsanitize=undefined 1.cpp
Warning: corrupt .drectve at end of def file
Z:\Lander\msys2\tmp\1-13f09e.o:1.cpp:(.text+0x9f): undefined reference to `__ubsan_handle_add_overflow'
Z:\Lander\msys2\tmp\1-13f09e.o:1.cpp:(.text+0xef): undefined reference to `__ubsan_handle_type_mismatch_v1'
Z:\Lander\msys2\tmp\1-13f09e.o:1.cpp:(.text+0x148): undefined reference to `__ubsan_handle_type_mismatch_v1'
Z:\Lander\msys2\tmp\1-13f09e.o:1.cpp:(.text+0x196): undefined reference to `__ubsan_handle_type_mismatch_v1'
Z:\Lander\msys2\tmp\1-13f09e.o:1.cpp:(.text+0x1df): undefined reference to `__ubsan_handle_type_mismatch_v1'
Z:\Lander\msys2\tmp\1-13f09e.o:1.cpp:(.text+0x22c): undefined reference to `__ubsan_handle_type_mismatch_v1'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
以下是
Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\
的内容,它在其中查找库:

clang_rt.asan-preinit-x86_64.lib
clang_rt.asan-x86_64.lib
clang_rt.asan_cxx-x86_64.lib
clang_rt.asan_dll_thunk-x86_64.lib
clang_rt.asan_dynamic-x86_64.dll
clang_rt.asan_dynamic-x86_64.lib
clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
clang_rt.builtins-x86_64.lib
clang_rt.fuzzer-x86_64.lib
clang_rt.fuzzer_no_main-x86_64.lib
clang_rt.profile-x86_64.lib
clang_rt.stats-x86_64.lib
clang_rt.stats_client-x86_64.lib
clang_rt.ubsan_standalone-x86_64.lib
clang_rt.ubsan_standalone_cxx-x86_64.lib
这看起来不对,因为MinGW GCC通常与
.a
库一起工作,而不是
.lib

我试图手动链接该目录中的各个库

对于asan,我设法消除了编译器错误,但asan本身似乎没有发出任何诊断:

# /z/Lander/LLVM/bin/clang++ -target x86_64-w64-windows-gnu -fsanitize=address 1.cpp -c
# /z/Lander/LLVM/bin/clang++ -target x86_64-w64-windows-gnu 1.o /z/Lander/LLVM/lib/clang/8.0.0/lib/windows/clang_rt.asan_dynamic-x86_64.lib
# ./a.exe
-2147483648
5089296         <- expected a diagnostic here
MSYS2中的Clang似乎没有绑定asan和ubsan库,因此我使用的是以下官方版本:


我使用的是
-target x86_64-w64-windows-gnu
,因为如果不是这样,Clang会尝试使用MSVC安装,而我没有。这个特定的三元组是MSYS2 clang在回复
--version

时报告的,我已经找到了一种使UBsan工作的方法,但不是Asan

事实证明,即使没有libubsan,UBsan也可以运行。您需要使用以下标志:

-fsanitize=undefined -fsanitize-undefined-trap-on-error
这样,通过“非法指令”崩溃而不是通过发出漂亮的诊断来报告错误,但总比什么都没有好

GCC和Clang都支持此标志

-f分析错误时未定义的陷阱

-fsanizize undefined trap on error
选项指示编译器使用
\uuuu builtin\u trap
而不是libubsan库例程报告未定义的行为。这样做的好处是不需要libubsan库,也没有链接,因此即使在独立环境中也可以使用


出于类似的原因,我在VirtualBox Linux映像中运行了消毒器。一切正常。msys2上可能有单独的libasan软件包吗?@smerlin显然没有。我试着在软件包列表中搜索
clang
llvm
san
,安装了一些看起来很有希望的软件包,但运气不好。你找到解决方案了吗?@amithks Nope。。
# g++ --version
g++.exe (Rev2, Built by MSYS2 project) 8.3.0
# /z/Lander/LLVM/bin/clang++ --version
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: Z:\Lander\LLVM\bin
-fsanitize=undefined -fsanitize-undefined-trap-on-error