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

Can MEX files be run with -fsanitize=address?

本文关键字:address 运行 -fsanitize 文件 可以使 MEX      更新时间:2023-10-16

我有一个用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 文件和目标文件的生成文件的 LDFLAG 和 CFLAG。

3:清理并制作以确保它包含库(我用 g++ 构建,显然 clang 默认为 libasan 的静态版本,这在运行可执行文件实际上不是使用 libasan 编译的情况下不起作用)

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

export LD_PRELOAD=/lib64/libasan.so.5(这个位置虽然有所不同。我发现了如何使用这篇文章找到它:从 gcc/clang 获取 libasan 的位置)

然后做:

export ASAN_OPTIONS=halt_on_error=false

5:最后,调用MATLAB:

matlab -nojvm -nodesktop -nosplash

6:然后(这可能是特定于我的项目)我 CD 进入 MATLAB 项目所在的目录,addpath(genpath('.'))添加其所有文件,最后调用实际的 MATLAB 脚本来完成这项工作。

结果是绿色和红色错误,例如:

地址0x(某个地址)位于线程 T(线程编号)的堆栈中 摘要:地址消毒器:memcpy-param-overlap (libasan.so.5+(一些数字)) 或 错误:地址清理器:内存参数重叠:内存范围 [范围] 和 [范围] 重叠

净化库(MEX 文件是共享库)希望libasan.so链接到主可执行文件(在这种情况下为 MATLAB)或在启动时LD_PRELOAD编辑。由于您无法重建 MATLAB,因此第二种方法是您唯一的机会。

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

作为旁注,您的问题类似于有关在未净化的解释器中运行经过净化的二进制插件的其他问题(例如,请参阅Python的类似问题,尽管该问题以Clang为中心)。