mirror of
https://github.com/google/benchmark.git
synced 2025-03-14 03:10:22 +08:00
Remove use of std::tmpnam. (#734)
std::tmpnam is deprecated and its use is discouraged. For our purposes in the tests, we really just need a file name which is unlikely to exist. This patch converts the tests to using a dummy random file name generator, which should hopefully avoid name conflicts.
This commit is contained in:
parent
19f7d5c2bc
commit
eafa34a5e8
@ -4,6 +4,7 @@
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <random>
|
||||
#include <sstream>
|
||||
#include <streambuf>
|
||||
|
||||
@ -438,11 +439,50 @@ int SubstrCnt(const std::string& haystack, const std::string& pat) {
|
||||
return count;
|
||||
}
|
||||
|
||||
static char ToHex(int ch) {
|
||||
return ch < 10 ? static_cast<char>('0' + ch)
|
||||
: static_cast<char>('a' + (ch - 10));
|
||||
}
|
||||
|
||||
static char RandomHexChar() {
|
||||
static std::mt19937 rd{std::random_device{}()};
|
||||
static std::uniform_int_distribution<int> mrand{0, 15};
|
||||
return ToHex(mrand(rd));
|
||||
}
|
||||
|
||||
static std::string GetRandomFileName() {
|
||||
std::string model = "test.%%%%%%";
|
||||
for (auto & ch : model) {
|
||||
if (ch == '%')
|
||||
ch = RandomHexChar();
|
||||
}
|
||||
return model;
|
||||
}
|
||||
|
||||
static bool FileExists(std::string const& name) {
|
||||
std::ifstream in(name.c_str());
|
||||
return in.good();
|
||||
}
|
||||
|
||||
static std::string GetTempFileName() {
|
||||
// This function attempts to avoid race conditions where two tests
|
||||
// create the same file at the same time. However, it still introduces races
|
||||
// similar to tmpnam.
|
||||
int retries = 3;
|
||||
while (--retries) {
|
||||
std::string name = GetRandomFileName();
|
||||
if (!FileExists(name))
|
||||
return name;
|
||||
}
|
||||
std::cerr << "Failed to create unique temporary file name" << std::endl;
|
||||
std::abort();
|
||||
}
|
||||
|
||||
std::string GetFileReporterOutput(int argc, char* argv[]) {
|
||||
std::vector<char*> new_argv(argv, argv + argc);
|
||||
assert(static_cast<decltype(new_argv)::size_type>(argc) == new_argv.size());
|
||||
|
||||
std::string tmp_file_name = std::tmpnam(nullptr);
|
||||
std::string tmp_file_name = GetTempFileName();
|
||||
std::cout << "Will be using this as the tmp file: " << tmp_file_name << '\n';
|
||||
|
||||
std::string tmp = "--benchmark_out=";
|
||||
|
Loading…
Reference in New Issue
Block a user