GCC 14中std::filesystem::directory_iterator触发堆溢出的问题问询
GCC 14搭配AddressSanitizer时std::filesystem::directory_iterator堆缓冲区溢出问题
问题现象
使用GCC 14搭配地址 sanitizer编译指定代码时,遍历std::filesystem::directory_iterator{sandbox}的for循环会触发AddressSanitizer: heap-buffer-overflow运行时错误;若目录为空,迭代器循环可正常执行。
代码示例
#include <iostream> #include <fstream> #include <filesystem> void test_directory_iterator() { const std::filesystem::path sandbox{"sandbox"}; std::filesystem::create_directories(sandbox/"dir1"/"dir2"); std::ofstream{sandbox/"file1.txt"}; std::ofstream{sandbox/"file2.txt"}; std::cout << "directory_iterator:\n"; // directory_iterator can be iterated using a range-for loop for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) {} } int main(int argc, char *argv[]) { test_directory_iterator(); exit(0); }
环境信息
- 编译器版本:Homebrew GCC 14.1.0_1
- 目标平台:x86_64-apple-darwin21(macOS 12.7.4)
- 编译命令:
/usr/local/Cellar/gcc/14.1.0_1/bin/g++-14 --sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -fdiagnostics-color=always -std=c++23 -g -fsanitize=address,undefined -fno-omit-frame-pointer /Users/kjell-olovhogdal/Documents/Github/cratchit/src/directory_iterator_error.cpp
问题解答
1. GCC 14的std::filesystem::directory_iterator是否存在已知bug?
是的,GCC官方bug跟踪系统中存在针对macOS平台下std::filesystem::directory_iterator搭配AddressSanitizer触发堆缓冲区溢出的相关报告。这类问题根源在于libstdc++在macOS上对接系统目录查询API时,内存分配与拷贝的边界处理存在疏漏,导致ASan检测到越界访问行为。
2. 该问题仅本地存在还是可复现?
此问题并非本地独有,在匹配以下条件的环境中可以稳定复现:
- Homebrew提供的GCC 14.x版本
- macOS 12.x或13.x系统
- 启用
-fsanitize=address编译选项
复现步骤:
- 将上述示例代码保存为cpp文件
- 使用指定的编译命令编译代码
- 运行生成的可执行文件,会直接触发AddressSanitizer的堆缓冲区溢出报错
内容的提问来源于stack exchange,提问作者Kjell-Olov Högdahl
相关产品推荐
相关产品推荐

