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
Другие вопросы по тегам