长时间模糊测试触发AddressSanitizer内存释放失败错误原因咨询
AddressSanitizer 内存释放失败报错的可能原因
==1303173==ERROR: AddressSanitizer failed to deallocate 0x43000 (274432) bytes at address 0x7ffb83969000 ==1303173==AddressSanitizer CHECK failed: /build/llvm-toolchain-9-uSl4bC/llvm-toolchain-9-9/projects/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc:61 "((\"unable to unmap\" && 0)) != (0)" (0x0, 0x0) ==1303173==ERROR: AddressSanitizer failed to deallocate 0xcf000 (847872) bytes at address 0x7ffb80300000 ==1303173==AddressSanitizer CHECK failed: /build/llvm-toolchain-9-uSl4bC/llvm-toolchain-9-9/projects/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc:61 "((\"unable to unmap\" && 0)) != (0)" (0x0, 0x0)
可能的触发原因
- ASAN 虚拟地址空间耗尽:ASAN 运行时会预留大量虚拟内存地址空间(x86_64架构下默认预留约20TB),模糊测试长时间运行时,如果目标代码存在频繁大内存分配/释放逻辑,或是出现虚拟地址泄漏(内存释放后ASAN对应的影子内存标记未正确回收、内存映射区域碎片化导致找不到连续虚拟地址段),就算物理内存充足也会触发unmap失败。你使用的是LLVM 9版本的ASAN,旧版本ASAN在长时间运行场景下的虚拟内存管理存在已知的泄漏缺陷,更容易触发该问题。
- 目标程序非法内存操作破坏ASAN元数据:如果模糊测试触发了野指针、重复释放、越界写等问题,且操作刚好改写了ASAN内部维护的内存映射元数据,会导致ASAN无法识别要释放的内存区域,进而触发unmap失败。这种情况本身就是模糊测试需要定位的漏洞之一,可优先排查报错前最新生成的测试用例是否能复现崩溃。
- 系统映射条目数上限限制:检查系统
max_map_count配置(路径/proc/sys/vm/max_map_count),ASAN运行过程中会生成大量内存映射条目,长时间运行后条目数超过系统配置上限时,映射/解映射操作都会失败,即使物理内存剩余充足也会报错。默认的max_map_count一般为65530,模糊测试+ASAN场景建议调整到20万以上。 - ASLR与ASAN的兼容冲突:长时间运行过程中,地址空间随机化(ASLR)的随机映射可能和ASAN预留的地址空间产生冲突,导致要释放的内存区域不在ASAN的管理范围内,触发unmap失败。可临时关闭ASLR后运行测试,验证是否还会触发该报错。
- 测试Harness的内存管理逻辑缺陷:如果你的测试Harness存在手动
mmap/munmap调用逻辑,且手动映射的内存区域和ASAN预留地址段重叠,或是Harness调用munmap释放内存后又让ASAN尝试重复释放同一段地址,也会触发该错误。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

