Bug fs::openFile 分配了重复的 ID,导致内存泄漏和数据损坏

作者: itssagarK创建于 2026年4月1日更新于 2026年9月13日
标签bug

fs::openFile 函数使用 openedFiles 映射的当前大小来确定下一个文件流 ID:

cpp
int virtualFileId = openedFiles.size();

一旦文件被打开和关闭不连续,就会出现问题。以下是发生的情况:

  • 打开文件 A → 获得 ID 0(映射大小现在为 1)
  • 打开文件 B → 获得 ID 1(映射大小现在为 2)
  • 关闭文件 A → 映射大小降至 1
  • 打开文件 C → openedFiles.size() 返回 1 → 文件 C 获得 ID 1

现在,文件 C 具有与文件 B 相同的 ID。ID 1 的映射项被重写为文件 C 的指针 - 文件 B 的 ifstream* 从未被释放(内存泄漏),并且使用文件 B 的 ID 的任何 JS 读取操作将会默默地从文件 C 中读取数据。

内容来源: neutralinojs/neutralinojs