Средство очистки адресов Clang в OS X

Я хотел бы использовать дезинфицирующее средство адресов clang на OSX Mountain Lion, потому что у Valgrind есть проблемы с проверкой памяти на этой платформе. Но когда у меня было -fsanitize=address во время компиляции (как я вижу на этой странице: http://clang.llvm.org/docs/AddressSanitizer.html), я получил эту ошибку: clang: error: argument unused during compilation: '-fsanitize=address'

Итак, мой вопрос: как использовать Clang Address Sanitizer в OS X? Если я не могу его использовать, какой инструмент я могу использовать?

Я скачал clang с Xcode, и он обновлен. (возможно, в этой версии нет адресной сборки дезинфицирующего средства)


person Guillaume    schedule 21.04.2013    source источник


Ответы (3)


Поддержка AddressSanitizer в Xcode еще не полностью реализована. Рассмотрите возможность использования соединительной линии Clang (см. http://code.google.com/p/address-sanitizer/wiki/HowToBuild для инструкций по сборке)

person Glider    schedule 26.04.2013

Address Sanitizer был добавлен в качестве новой функции в Xcode 7.

Используйте флаг Runtime SanitizationEnable Address Sanitizer в своей схеме, чтобы включить опцию.

Затем git покажет это изменение в вашем файле .xcscheme:

enableAddressSanitizer = "YES"

Из Новые функции в Xcode 7 документ:

Адресное дезинфицирующее средство. Xcode 7 может создать ваше приложение с инструментарием, предназначенным для обнаружения и устранения повреждений памяти с помощью дезинфицирующего средства адресов.

Код Objective-C и C подвержен проблемам с повреждением памяти, таким как переполнение буфера стека и кучи и проблемы с использованием после освобождения. Когда происходят эти нарушения памяти, ваше приложение может непредсказуемо аварийно завершать работу или демонстрировать странное поведение. Проблемы с повреждением памяти трудно отследить, потому что сбои и странное поведение часто трудно воспроизвести, а причина может быть далека от источника проблемы.

Включить дезинфекцию адресов

Вы включаете дезинфицирующее средство адресов в схеме сборки. После включения в приложение встроены дополнительные инструменты для немедленного обнаружения нарушений памяти, что позволяет вам проверять проблему прямо в том месте, где она возникает. Предоставляется и другая диагностическая информация, например взаимосвязь между ошибочным адресом и действительным объектом в куче, а также информация о выделении/освобождении, которая помогает быстро выявить и устранить проблему.

Дезинфектор адресов эффективен — достаточно быстр, чтобы его можно было использовать регулярно, а также с интерактивными приложениями. Он поддерживается в OS X, в симуляторе и на устройствах iOS.

person pkamb    schedule 17.06.2015

Согласно источнику (в частности, если вы возьмете clang-425.0.24 пакет с сайта Apple с открытым исходным кодом, тестовый файл src/tools/clang/test/Driver/darwin-asan-nofortify.c:

// rdar://11496765, rdar://12417750
// -faddress-sanitizer is not currently supported.
// XFAIL: *

И, конечно же, есть ошибка с использованием -faddress-sanitizer, поэтому похоже, что в OS X вам нужно будет собрать clang самостоятельно из более нового источника, чтобы получить дезинфицирующее средство адреса.

Параметры командной строки

Попробуйте использовать -faddress-sanitizer вместо -fsanitize=address. Версия Apple, по-видимому, основана на более старой версии CLANG, и если вы запустите clang --help, все дезинфицирующие средства будут в этой версии.

person gaige    schedule 21.04.2013
comment
У меня тоже ошибка: clang: error: unsupported option '-faddress-sanitizer'. Однако в clang --help я вижу эту опцию - person Guillaume; 21.04.2013
comment
@gaige: проблема в том, что Apple развертывает старую версию Clang, в которой все еще используется старая -faddress-sanitizer. Более новый -fsanitize=address присоединился позже, когда были добавлены другие дезинфицирующие средства. - person 0xC0000022L; 25.02.2014
comment
@ 0xC0000022L Извините, я думал, что имел в виду это выше, когда сказал, что вам нужно будет собрать clang самостоятельно из более нового источника. По общему признанию, в нем прямо не говорится, что версия Apple старше, но предлагается строить из более новой версии. Я обновлю язык, чтобы сделать его более понятным. - person gaige; 26.02.2014
comment
@gaige: моя главная мысль касалась этого предложения По какой-то причине версия Apple, похоже, отличается от того, что есть в документах CLANG, что, кажется, предполагает, что Apple Clang новее. Без обид, но это смутило меня, и я подумал, что комментарий будет в порядке. - person 0xC0000022L; 26.02.2014
comment
Xcode 5.1.1 говорит clang: error: argument '-faddress-sanitizer' is deprecated, use '-fsanitize=address' instead. Однако он по-прежнему не поддерживает fsanitize=address: clang: error: unsupported argument 'address' to option 'fsanitize=' - person David Snabel-Caunt; 29.08.2014