Проверьте, активен ли дезинфицирующее средство, например AddressSanitizer.

У меня есть несколько версий проверки проекта и скомпилированы. Если я замечаю ошибку, я сравниваю версии, чтобы сузить проблему. Иногда я включаю дезинфицирующие средства, такие как AddressSanitizer. Если я повторно использую исполняемый файл, я не помню, был ли он скомпилирован с дезинфицирующими средствами или нет. Если исполняемый файл работает нормально, я не уверен, что ошибки нет, или я не включил дезинфицирующее средство в эту сборку. Поэтому мне нужно перенастроить и перестроить, чтобы убедиться, что дезинфицирующее средство включено.

Есть ли способ проверить, был ли исполняемый файл скомпилирован с помощью дезинфицирующего средства?


person usr1234567    schedule 26.01.2016    source источник
comment
Вы можете использовать ldd для исполняемого файла, чтобы проверить, связан ли он с libasan.so. Или вы можете сделать objdump -p посмотреть, нужен ли libasan.so в динамических разделах: NEEDED libasan.so.0   -  person Jurasic    schedule 04.02.2016


Ответы (3)


Дезинфекция адресов также может быть скомпилирована статически с параметром -static-libasan в GCC. Статическая компиляция дезинфицирующего средства адресов — это режим по умолчанию в Clang.

Если вы компилируете дезинфицирующее средство адресов статически, то, очевидно, невозможно использовать ldd для проверки, дезинфицирован ли ваш двоичный файл или нет. В этом случае я использую nm и проверяю, есть ли в двоичном файле символы дезинфицирующего средства:

nm -an <executable> | grep asan

person Perennialista    schedule 07.12.2017

Вам нужно использовать __has_feature(address_sanitizer), см. http://clang.llvm.org/docs/AddressSanitizer.html (то же самое для других дезинфицирующих средств).

person Glider    schedule 03.02.2016
comment
Это сработает. Но меня больше интересует какой-нибудь инструмент командной строки для извлечения этой информации. - person usr1234567; 03.02.2016
comment
Что насчет GCC? Вы можете использовать: #if defined(__SANITIZE_ADDRESS__) как показано здесь: stackoverflow.com/questions/34813412/ - person thejinx0r; 22.04.2019

От 1_:

ldd выводит общие библиотеки, необходимые каждой программе или общей библиотеке, указанной в командной строке.

До тех пор, пока дезинфицирующее средство адресов требует связи с библиотекой libasan.so (фактическая реализация дезинфицирующего средства), вы можете предположить:

  • Если ldd не печатает общую библиотеку libasan.so, это определенно означает, что дезинфицирующее средство адресов отключено.

  • Если ldd напечатает общую библиотеку libasan.so, это означает, что ваши флаги компоновщика включают -lasan, иначе вы получите неразрешенную ошибку символа во время компоновки. Весьма вероятно, что дезинфицирующее средство адресов включено, если только у вас нет ошибки в системе сборки.

  • Третий вариант, если у вас есть ошибка в вашей системе сборки. ldd напечатает libasan.so, но дезинфицирующее средство адресов будет отключено, если вы передали компоновщику -lasan, но не передали -fsanitize=address. Это означает, что вы связали свой исполняемый файл с очистителем адресов, но не включили проверки в свой исполняемый файл.

    Или вы можете выполнить objdump -p, чтобы узнать, нужен ли libasan.so в динамических разделах: NEEDED libasan.so.0. objdump может дать ту же (и даже больше) информацию, что и ldd.

person Jurasic    schedule 04.02.2016