diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg index 1e20a335128..492cf592988 100644 --- a/cfg/gtk.cfg +++ b/cfg/gtk.cfg @@ -1506,6 +1506,7 @@ + false @@ -1679,6 +1680,7 @@ + false @@ -4039,6 +4041,7 @@ + false diff --git a/cfg/opengl.cfg b/cfg/opengl.cfg index 72dcaddb961..ec37abf5516 100644 --- a/cfg/opengl.cfg +++ b/cfg/opengl.cfg @@ -211,6 +211,7 @@ + false diff --git a/cfg/qt.cfg b/cfg/qt.cfg index 824c4bf2881..8d599ed5d3d 100644 --- a/cfg/qt.cfg +++ b/cfg/qt.cfg @@ -72,6 +72,7 @@ + false diff --git a/cfg/sqlite3.cfg b/cfg/sqlite3.cfg index 0b0a439b18c..6c1053b393f 100644 --- a/cfg/sqlite3.cfg +++ b/cfg/sqlite3.cfg @@ -966,6 +966,7 @@ + false @@ -988,6 +989,7 @@ + false diff --git a/cfg/std.cfg b/cfg/std.cfg index a736d1ede38..bcea6e88b28 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -4806,6 +4806,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun + false @@ -5119,6 +5120,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun + false @@ -5377,6 +5379,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun + false @@ -5620,6 +5623,7 @@ The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun + arg1 < 'A' || arg1 > 'Z' ? arg1 : arg1 + 32 false @@ -8129,6 +8133,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + false @@ -8171,6 +8176,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + false @@ -8217,6 +8223,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + false @@ -8667,6 +8674,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + false @@ -8815,6 +8823,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 0202ed7454a..3ed3ae12aa7 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -68,6 +68,11 @@ void CheckAssert::assertWithSideEffects() return ac.second.iteratorInfo.container > 0; // bailout, takes iterators -> assume read access })) continue; + if (tmp->str() == "get" && Token::simpleMatch(tmp->astParent(), ".") && astIsSmartPointer(tmp->astParent()->astOperand1())) + continue; + if (f->containerYield == Library::Container::Yield::START_ITERATOR || // bailout for std::begin/end + f->containerYield == Library::Container::Yield::END_ITERATOR) + continue; sideEffectInAssertError(tmp, mSettings->library.getFunctionName(tmp)); } continue; diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index 9ce1a976a68..b949f9db9bc 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -5022,3 +5022,22 @@ void assertWithSideEffect_system() // cppcheck-suppress [assertWithSideEffect,checkLibraryNoReturn] // TODO: #8329 assert(std::system("abc")); } + +void assertWithSideEffect_std_map_at(const std::map& m) // #12695 +{ + // cppcheck-suppress checkLibraryNoReturn + assert(m.at(0)); +} + +void assertWithSideEffect_std_unique_ptr_get(std::unique_ptr& p) +{ + // cppcheck-suppress checkLibraryNoReturn + assert(p.get()); +} + +void assertWithSideEffect_std_begin(const std::vector& v) { + // cppcheck-suppress checkLibraryFunction // TODO + assert(std::is_sorted(std::begin(v), std::end(v), [](const std::string& a, const std::string& b) { + return a.size() < b.size(); + })); // cppcheck-suppress checkLibraryNoReturn +}