c++ - 为什么在 googletest 中调用“mkdtemp()”会失败?
问题描述
我创建了一个小的 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.");
}
这在单独运行时工作得很好: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
不可靠地以空值结尾:
// 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"
如果在后缀之后碰巧有一个空字节,这会偶然发生。是否是这种情况取决于执行环境。
推荐阅读
- python-3.x - 安装 basemaplib 时出错
- ionic-framework - 如何在 Ionic 中获得位置准确性
- visual-studio-2017 - Visual C# 2017 代码编辑器突然停止复制为富文本
- python - 如何在从字符串列表写入 csv 时在第一列上添加时间戳
- c - 将来自 strtok() 的标记存储在双指针“二维数组”中
- visual-studio - 如何从 Visual Studio 2017 发布 Visual Basic 6 项目?
- javascript - 最有效的数据存储方式
- apache - Camel ftp2 quartz2 调度程序在启动路由后立即触发
- c# - UI 测试不关注 chrome
- php - 如何防止用户两次上传同一个文件 WordPress