gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:31:51 24 4
gpt4 key购买 nike

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

我最近将其编译更改为使用 clang++,并将 -fsanitize=address 包含到 LDFLAGSCFLAGS 中(注意:没有 CXX该项目存在标志)。

然而,尽管如此,一旦我进入 MATLAB 并尝试调用 MEX 文件,我得到:

无效的 MEX 文件“(mex 文件的路径)”: 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(虽然这个位置有所不同。我发现如何使用这篇文章找到它:Get location of libasan from gcc/clang)

然后做:

导出 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] 重叠

最佳答案

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

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

附带说明一下,您的问题类似于其他有关在未经净化的解释器中运行经过净化的二进制插件的问题(参见例如 similar question for Python ,尽管该问题是以 Clang 为中心的)。

关于c++ - 可以使用 -fsanitize=address 运行 MEX 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56976550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com