MEX 文件可以是 运行 和 -fsanitize=address 吗?

Can MEX files be run with -fsanitize=address?

我有一个用 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: Make clean 和 make 以确保它包含库(我用 g++ 构建,显然 clang 默认为 libasan 的 STATIC 版本,这在 运行 这样的情况下不起作用可执行文件实际上不是用 libasan 编译的)

4:在终端中,执行:

export LD_PRELOAD=/lib64/libasan.so.5(虽然这个位置有所不同。我找到了如何使用这个 post 找到它: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+(some number)) 要么 错误:AddressSanitizer:memcpy-param-overlap:内存范围 [range] 和 [range] 重叠

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

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

附带说明一下,您的问题类似于其他关于 运行 未经净化的解释器中经过净化的二进制插件的问题(参见 ,尽管那个是 Clang-centric)。