首页 > 解决方案 > 为什么在 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()

标签: c++cross-platformposixgoogletest

解决方案


您传递给的字符串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"如果在后缀之后碰巧有一个空字节,这会偶然发生。是否是这种情况取决于执行环境。


推荐阅读