diff --git a/.gitignore b/.gitignore index 8157f1a9..35dc9b42 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ fuzz-testing build build_coverage +clang_analyze_build doc/xml doc/html diff --git a/Makefile b/Makefile index ee9a64f1..ed0a7a5c 100644 --- a/Makefile +++ b/Makefile @@ -259,6 +259,12 @@ fuzzing-stop: cppcheck: cppcheck --enable=warning --inconclusive --force --std=c++11 $(AMALGAMATED_FILE) --error-exitcode=1 +# compile and check with Clang Static Analyzer +clang_analyze: + rm -fr clang_analyze_build + mkdir clang_analyze_build + cd clang_analyze_build ; CCC_CXX=/Users/niels/Documents/projects/llvm-clang/local/bin/clang++ /Users/niels/Documents/projects/llvm-clang/local/bin/scan-build cmake .. + /Users/niels/Documents/projects/llvm-clang/local/bin/scan-build -enable-checker alpha.core.DynamicTypeChecker,alpha.core.PointerArithm,alpha.core.PointerSub,alpha.cplusplus.DeleteWithNonVirtualDtor,alpha.cplusplus.IteratorRange,alpha.cplusplus.MisusedMovedObject,alpha.security.ArrayBoundV2,alpha.core.Conversion --use-c++=/Users/niels/Documents/projects/llvm-clang/local/bin/clang++ --view -analyze-headers -o clang_analyze_build/report.html make -j10 -C clang_analyze_build ########################################################################## # maintainer targets diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index f1b7e5dd..49cce53d 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -5180,7 +5180,7 @@ class basic_json // passed iterators must belong to objects if (JSON_UNLIKELY(not first.m_object->is_object() - or not first.m_object->is_object())) + or not last.m_object->is_object())) { JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects")); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 92123591..656afa10 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -15091,7 +15091,7 @@ class basic_json // passed iterators must belong to objects if (JSON_UNLIKELY(not first.m_object->is_object() - or not first.m_object->is_object())) + or not last.m_object->is_object())) { JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects")); } diff --git a/test/src/unit-readme.cpp b/test/src/unit-readme.cpp index bdcbd73e..45d43879 100644 --- a/test/src/unit-readme.cpp +++ b/test/src/unit-readme.cpp @@ -152,6 +152,10 @@ TEST_CASE("README", "[hide]") j.push_back(1); j.push_back(true); + // comparison + bool x = (j == "[\"foo\", 1, true]"_json); // true + CHECK(x == true); + // iterate the array for (json::iterator it = j.begin(); it != j.end(); ++it) { @@ -168,6 +172,7 @@ TEST_CASE("README", "[hide]") const std::string tmp = j[0]; j[1] = 42; bool foo = j.at(2); + CHECK(foo == true); // other stuff j.size(); // 3 entries @@ -175,9 +180,6 @@ TEST_CASE("README", "[hide]") j.type(); // json::value_t::array j.clear(); // the array is empty again - // comparison - bool x = (j == "[\"foo\", 1, true]"_json); // true - // create an object json o; o["foo"] = 23; @@ -257,17 +259,21 @@ TEST_CASE("README", "[hide]") bool b1 = true; json jb = b1; bool b2 = jb; + CHECK(b2 == true); // numbers int i = 42; json jn = i; double f = jn; + CHECK(f == 42); // etc. std::string vs = js.get(); bool vb = jb.get(); + CHECK(vb == true); int vi = jn.get(); + CHECK(vi == 42); // etc. }