阅读完对我自己的代码的回顾、关于
boost::filesystem::unique_path
的答案、关于unique_path
及其参考文献的另一个答案、关于tmpnam
及其Linux手册页的文档,以及其他一些内容之后相关的事情,我的印象是,使用 C++23,我们拥有提供临时文件创建的安全实现所需的一切,只需使用 C++23 标准库。
我所说的“安全”是指不存在已知安全漏洞
tmpnam
和 boost::filesystem::unique_path
的实现。
例如,我们可以实现一个
class temp_file
,其构造函数将生成一个 128 位随机文件名,并以独占模式 (std::filesystem::temp_directory_path()
) 打开位于 std::ios::noreplace
下的同名文件,其析构函数将关闭该文件并删除它,其 stream
成员函数将返回对打开文件的输入/输出流的引用。
这样的实现,假设它是正确的,是否可以被视为创建和使用临时文件的安全设施,或者我是否遗漏了一些重要的考虑因素,在这种情况下,这些考虑因素是什么?
C++ 的文件系统 API 无法创建此操作的“安全”版本。
要拥有完全安全的版本,您需要能够将以下所有操作作为单个文件系统原子操作执行:
标准库可以单独执行其中每一个操作,但漏洞来自于无法将整个序列作为单个原子进程执行。只要其他程序可以干预这些操作中的任何一个,漏洞就存在。而 C++ 没有机制来确保这种文件系统的原子性。
如果您想这样做,那么现在您必须使用特定于操作系统的库函数。