Check the CSV file and the round count in the json_view benchmarks

fopen() of the CSV output was not checked, so an unwritable directory made
fprintf() write to a null FILE*; the round count is parsed with strtol and
clamped instead of atoi.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann committed 2026-10-11 12:45:56 +02:00
1 parent 91125c26a3
commit 2fb2be036c
3 files changed
+21 -3

No files matched your search

+7 -1
View File
@@ -220,7 +220,8 @@ int main(int argc, char** argv)
{ {
if (std::strcmp(argv[i], "--rounds") == 0 && i + 1 < argc) if (std::strcmp(argv[i], "--rounds") == 0 && i + 1 < argc)
{ {
rounds = std::atoi(argv[++i]); // (clamped: 0 rounds by size, at most a million)
rounds = static_cast<int>((std::min)((std::max)(std::strtol(argv[++i], nullptr, 10), 0L), 1000000L));
} }
else else
{ {
@@ -228,6 +229,11 @@ int main(int argc, char** argv)
} }
} }
std::FILE* csv = std::fopen("bench_corpus.csv", "w"); std::FILE* csv = std::fopen("bench_corpus.csv", "w");
if (csv == nullptr)
{
std::perror("bench_corpus.csv");
return 1;
}
std::fprintf(csv, "file,bytes,workload,engine,ns\n"); std::fprintf(csv, "file,bytes,workload,engine,ns\n");
json_document reused; json_document reused;
simdjson::dom::parser sj; simdjson::dom::parser sj;
+7 -1
View File
@@ -497,7 +497,8 @@ int main(int argc, char** argv)
return 1; return 1;
} }
const std::string T = std::string(argv[1]) + "/"; const std::string T = std::string(argv[1]) + "/";
const int rounds = argc > 2 ? std::atoi(argv[2]) : 20; // (clamped to 1 to a million)
const int rounds = argc > 2 ? static_cast<int>((std::min)((std::max)(std::strtol(argv[2], nullptr, 10), 1L), 1000000L)) : 20;
const std::string only = argc > 3 ? argv[3] : ""; const std::string only = argc > 3 ? argv[3] : "";
struct doc struct doc
{ {
@@ -526,6 +527,11 @@ int main(int argc, char** argv)
}; };
std::FILE* csv = std::fopen("bench_edit.csv", "w"); std::FILE* csv = std::fopen("bench_edit.csv", "w");
if (csv == nullptr)
{
std::perror("bench_edit.csv");
return 1;
}
std::fprintf(csv, "doc,bytes,workload,engine,ns\n"); std::fprintf(csv, "doc,bytes,workload,engine,ns\n");
for (const auto& dc : docs) for (const auto& dc : docs)
{ {
+7 -1
View File
@@ -608,7 +608,8 @@ int main(int argc, char** argv)
return 1; return 1;
} }
const std::string T = std::string(argv[1]) + "/"; const std::string T = std::string(argv[1]) + "/";
const int rounds = argc > 2 ? std::atoi(argv[2]) : 30; // (clamped to 1 to a million)
const int rounds = argc > 2 ? static_cast<int>((std::min)((std::max)(std::strtol(argv[2], nullptr, 10), 1L), 1000000L)) : 30;
const std::string only = argc > 3 ? argv[3] : ""; const std::string only = argc > 3 ? argv[3] : "";
struct doc struct doc
{ {
@@ -645,6 +646,11 @@ int main(int argc, char** argv)
} }
std::FILE* csv = std::fopen("bench_view.csv", "w"); std::FILE* csv = std::fopen("bench_view.csv", "w");
if (csv == nullptr)
{
std::perror("bench_view.csv");
return 1;
}
std::fprintf(csv, "doc,bytes,workload,engine,ns\n"); std::fprintf(csv, "doc,bytes,workload,engine,ns\n");
json_document reused; json_document reused;
simdjson::dom::parser sj; simdjson::dom::parser sj;