Clang开发版AddressSanitizer报invalid-pointer-pair问题咨询
AddressSanitizer 触发"invalid-pointer-pair"错误的问题分析
现象概述
使用Clang最新master分支构建版本编译一段简单C++20程序时,AddressSanitizer会报告invalid-pointer-pair错误;但切换到官方最新发布版Clang 15编译运行,完全正常。
测试代码
#include <filesystem> #include <iostream> constexpr std::string_view str = "/usr"; const std::filesystem::path path{str}; int main() { std::cout << "Path: " << path << std::endl; }
复现步骤
- 编译命令:
clang++ -fsanitize=address,pointer-compare,pointer-subtract -g -O0 -std=c++20 repro-asan.cpp -stdlib=libc++ -o repro-asan - 启用ASAN严格检测:
export ASAN_OPTIONS="detect_invalid_pointer_pairs=2" - 执行程序:
./repro-asan
错误定位
报错信息显示,问题出在libc的string头文件内的__addr_in_range函数——该函数中存在跨对象的指针比较操作,而根据C标准,这类跨不同对象的指针比较属于未定义行为,被ASAN的严格检测模式捕捉到。
结论
这不是你的标准库使用方式有误,而是libc++ master分支版本的内部实现问题:
- Clang 15对应的稳定版libc++不存在该问题,说明是master分支后续代码改动引入了不符合标准的指针比较逻辑。
detect_invalid_pointer_pairs=2是ASAN的强检测模式,会直接将这类未定义行为标记为错误,而旧版本要么没有这个逻辑,要么未被检测触发。
内容的提问来源于stack exchange,提问作者notsurewhattodo
相关产品推荐
相关产品推荐

