diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h b/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_flag_parser.h @@ -99,6 +99,15 @@ return ok; } +template <> +inline bool FlagHandler::Parse(const char *value) { + const char *value_end; + *t_ = internal_simple_strtoll(value, &value_end, 10); + bool ok = *value_end == 0; + if (!ok) Printf("ERROR: Invalid value for s64 option: '%s'\n", value); + return ok; +} + class FlagParser { static const int kMaxFlags = 200; struct Flag { diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc b/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_flags_test.cc @@ -16,6 +16,7 @@ #include "sanitizer_common/sanitizer_allocator_internal.h" #include "gtest/gtest.h" +#include #include namespace __sanitizer { @@ -110,6 +111,21 @@ "Invalid value for int option"); } +TEST(SanitizerCommon, LongLongIntFlags) { + s64 InitValue = -5; + s64 IntMin = INT64_MIN; + s64 IntMax = INT64_MAX; + TestFlag(InitValue, "flag_name=0", 0ll); + TestFlag(InitValue, "flag_name=42", 42ll); + TestFlag(InitValue, "flag_name=-42", -42ll); + + TestFlag(InitValue, "flag_name=-9223372036854775808", IntMin); + TestFlag(InitValue, "flag_name=9223372036854775807", IntMax); + + TestFlag(InitValue, "flag_name=-92233720368547758080000", IntMin); + TestFlag(InitValue, "flag_name=92233720368547758070000", IntMax); +} + TEST(SanitizerCommon, StrFlags) { TestFlag("zzz", 0, "zzz"); TestFlag("zzz", "flag_name=", "");