Можно ли запускать MEX-файлы с параметром -fsanitize = address? - PullRequest
3 голосов
/ 10 июля 2019

У меня есть MEX-файл, скомпилированный нормально с g ++.

Недавно я изменил его компиляцию для использования clang ++ и включил -fsanitize=address в LDFLAGS и CFLAGS (примечание: для этого проекта не существует флагов CXX).

Однако, несмотря на это, как только я попадаю в MATLAB и пытаюсь вызвать MEX-файл, я получаю:

Invalid MEX-file '(path to mex file)': undefined symbol: __asan_option_detect_stack_use_after_return.

Эта конкретная ошибка действительно распространена, когда люди неправильно связываются со средством очистки адресов. Тем не менее, в буквально каждый файл, который я компилирую , на который он связан. Каждый .o, каждый .mexa64.

Я подозреваю, что это потому, что сама MATLAB на это не способна, но я не уверен. Некоторое руководство от других разработчиков MEX было бы фантастическим.

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

1: установить libasan (для меня это было "yum install libasan", но оно может отличаться)

2: Добавьте -fsanitize=address к файлам LDFLAG и CFLAG make-файла, создавая файлы MEX и объектные файлы для моего проекта.

3: Make clean и make, чтобы убедиться, что в него включена библиотека (я собрал с g ++, по-видимому, clang по умолчанию использует STATIC-версию libasan, которая не будет работать в ситуациях, подобных этой, когда исполняемый исполняемый файл фактически не скомпилирован с либасаном)

4: в терминале выполните:

export LD_PRELOAD=/lib64/libasan.so.5 (хотя это местоположение может быть разным. Я узнал, как найти его, используя этот пост: Получить местоположение libasan из gcc / clang )

Затем выполните:

export ASAN_OPTIONS=halt_on_error=false

5: Наконец, позвоните в MATLAB:

matlab -nojvm -nodesktop -nosplash

6: Затем (и это может быть характерно для моего проекта) я записал CD в каталог, где находился проект MATLAB, сделал addpath(genpath('.')), чтобы добавить все его файлы, и, наконец, вызвал реальный скрипт MATLAB, который выполняет эту работу. .

Результатом были ошибки зеленого и красного цвета, например:

Адрес 0x (некоторый адрес) находится в стеке потока T (номер потока) РЕЗЮМЕ: AddressSanitizer: memcpy-param-overlap (libasan.so.5 + (некоторое число)) или же ОШИБКА: AddressSanitizer: memcpy-param-overlap: диапазоны памяти [range] и [range] перекрываются

1 Ответ

2 голосов
/ 10 июля 2019

Обеззараженные библиотеки (MEX-файлы являются общими библиотеками) ожидают, что libasan.so будет либо связан с основным исполняемым файлом (в данном случае MATLAB), либо LD_PRELOAD редактируется при запуске.Поскольку вы не можете перестроить MATLAB, второй подход - ваш единственный шанс.

Возможно, он не будет работать гладко, потому что Asan, скорее всего, обнаружит проблемы с памятью в коде запуска MATLAB и прервет работу до того, как он попадет в ваш MEX-файл.Вы можете использовать export ASAN_OPTIONS=halt_on_error=false, чтобы игнорировать эти ошибки (они будут по-прежнему сообщаться, но, по крайней мере, выполнение будет продолжено).

В качестве дополнительного примечания, ваша проблема похожа на другие вопросы о запуске обработанных бинарных плагинов в неанизированныхинтерпретаторы (см., например, аналогичный вопрос для Python , хотя этот вопрос ориентирован на Clang).

...