可以使用-fsanitize = address运行MEX文件吗?

时间:2019-07-10 18:21:27

标签: c++ matlab mex address-sanitizer

我有一个用G ++正常编译的MEX文件。

我最近将其编译更改为使用clang ++,并将-fsanitize=address包含在LDFLAGSCFLAGS中(注意:该项目不存在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添加到用于为我的项目构建MEX文件和目标文件的makefile的LDFLAG和CFLAG。

3:进行清洁,并确保已包含库(我用g ++生成,显然clang默认为libasan的STATIC版本,在这种情况下,即实际上未编译运行的可执行文件时,它将不起作用与libasan)

4:在终端中,执行以下操作:

export LD_PRELOAD=/lib64/libasan.so.5(此位置有所不同。我通过这篇文章Get location of libasan from 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 个答案:

答案 0 :(得分:2)

经过清理的库(MEX文件是共享库)期望airflow链接到主要可执行文件(在这种情况下为MATLAB)或在启动时libasan.so被链接。由于您无法重建MATLAB,因此第二种方法是唯一的机会。

它可能无法顺利运行,因为Asan可能会在MATLAB启动代码中发现内存问题,并在到达MEX文件之前中止。您可以使用LD_PRELOAD来忽略这些错误(它们仍然会被报告,但至少会继续执行)。

请注意,您的问题与其他有关在未消毒的解释器中运行经过消毒的二进制插件的问题类似(请参阅similar question for Python,尽管该问题是以Clang为中心的。)