🚨 fix warnings

This commit is contained in:
Niels Lohmann 2021-01-29 20:15:41 +01:00
parent 52aa607c87
commit 37b8071123
No known key found for this signature in database
GPG Key ID: 7F3CEA63AE251B69
14 changed files with 121 additions and 39 deletions

View File

@ -200,7 +200,7 @@ boundaries compute_boundaries(FloatType value)
using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type; using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
const std::uint64_t bits = reinterpret_bits<bits_type>(value); const auto bits = static_cast<std::uint64_t>(reinterpret_bits<bits_type>(value));
const std::uint64_t E = bits >> (kPrecision - 1); const std::uint64_t E = bits >> (kPrecision - 1);
const std::uint64_t F = bits & (kHiddenBit - 1); const std::uint64_t F = bits & (kHiddenBit - 1);

View File

@ -1854,7 +1854,7 @@ class binary_reader
{ {
return false; return false;
} }
result = static_cast<std::size_t>(number); result = static_cast<std::size_t>(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char
return true; return true;
} }

View File

@ -437,7 +437,7 @@ contiguous_bytes_input_adapter input_adapter(CharT b)
} }
template<typename T, std::size_t N> template<typename T, std::size_t N>
auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
{ {
return input_adapter(array, array + N); return input_adapter(array, array + N);
} }

View File

@ -126,6 +126,11 @@ struct json_sax
const std::string& last_token, const std::string& last_token,
const detail::exception& ex) = 0; const detail::exception& ex) = 0;
json_sax() = default;
json_sax(const json_sax&) = default;
json_sax(json_sax&&) noexcept = default;
json_sax& operator=(const json_sax&) = default;
json_sax& operator=(json_sax&&) noexcept = default;
virtual ~json_sax() = default; virtual ~json_sax() = default;
}; };

View File

@ -1236,7 +1236,7 @@ scan_number_done:
// we are done scanning a number) // we are done scanning a number)
unget(); unget();
char* endptr = nullptr; char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
errno = 0; errno = 0;
// try to parse integers first and fall back to floats // try to parse integers first and fall back to floats

View File

@ -75,8 +75,10 @@ class iter_impl
typename BasicJsonType::const_reference, typename BasicJsonType::const_reference,
typename BasicJsonType::reference>::type; typename BasicJsonType::reference>::type;
/// default constructor
iter_impl() = default; iter_impl() = default;
~iter_impl() = default;
iter_impl(iter_impl&&) noexcept = default;
iter_impl& operator=(iter_impl&&) noexcept = default;
/*! /*!
@brief constructor for a given JSON instance @brief constructor for a given JSON instance

View File

@ -20,6 +20,12 @@ template<typename CharType> struct output_adapter_protocol
virtual void write_character(CharType c) = 0; virtual void write_character(CharType c) = 0;
virtual void write_characters(const CharType* s, std::size_t length) = 0; virtual void write_characters(const CharType* s, std::size_t length) = 0;
virtual ~output_adapter_protocol() = default; virtual ~output_adapter_protocol() = default;
output_adapter_protocol() = default;
output_adapter_protocol(const output_adapter_protocol&) = default;
output_adapter_protocol(output_adapter_protocol&&) noexcept = default;
output_adapter_protocol& operator=(const output_adapter_protocol&) = default;
output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default;
}; };
/// a type to simplify interfaces /// a type to simplify interfaces

View File

@ -5244,7 +5244,7 @@ contiguous_bytes_input_adapter input_adapter(CharT b)
} }
template<typename T, std::size_t N> template<typename T, std::size_t N>
auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
{ {
return input_adapter(array, array + N); return input_adapter(array, array + N);
} }
@ -5413,6 +5413,11 @@ struct json_sax
const std::string& last_token, const std::string& last_token,
const detail::exception& ex) = 0; const detail::exception& ex) = 0;
json_sax() = default;
json_sax(const json_sax&) = default;
json_sax(json_sax&&) noexcept = default;
json_sax& operator=(const json_sax&) = default;
json_sax& operator=(json_sax&&) noexcept = default;
virtual ~json_sax() = default; virtual ~json_sax() = default;
}; };
@ -7223,7 +7228,7 @@ scan_number_done:
// we are done scanning a number) // we are done scanning a number)
unget(); unget();
char* endptr = nullptr; char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
errno = 0; errno = 0;
// try to parse integers first and fall back to floats // try to parse integers first and fall back to floats
@ -9600,7 +9605,7 @@ class binary_reader
{ {
return false; return false;
} }
result = static_cast<std::size_t>(number); result = static_cast<std::size_t>(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char
return true; return true;
} }
@ -10958,8 +10963,10 @@ class iter_impl
typename BasicJsonType::const_reference, typename BasicJsonType::const_reference,
typename BasicJsonType::reference>::type; typename BasicJsonType::reference>::type;
/// default constructor
iter_impl() = default; iter_impl() = default;
~iter_impl() = default;
iter_impl(iter_impl&&) noexcept = default;
iter_impl& operator=(iter_impl&&) noexcept = default;
/*! /*!
@brief constructor for a given JSON instance @brief constructor for a given JSON instance
@ -12752,6 +12759,12 @@ template<typename CharType> struct output_adapter_protocol
virtual void write_character(CharType c) = 0; virtual void write_character(CharType c) = 0;
virtual void write_characters(const CharType* s, std::size_t length) = 0; virtual void write_characters(const CharType* s, std::size_t length) = 0;
virtual ~output_adapter_protocol() = default; virtual ~output_adapter_protocol() = default;
output_adapter_protocol() = default;
output_adapter_protocol(const output_adapter_protocol&) = default;
output_adapter_protocol(output_adapter_protocol&&) noexcept = default;
output_adapter_protocol& operator=(const output_adapter_protocol&) = default;
output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default;
}; };
/// a type to simplify interfaces /// a type to simplify interfaces
@ -14657,7 +14670,7 @@ boundaries compute_boundaries(FloatType value)
using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type; using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
const std::uint64_t bits = reinterpret_bits<bits_type>(value); const auto bits = static_cast<std::uint64_t>(reinterpret_bits<bits_type>(value));
const std::uint64_t E = bits >> (kPrecision - 1); const std::uint64_t E = bits >> (kPrecision - 1);
const std::uint64_t F = bits & (kHiddenBit - 1); const std::uint64_t F = bits & (kHiddenBit - 1);

View File

@ -188,20 +188,20 @@ TEST_CASE("other constructors and destructor")
{ {
SECTION("object") SECTION("object")
{ {
auto* j = new json {{"foo", 1}, {"bar", false}}; auto* j = new json {{"foo", 1}, {"bar", false}}; // NOLINT(cppcoreguidelines-owning-memory)
delete j; delete j; // NOLINT(cppcoreguidelines-owning-memory)
} }
SECTION("array") SECTION("array")
{ {
auto* j = new json {"foo", 1, 1u, false, 23.42}; auto* j = new json {"foo", 1, 1u, false, 23.42}; // NOLINT(cppcoreguidelines-owning-memory)
delete j; delete j; // NOLINT(cppcoreguidelines-owning-memory)
} }
SECTION("string") SECTION("string")
{ {
auto* j = new json("Hello world"); auto* j = new json("Hello world"); // NOLINT(cppcoreguidelines-owning-memory)
delete j; delete j; // NOLINT(cppcoreguidelines-owning-memory)
} }
} }
} }

View File

@ -1639,6 +1639,7 @@ TEST_CASE("value conversion")
enum class cards {kreuz, pik, herz, karo}; enum class cards {kreuz, pik, herz, karo};
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) - false positive
NLOHMANN_JSON_SERIALIZE_ENUM(cards, NLOHMANN_JSON_SERIALIZE_ENUM(cards,
{ {
{cards::kreuz, "kreuz"}, {cards::kreuz, "kreuz"},
@ -1656,6 +1657,7 @@ enum TaskState
TS_INVALID = -1, TS_INVALID = -1,
}; };
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) - false positive
NLOHMANN_JSON_SERIALIZE_ENUM(TaskState, NLOHMANN_JSON_SERIALIZE_ENUM(TaskState,
{ {
{TS_INVALID, nullptr}, {TS_INVALID, nullptr},

View File

@ -412,7 +412,7 @@ TEST_CASE("deserialization")
SECTION("from chars") SECTION("from chars")
{ {
auto* v = new uint8_t[5]; auto* v = new uint8_t[5]; // NOLINT(cppcoreguidelines-owning-memory)
v[0] = 't'; v[0] = 't';
v[1] = 'r'; v[1] = 'r';
v[2] = 'u'; v[2] = 'u';
@ -426,7 +426,7 @@ TEST_CASE("deserialization")
CHECK(l.events.size() == 1); CHECK(l.events.size() == 1);
CHECK(l.events == std::vector<std::string>({"boolean(true)"})); CHECK(l.events == std::vector<std::string>({"boolean(true)"}));
delete[] v; delete[] v; // NOLINT(cppcoreguidelines-owning-memory)
} }
SECTION("from std::string") SECTION("from std::string")

View File

@ -422,7 +422,7 @@ TEST_CASE("regression tests 1")
// Non-const access with key as "char *" // Non-const access with key as "char *"
char _ptr_key[] = "Key3"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) char _ptr_key[] = "Key3"; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
char* ptr_key = &_ptr_key[0]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) char* ptr_key = &_ptr_key[0]; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
CHECK_NOTHROW(j[ptr_key] = 3); CHECK_NOTHROW(j[ptr_key] = 3);
CHECK(j[ptr_key] == json(3)); CHECK(j[ptr_key] == json(3));
@ -735,7 +735,7 @@ TEST_CASE("regression tests 1")
check_roundtrip(83623297654460.33); check_roundtrip(83623297654460.33);
check_roundtrip(701466573254773.6); check_roundtrip(701466573254773.6);
check_roundtrip(1369013370304513); check_roundtrip(1369013370304513);
check_roundtrip(96963648023094720); check_roundtrip(96963648023094720); // NOLINT(bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions)
check_roundtrip(3.478237409280108e+17); check_roundtrip(3.478237409280108e+17);
} }

View File

@ -376,7 +376,7 @@ struct adl_serializer<std::shared_ptr<T>>
} }
else else
{ {
opt.reset(new T(j.get<T>())); opt.reset(new T(j.get<T>())); // NOLINT(cppcoreguidelines-owning-memory)
} }
} }
}; };
@ -407,7 +407,7 @@ TEST_CASE("adl_serializer specialization" * doctest::test_suite("udt"))
json j = optPerson; json j = optPerson;
CHECK(j.is_null()); CHECK(j.is_null());
optPerson.reset(new udt::person{{42}, {"John Doe"}, udt::country::russia}); optPerson.reset(new udt::person{{42}, {"John Doe"}, udt::country::russia}); // NOLINT(cppcoreguidelines-owning-memory)
j = optPerson; j = optPerson;
CHECK_FALSE(j.is_null()); CHECK_FALSE(j.is_null());
@ -520,7 +520,7 @@ TEST_CASE("Non-copyable types" * doctest::test_suite("udt"))
json j = optPerson; json j = optPerson;
CHECK(j.is_null()); CHECK(j.is_null());
optPerson.reset(new udt::person{{42}, {"John Doe"}, udt::country::russia}); optPerson.reset(new udt::person{{42}, {"John Doe"}, udt::country::russia}); // NOLINT(cppcoreguidelines-owning-memory,modernize-make-unique)
j = optPerson; j = optPerson;
CHECK_FALSE(j.is_null()); CHECK_FALSE(j.is_null());

View File

@ -48,8 +48,8 @@
#define DOCTEST_VERSION_MAJOR 2 #define DOCTEST_VERSION_MAJOR 2
#define DOCTEST_VERSION_MINOR 4 #define DOCTEST_VERSION_MINOR 4
#define DOCTEST_VERSION_PATCH 3 #define DOCTEST_VERSION_PATCH 4
#define DOCTEST_VERSION_STR "2.4.3" #define DOCTEST_VERSION_STR "2.4.4"
#define DOCTEST_VERSION \ #define DOCTEST_VERSION \
(DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH) (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
@ -3718,6 +3718,7 @@ namespace detail {
} }
bool TestCase::operator<(const TestCase& other) const { bool TestCase::operator<(const TestCase& other) const {
// this will be used only to differentiate between test cases - not relevant for sorting
if(m_line != other.m_line) if(m_line != other.m_line)
return m_line < other.m_line; return m_line < other.m_line;
const int file_cmp = m_file.compare(other.m_file); const int file_cmp = m_file.compare(other.m_file);
@ -4043,15 +4044,29 @@ namespace {
struct FatalConditionHandler struct FatalConditionHandler
{ {
static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) { static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) {
for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) { // Multiple threads may enter this filter/handler at once. We want the error message to be printed on the
if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { // console just once no matter how many threads have crashed.
reportFatal(signalDefs[i].name); static std::mutex mutex;
break; static bool execute = true;
{
std::lock_guard<std::mutex> lock(mutex);
if(execute) {
bool reported = false;
for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
reportFatal(signalDefs[i].name);
reported = true;
break;
}
}
if(reported == false)
reportFatal("Unhandled SEH exception caught");
if(isDebuggerActive() && !g_cs->no_breaks)
DOCTEST_BREAK_INTO_DEBUGGER();
} }
execute = false;
} }
// If its not an exception we care about, pass it along. std::exit(EXIT_FAILURE);
// This stops us from eating debugger breaks etc.
return EXCEPTION_CONTINUE_SEARCH;
} }
FatalConditionHandler() { FatalConditionHandler() {
@ -4073,6 +4088,8 @@ namespace {
original_terminate_handler = std::get_terminate(); original_terminate_handler = std::get_terminate();
std::set_terminate([]() noexcept { std::set_terminate([]() noexcept {
reportFatal("Terminate handler called"); reportFatal("Terminate handler called");
if(isDebuggerActive() && !g_cs->no_breaks)
DOCTEST_BREAK_INTO_DEBUGGER();
std::exit(EXIT_FAILURE); // explicitly exit - otherwise the SIGABRT handler may be called as well std::exit(EXIT_FAILURE); // explicitly exit - otherwise the SIGABRT handler may be called as well
}); });
@ -4083,8 +4100,29 @@ namespace {
prev_sigabrt_handler = std::signal(SIGABRT, [](int signal) noexcept { prev_sigabrt_handler = std::signal(SIGABRT, [](int signal) noexcept {
if(signal == SIGABRT) { if(signal == SIGABRT) {
reportFatal("SIGABRT - Abort (abnormal termination) signal"); reportFatal("SIGABRT - Abort (abnormal termination) signal");
if(isDebuggerActive() && !g_cs->no_breaks)
DOCTEST_BREAK_INTO_DEBUGGER();
std::exit(EXIT_FAILURE);
} }
}); });
// The following settings are taken from google test, and more
// specifically from UnitTest::Run() inside of gtest.cc
// the user does not want to see pop-up dialogs about crashes
prev_error_mode_1 = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
// This forces the abort message to go to stderr in all circumstances.
prev_error_mode_2 = _set_error_mode(_OUT_TO_STDERR);
// In the debug version, Visual Studio pops up a separate dialog
// offering a choice to debug the aborted program - we want to disable that.
prev_abort_behavior = _set_abort_behavior(0x0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
// In debug mode, the Windows CRT can crash with an assertion over invalid
// input (e.g. passing an invalid file descriptor). The default handling
// for these assertions is to pop up a dialog and wait for user input.
// Instead ask the CRT to dump such assertions to stderr non-interactively.
prev_report_mode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
prev_report_file = _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
} }
static void reset() { static void reset() {
@ -4092,16 +4130,25 @@ namespace {
// Unregister handler and restore the old guarantee // Unregister handler and restore the old guarantee
SetUnhandledExceptionFilter(previousTop); SetUnhandledExceptionFilter(previousTop);
SetThreadStackGuarantee(&guaranteeSize); SetThreadStackGuarantee(&guaranteeSize);
previousTop = nullptr;
isSet = false;
std::set_terminate(original_terminate_handler); std::set_terminate(original_terminate_handler);
std::signal(SIGABRT, prev_sigabrt_handler); std::signal(SIGABRT, prev_sigabrt_handler);
SetErrorMode(prev_error_mode_1);
_set_error_mode(prev_error_mode_2);
_set_abort_behavior(prev_abort_behavior, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
_CrtSetReportMode(_CRT_ASSERT, prev_report_mode);
_CrtSetReportFile(_CRT_ASSERT, prev_report_file);
isSet = false;
} }
} }
~FatalConditionHandler() { reset(); } ~FatalConditionHandler() { reset(); }
private: private:
static UINT prev_error_mode_1;
static int prev_error_mode_2;
static unsigned int prev_abort_behavior;
static int prev_report_mode;
static _HFILE prev_report_file;
static void (*prev_sigabrt_handler)(int); static void (*prev_sigabrt_handler)(int);
static std::terminate_handler original_terminate_handler; static std::terminate_handler original_terminate_handler;
static bool isSet; static bool isSet;
@ -4109,6 +4156,11 @@ namespace {
static LPTOP_LEVEL_EXCEPTION_FILTER previousTop; static LPTOP_LEVEL_EXCEPTION_FILTER previousTop;
}; };
UINT FatalConditionHandler::prev_error_mode_1;
int FatalConditionHandler::prev_error_mode_2;
unsigned int FatalConditionHandler::prev_abort_behavior;
int FatalConditionHandler::prev_report_mode;
_HFILE FatalConditionHandler::prev_report_file;
void (*FatalConditionHandler::prev_sigabrt_handler)(int); void (*FatalConditionHandler::prev_sigabrt_handler)(int);
std::terminate_handler FatalConditionHandler::original_terminate_handler; std::terminate_handler FatalConditionHandler::original_terminate_handler;
bool FatalConditionHandler::isSet = false; bool FatalConditionHandler::isSet = false;
@ -5046,7 +5098,6 @@ namespace {
struct JUnitTestCaseData struct JUnitTestCaseData
{ {
DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations") // gmtime
static std::string getCurrentTimestamp() { static std::string getCurrentTimestamp() {
// Beware, this is not reentrant because of backward compatibility issues // Beware, this is not reentrant because of backward compatibility issues
// Also, UTC only, again because of backward compatibility (%z is C++11) // Also, UTC only, again because of backward compatibility (%z is C++11)
@ -5054,16 +5105,19 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations") // gmtime
std::time(&rawtime); std::time(&rawtime);
auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
std::tm* timeInfo; std::tm timeInfo;
timeInfo = std::gmtime(&rawtime); #ifdef DOCTEST_PLATFORM_WINDOWS
gmtime_s(&timeInfo, &rawtime);
#else // DOCTEST_PLATFORM_WINDOWS
gmtime_r(&rawtime, &timeInfo);
#endif // DOCTEST_PLATFORM_WINDOWS
char timeStamp[timeStampSize]; char timeStamp[timeStampSize];
const char* const fmt = "%Y-%m-%dT%H:%M:%SZ"; const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";
std::strftime(timeStamp, timeStampSize, fmt, timeInfo); std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
return std::string(timeStamp); return std::string(timeStamp);
} }
DOCTEST_CLANG_SUPPRESS_WARNING_POP
struct JUnitTestMessage struct JUnitTestMessage
{ {