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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:25:04