multiple fixes to avoid Windows x64 crashes (#2139)
* fix: cast size_t widths to int for variadic printer to avoid Windows x64 crashes
* extend minimum time as Windows can have a coarse timer
* vsnprintf can consume va_list so we need to copy it to avoid UB
* extend longer test runtime to other problematic tests
diff --git a/src/colorprint.cc b/src/colorprint.cc
index c90232f..b7a6346 100644
--- a/src/colorprint.cc
+++ b/src/colorprint.cc
@@ -105,7 +105,10 @@
// we did not provide a long enough buffer on our first attempt.
size = static_cast<size_t>(ret) + 1; // + 1 for the null byte
std::unique_ptr<char[]> buff(new char[size]);
- ret = vsnprintf(buff.get(), size, msg, args);
+ va_list args_cp2;
+ va_copy(args_cp2, args);
+ ret = vsnprintf(buff.get(), size, msg, args_cp2);
+ va_end(args_cp2);
BM_CHECK(ret > 0 && (static_cast<size_t>(ret)) < size);
return buff.get();
}
diff --git a/src/console_reporter.cc b/src/console_reporter.cc
index 6db6788..a7cde4e 100644
--- a/src/console_reporter.cc
+++ b/src/console_reporter.cc
@@ -137,7 +137,7 @@
: IgnoreColorPrint;
auto name_color =
(result.report_big_o || result.report_rms) ? COLOR_BLUE : COLOR_GREEN;
- printer(Out, name_color, "%-*s ", name_field_width_,
+ printer(Out, name_color, "%-*s ", static_cast<int>(name_field_width_),
result.benchmark_name().c_str());
if (internal::SkippedWithError == result.skipped) {
@@ -196,8 +196,8 @@
}
}
if ((output_options_ & OO_Tabular) != 0) {
- printer(Out, COLOR_DEFAULT, " %*s%s", cNameLen - strlen(unit), s.c_str(),
- unit);
+ printer(Out, COLOR_DEFAULT, " %*s%s",
+ static_cast<int>(cNameLen - strlen(unit)), s.c_str(), unit);
} else {
printer(Out, COLOR_DEFAULT, " %s=%s%s", c.first.c_str(), s.c_str(), unit);
}
diff --git a/src/string_util.cc b/src/string_util.cc
index 9c5df3b..aa36cf9 100644
--- a/src/string_util.cc
+++ b/src/string_util.cc
@@ -142,7 +142,10 @@
auto buff_ptr = std::unique_ptr<char[]>(new char[size]);
// 2015-10-08: vsnprintf is used instead of snd::vsnprintf due to a limitation
// in the android-ndk
- vsnprintf(buff_ptr.get(), size, msg, args);
+ va_list args_cp2;
+ va_copy(args_cp2, args);
+ vsnprintf(buff_ptr.get(), size, msg, args_cp2);
+ va_end(args_cp2);
return std::string(buff_ptr.get());
}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 8a1a1a9..2917efa 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -184,10 +184,10 @@
benchmark_add_test(NAME templated_fixture_method_test COMMAND templated_fixture_method_test --benchmark_min_time=0.01s)
compile_output_test(user_counters_test)
-benchmark_add_test(NAME user_counters_test COMMAND user_counters_test --benchmark_min_time=0.01s)
+benchmark_add_test(NAME user_counters_test COMMAND user_counters_test --benchmark_min_time=0.2s)
compile_output_test(user_counters_threads_test)
-benchmark_add_test(NAME user_counters_threads_test COMMAND user_counters_threads_test --benchmark_min_time=0.01s)
+benchmark_add_test(NAME user_counters_threads_test COMMAND user_counters_threads_test --benchmark_min_time=0.2s)
compile_output_test(perf_counters_test)
benchmark_add_test(NAME perf_counters_test COMMAND perf_counters_test --benchmark_min_time=0.01s --benchmark_perf_counters=CYCLES,INSTRUCTIONS)
@@ -205,7 +205,7 @@
benchmark_add_test(NAME display_aggregates_only_test COMMAND display_aggregates_only_test --benchmark_min_time=0.01s)
compile_output_test(user_counters_tabular_test)
-benchmark_add_test(NAME user_counters_tabular_test COMMAND user_counters_tabular_test --benchmark_counters_tabular=true --benchmark_min_time=0.01s)
+benchmark_add_test(NAME user_counters_tabular_test COMMAND user_counters_tabular_test --benchmark_counters_tabular=true --benchmark_min_time=0.2s)
compile_output_test(user_counters_thousands_test)
benchmark_add_test(NAME user_counters_thousands_test COMMAND user_counters_thousands_test --benchmark_min_time=0.01s)