gpt4 book ai didi

c++ - 为什么在 googletest 中调用时 `mkdtemp()` 失败?

转载 作者:行者123 更新时间:2023-11-30 03:13:28 24 4
gpt4 key购买 nike

我创建了一个小型 RAII 类,它创建一个唯一的临时目录并在销毁时再次删除它。在 Linux 上,它使用 mkdtemp() 来实现这一点:

// temporaryDirectoryPath is an std::vector<char>
// containing u8"/tmp/nuclex-pixels-unittest-XXXXXX"

// Let mkdtemp() sort out a unique directory name for us (and create it!)
const char *directoryName = ::mkdtemp(&temporaryDirectoryPath[0]);
if(directoryName == nullptr) {
perror("mkdtemp() failed."); // DEBUGGING. REMOVE.
throw std::runtime_error("mkdtemp() failed.");
}

这在单独运行时工作得很好:runnable code on ideone.com


但是,如果我在 GoogleTest 1.8.1 中使用相同的代码单元测试声明如下:

TEST(MyTestFixture, CanFlumbleTempDirectory) {
TemporaryDirectoryScope temporaryDirectory;
// Could call temporaryDirectory.GetPath() here...
}

失败了:

Passing the following to mkdtemp(): /tmp/nuclex-pixels-unittest-XXXXXX
mkdtemp() failed.: Invalid argument

GoogleTest 如何干扰 mkdtemp()

最佳答案

您传递给 mkdtemp 的字符串不可靠地以 null 终止:

      // Then append our directory name template to it
const char directoryNameTemplate[] = u8"nuclex-pixels-unittest-XXXXXX";
{
const char *iterator = directoryNameTemplate;
while(*iterator != 0) {
temporaryDirectoryPath.push_back(*iterator);
++iterator;
}
}

std::vector<char>不执行隐式空终止,不像 std::string .如果 "XXXXXX" 之后恰好有一个空字节,这会意外地起作用。后缀。是否是这种情况取决于执行环境。

关于c++ - 为什么在 googletest 中调用时 `mkdtemp()` 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58680718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com