You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在静态库中定义__asan_default_options()无法使ASan配置生效?

为何在静态库中定义__asan_default_options()无法使ASan配置生效?

咱们先从链接器对静态库的处理逻辑说起吧。静态库本质上是一堆目标文件的归档包,链接器在把静态库链接到可执行程序时,只会把被可执行程序直接或间接引用到的目标文件从静态库里抽出来,合并到最终的可执行文件里。

那问题就出在__asan_default_options()这个函数上:ASan是在初始化阶段隐式调用它的,你的主程序代码里并没有直接引用这个函数(比如没有写__asan_default_options()这样的调用代码)。链接器根本不知道这个函数会被ASan隐式用到,所以当静态库的目标文件里只有这个函数,没有其他被主程序引用的符号时,链接器就会觉得这个目标文件“没用”,直接把它从链接过程中排除掉了——最终的可执行文件里根本就没有这个函数的实现!

这时候ASan启动时找不到自定义的__asan_default_options(),就只能用默认配置运行,自然不会生效allow_user_poisoning=false这个选项,所以你还是会看到中毒内存访问的错误。

再对比你试过的两种有效情况:

  • 直接把cpp文件加到可执行程序的源列表里:这种情况下,对应的目标文件会被强制包含进链接过程,不管有没有被直接引用,所以__asan_default_options()会出现在最终的可执行文件里,ASan能正常读取配置。
  • 使用OBJECT库:OBJECT库的作用是把所有目标文件原封不动地传递给链接器,链接器不会做“无用目标文件”的剔除,所以这个函数也会被包含进去,配置自然生效。

回到你的测试代码,主程序里没有任何代码引用静态库中的__asan_default_options(),链接器直接把静态库中对应的目标文件丢了,导致ASan根本没机会读到你的自定义配置,才出现了和预期不符的错误。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:20:28