Clang 8 с MinGW-w64: Как использовать адресные и UB-дезинфицирующие средства? - PullRequest
8 голосов
/ 02 апреля 2019

Примечания к выпуску Clang 8 имеют эту многообещающую строку:

  • Разрешить использование Address Sanitizer и Undefined Behavior Sanitizer на MinGW.

Однако я не могу понять, как правильно их использовать.

Я использую Clang 8.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;
}

Вот результаты для -fsanitize=address:

# /z/Lander/LLVM/bin/clang++ -target x86_64-w64-windows-gnu -fsanitize=address 1.cpp
Z:\Lander\msys2\mingw64\bin\ld.exe: cannot find Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\libclang_rt.asan_dynamic-x86_64.dll.a: No such file or directory
Z:\Lander\msys2\mingw64\bin\ld.exe: cannot find Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\libclang_rt.asan_dynamic_runtime_thunk-x86_64.a: No such file or directory
Z:\Lander\msys2\mingw64\bin\ld.exe: cannot find Z:\Lander\LLVM\lib\clang\8.0.0\lib\windows\libclang_rt.asan_dynamic_runtime_thunk-x86_64.a: No such file or directory
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

А вот и -fsanitize=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.

Я пытался вручную связать различные библиотеки из этого каталога.

Для асана мне удалось избавиться от ошибок компилятора, но сам асан, похоже, не производит никакой диагностики:

# /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

Для ubsan, я пытался связываться с clang_rt.ubsan_standalone-x86_64.lib, но получил больше неопределенных ссылок и несколько Warning: corrupt .drectve at end of def file.

Я провел некоторое исследование по Warning: corrupt .drectve at end of def file, и этот вопрос предполагает, что это означает, что я связываю несовместимые библиотеки MSVC.

Что здесь происходит? Как я должен использовать асан и убсан?


Все вышеперечисленные команды были запущены с терминала MSYS2, работающего на Windows 7 x64.

Я нацеливаюсь на x86_64 и использую последний GCC, доступный в MSYS2:

# g++ --version
g++.exe (Rev2, Built by MSYS2 project) 8.3.0

В Clang из MSYS2, похоже, нет связанных библиотек asan & ubsan, поэтому я использую официальную сборку из llvm.org :

# /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

Я использую -target x86_64-w64-windows-gnu, потому что в противном случае Clang пытается использовать установку MSVC, которой у меня нет. Этот специфический триплет - то, что сообщает MSYS2 в ответ на --version.

...