ld: файл не найден: /Library/Developer/.../libclang_rt.ubsan_osx_dynamic.dylib
Я пытаюсь использовать Undefined Behavior Sanitizer, строя вот так
gcc -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
Согласно этому пресс-релизу, он доступен в GCC, а также на оригинальной домашней странице, где говорится, что он был объединен с LLVM. Ссылка на статью гласит, что в GCC 4.9 она есть, что, я полагаю, у меня есть (по крайней мере - нумерация версий кажется другой, но статья была написана несколько лет назад, и я несколько раз обновлял свою систему).
Вопрос: как мне создать исполняемый файл для использования UBSan?
2 ответа
Согласно блогу пятница, вопросы и ответы 2015-07-03: Адрес Sanitizer от 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
Спенсер в 2016-12-21 01:23:59:
Если вы используете
-fsanitize=address,undefined
оно работает. Надеюсь, это поможет любому, кто найдет этот пост, ищет эту ошибку, как я.
Это не идеальное решение для нас, так как они являются отдельными компонентами, и мы имеем ограниченный контроль над средой и инструментами. Нам пришлось приостановить некоторое тестирование Address Sanitizer, потому что Asan дает неверные результаты при встроенной сборке GCC и использовании ebp/rbp в качестве регистра общего назначения. И здесь среда и инструменты предоставляются Travis CI.
Отчет об ошибке был подан в LLVM в выпуске 33201. Apple Clang в комплекте с Xcode 8 не отклоняет -fsanitize = undefined, когда это необходимо. Он может быть закрыт как не по теме, так как это ошибка Apple Clang (у нас нет учетной записи iTunes, чтобы сообщить об ошибке в Apple).
Чтобы использовать неопределенное дезинфицирующее средство для поведения, мне пришлось установить и собрать LLVM с помощью clang, а также libcxx и libcxxabi, хотя моя MacOS уже шла с версией clang. (в результате теперь у меня на компьютере установлены две версии clang). Со стартовой страницы llvm
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