为什么在 googletest 中调用 mkdtemp() 会失败?
Why does `mkdtemp()` fail when called in googletest?
我创建了一个小型 RAII class,它创建了一个唯一的临时目录并在销毁时再次删除它。在 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::string
不同,std::vector<char>
不执行隐式空终止。如果 "XXXXXX"
后缀后恰好有一个空字节,这会意外地起作用。是否是这种情况取决于执行环境。
我创建了一个小型 RAII class,它创建了一个唯一的临时目录并在销毁时再次删除它。在 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::string
不同,std::vector<char>
不执行隐式空终止。如果 "XXXXXX"
后缀后恰好有一个空字节,这会意外地起作用。是否是这种情况取决于执行环境。