🚧 fixed more warnings

pull/880/head
Niels Lohmann 2017-02-22 18:14:29 +01:00
parent 345a106d73
commit 8cec55a271
No known key found for this signature in database
GPG Key ID: 7F3CEA63AE251B69
10 changed files with 82 additions and 30 deletions

View File

@ -41,6 +41,28 @@ doctest:
$(MAKE) check_output -C doc $(MAKE) check_output -C doc
##########################################################################
# warning detector
##########################################################################
# calling Clang with all warnings, except:
# -Wno-documentation-unknown-command: code uses user-defined commands like @complexity
# -Wno-exit-time-destructors: warning in Catch code
# -Wno-keyword-macro: unit-tests use "#define private public"
# -Wno-deprecated-declarations: some functions are deprecated until 3.0.0
# -Wno-range-loop-analysis: iterator_wrapper tests tests "for(const auto i...)"
pedantic:
$(MAKE) json_unit CXXFLAGS="\
-std=c++11 \
-Werror \
-Weverything \
-Wno-documentation-unknown-command \
-Wno-exit-time-destructors \
-Wno-keyword-macro \
-Wno-deprecated-declarations \
-Wno-range-loop-analysis"
########################################################################## ##########################################################################
# fuzzing # fuzzing
########################################################################## ##########################################################################

View File

@ -673,7 +673,7 @@ template<typename BasicJsonType, typename UnscopedEnumType,
enable_if_t<is_unscoped_enum<UnscopedEnumType>::value, int> = 0> enable_if_t<is_unscoped_enum<UnscopedEnumType>::value, int> = 0>
void from_json(const BasicJsonType& j, UnscopedEnumType& e) void from_json(const BasicJsonType& j, UnscopedEnumType& e)
{ {
typename std::underlying_type<UnscopedEnumType>::type val = e; typename std::underlying_type<UnscopedEnumType>::type val;
get_arithmetic_value(j, val); get_arithmetic_value(j, val);
e = static_cast<UnscopedEnumType>(val); e = static_cast<UnscopedEnumType>(val);
} }
@ -917,7 +917,7 @@ struct adl_serializer
@ref basic_json class (either explicit or via conversion operators). @ref basic_json class (either explicit or via conversion operators).
@param[in] j JSON value to read from @param[in] j JSON value to read from
@param[in, out] val value to write to @param[in,out] val value to write to
*/ */
template<typename BasicJsonType, typename ValueType> template<typename BasicJsonType, typename ValueType>
static void from_json(BasicJsonType&& j, ValueType& val) noexcept( static void from_json(BasicJsonType&& j, ValueType& val) noexcept(
@ -932,7 +932,7 @@ struct adl_serializer
This function is usually called by the constructors of the @ref basic_json This function is usually called by the constructors of the @ref basic_json
class. class.
@param[in, out] j JSON value to write to @param[in,out] j JSON value to write to
@param[in] val value to read from @param[in] val value to read from
*/ */
template<typename BasicJsonType, typename ValueType> template<typename BasicJsonType, typename ValueType>
@ -6537,6 +6537,11 @@ class basic_json
/// @{ /// @{
private: private:
/*!
@note Some code in the switch cases has been copied, because otherwise
copilers would complain about implicit fallthrough and there is no
portable attribute to mute such warnings.
*/
template<typename T> template<typename T>
static void add_to_vector(std::vector<uint8_t>& vec, size_t bytes, const T number) static void add_to_vector(std::vector<uint8_t>& vec, size_t bytes, const T number)
{ {
@ -6550,20 +6555,27 @@ class basic_json
vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 060) & 0xff)); vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 060) & 0xff));
vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 050) & 0xff)); vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 050) & 0xff));
vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 040) & 0xff)); vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 040) & 0xff));
// intentional fall-through vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff));
vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff));
vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
vec.push_back(static_cast<uint8_t>(number & 0xff));
break;
} }
case 4: case 4:
{ {
vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff)); vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff));
vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff)); vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff));
// intentional fall-through vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
vec.push_back(static_cast<uint8_t>(number & 0xff));
break;
} }
case 2: case 2:
{ {
vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff)); vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
// intentional fall-through vec.push_back(static_cast<uint8_t>(number & 0xff));
break;
} }
case 1: case 1:
@ -7865,7 +7877,9 @@ class basic_json
} }
else else
{ {
val = mant == 0 ? INFINITY : NAN; val = mant == 0
? std::numeric_limits<double>::infinity()
: std::numeric_limits<double>::quiet_NaN();
} }
return (half & 0x8000) != 0 ? -val : val; return (half & 0x8000) != 0 ? -val : val;
} }
@ -11181,7 +11195,7 @@ basic_json_parser_74:
// of characters determined by the lexer (len) // of characters determined by the lexer (len)
const bool ok = (endptr == (data + len)); const bool ok = (endptr == (data + len));
if (ok and (value == 0.0) and (*data == '-')) if (ok and (value == static_cast<T>(0.0)) and (*data == '-'))
{ {
// some implementations forget to negate the zero // some implementations forget to negate the zero
value = -0.0; value = -0.0;

View File

@ -673,7 +673,7 @@ template<typename BasicJsonType, typename UnscopedEnumType,
enable_if_t<is_unscoped_enum<UnscopedEnumType>::value, int> = 0> enable_if_t<is_unscoped_enum<UnscopedEnumType>::value, int> = 0>
void from_json(const BasicJsonType& j, UnscopedEnumType& e) void from_json(const BasicJsonType& j, UnscopedEnumType& e)
{ {
typename std::underlying_type<UnscopedEnumType>::type val = e; typename std::underlying_type<UnscopedEnumType>::type val;
get_arithmetic_value(j, val); get_arithmetic_value(j, val);
e = static_cast<UnscopedEnumType>(val); e = static_cast<UnscopedEnumType>(val);
} }
@ -917,7 +917,7 @@ struct adl_serializer
@ref basic_json class (either explicit or via conversion operators). @ref basic_json class (either explicit or via conversion operators).
@param[in] j JSON value to read from @param[in] j JSON value to read from
@param[in, out] val value to write to @param[in,out] val value to write to
*/ */
template<typename BasicJsonType, typename ValueType> template<typename BasicJsonType, typename ValueType>
static void from_json(BasicJsonType&& j, ValueType& val) noexcept( static void from_json(BasicJsonType&& j, ValueType& val) noexcept(
@ -932,7 +932,7 @@ struct adl_serializer
This function is usually called by the constructors of the @ref basic_json This function is usually called by the constructors of the @ref basic_json
class. class.
@param[in, out] j JSON value to write to @param[in,out] j JSON value to write to
@param[in] val value to read from @param[in] val value to read from
*/ */
template<typename BasicJsonType, typename ValueType> template<typename BasicJsonType, typename ValueType>
@ -6537,6 +6537,11 @@ class basic_json
/// @{ /// @{
private: private:
/*!
@note Some code in the switch cases has been copied, because otherwise
copilers would complain about implicit fallthrough and there is no
portable attribute to mute such warnings.
*/
template<typename T> template<typename T>
static void add_to_vector(std::vector<uint8_t>& vec, size_t bytes, const T number) static void add_to_vector(std::vector<uint8_t>& vec, size_t bytes, const T number)
{ {
@ -6550,20 +6555,27 @@ class basic_json
vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 060) & 0xff)); vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 060) & 0xff));
vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 050) & 0xff)); vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 050) & 0xff));
vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 040) & 0xff)); vec.push_back(static_cast<uint8_t>((static_cast<uint64_t>(number) >> 040) & 0xff));
// intentional fall-through vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff));
vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff));
vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
vec.push_back(static_cast<uint8_t>(number & 0xff));
break;
} }
case 4: case 4:
{ {
vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff)); vec.push_back(static_cast<uint8_t>((number >> 030) & 0xff));
vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff)); vec.push_back(static_cast<uint8_t>((number >> 020) & 0xff));
// intentional fall-through vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
vec.push_back(static_cast<uint8_t>(number & 0xff));
break;
} }
case 2: case 2:
{ {
vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff)); vec.push_back(static_cast<uint8_t>((number >> 010) & 0xff));
// intentional fall-through vec.push_back(static_cast<uint8_t>(number & 0xff));
break;
} }
case 1: case 1:
@ -7865,7 +7877,9 @@ class basic_json
} }
else else
{ {
val = mant == 0 ? INFINITY : NAN; val = mant == 0
? std::numeric_limits<double>::infinity()
: std::numeric_limits<double>::quiet_NaN();
} }
return (half & 0x8000) != 0 ? -val : val; return (half & 0x8000) != 0 ? -val : val;
} }
@ -10215,7 +10229,7 @@ class basic_json
// of characters determined by the lexer (len) // of characters determined by the lexer (len)
const bool ok = (endptr == (data + len)); const bool ok = (endptr == (data + len));
if (ok and (value == 0.0) and (*data == '-')) if (ok and (value == static_cast<T>(0.0)) and (*data == '-'))
{ {
// some implementations forget to negate the zero // some implementations forget to negate the zero
value = -0.0; value = -0.0;

View File

@ -63,9 +63,9 @@ TEST_CASE("bad_alloc")
} }
} }
bool next_construct_fails = false; static bool next_construct_fails = false;
bool next_destroy_fails = false; static bool next_destroy_fails = false;
bool next_deallocate_fails = false; static bool next_deallocate_fails = false;
template<class T> template<class T>
struct my_allocator : std::allocator<T> struct my_allocator : std::allocator<T>

View File

@ -237,7 +237,7 @@ TEST_CASE("CBOR")
const auto result = json::to_cbor(j); const auto result = json::to_cbor(j);
CHECK(result == expected); CHECK(result == expected);
int16_t restored = -1 - ((result[1] << 8) + result[2]); int16_t restored = static_cast<int16_t>(-1 - ((result[1] << 8) + result[2]));
CHECK(restored == -9263); CHECK(restored == -9263);
// roundtrip // roundtrip

View File

@ -725,7 +725,7 @@ TEST_CASE("constructors")
SECTION("long double") SECTION("long double")
{ {
long double n = 42.23; long double n = 42.23l;
json j(n); json j(n);
CHECK(j.type() == json::value_t::number_float); CHECK(j.type() == json::value_t::number_float);
CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float)); CHECK(j.m_value.number_float == Approx(j_reference.m_value.number_float));

View File

@ -342,7 +342,7 @@ TEST_CASE("MessagePack")
const auto result = json::to_msgpack(j); const auto result = json::to_msgpack(j);
CHECK(result == expected); CHECK(result == expected);
int16_t restored = (result[1] << 8) + result[2]; int16_t restored = static_cast<int16_t>((result[1] << 8) + result[2]);
CHECK(restored == -9263); CHECK(restored == -9263);
// roundtrip // roundtrip
@ -374,7 +374,7 @@ TEST_CASE("MessagePack")
// check individual bytes // check individual bytes
CHECK(result[0] == 0xd1); CHECK(result[0] == 0xd1);
int16_t restored = (result[1] << 8) + result[2]; int16_t restored = static_cast<int16_t>((result[1] << 8) + result[2]);
CHECK(restored == i); CHECK(restored == i);
// roundtrip // roundtrip

View File

@ -163,7 +163,7 @@ TEST_CASE("README", "[hide]")
j.clear(); // the array is empty again j.clear(); // the array is empty again
// comparison // comparison
j == "[\"foo\", 1, true]"_json; // true bool x = (j == "[\"foo\", 1, true]"_json); // true
// create an object // create an object
json o; json o;

View File

@ -350,8 +350,8 @@ TEST_CASE("regression tests")
// double // double
nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, double> j_double = nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, double> j_double =
1.23e35f; 1.23e35;
CHECK(j_double.get<double>() == 1.23e35f); CHECK(j_double.get<double>() == 1.23e35);
// long double // long double
nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, long double> nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, long double>
@ -641,7 +641,7 @@ TEST_CASE("regression tests")
CHECK_THROWS_AS(json::from_msgpack(vec1), std::out_of_range); CHECK_THROWS_AS(json::from_msgpack(vec1), std::out_of_range);
// more test cases for MessagePack // more test cases for MessagePack
for (uint8_t b : for (auto b :
{ {
0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // fixmap 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // fixmap
0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, // fixarray 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, // fixarray
@ -649,12 +649,12 @@ TEST_CASE("regression tests")
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf
}) })
{ {
std::vector<uint8_t> vec(1, b); std::vector<uint8_t> vec(1, static_cast<uint8_t>(b));
CHECK_THROWS_AS(json::from_msgpack(vec), std::out_of_range); CHECK_THROWS_AS(json::from_msgpack(vec), std::out_of_range);
} }
// more test cases for CBOR // more test cases for CBOR
for (uint8_t b : for (auto b :
{ {
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, // UTF-8 string 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, // UTF-8 string
@ -664,7 +664,7 @@ TEST_CASE("regression tests")
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7 // map 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7 // map
}) })
{ {
std::vector<uint8_t> vec(1, b); std::vector<uint8_t> vec(1, static_cast<uint8_t>(b));
CHECK_THROWS_AS(json::from_cbor(vec), std::out_of_range); CHECK_THROWS_AS(json::from_cbor(vec), std::out_of_range);
} }

View File

@ -816,6 +816,8 @@ TEST_CASE("nst's JSONTestSuite")
} }
} }
std::string trim(const std::string& str);
// from http://stackoverflow.com/a/25829178/266378 // from http://stackoverflow.com/a/25829178/266378
std::string trim(const std::string& str) std::string trim(const std::string& str)
{ {