diff --git a/cfg/std.cfg b/cfg/std.cfg index 84cffb79828..fe43af1ec19 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -9009,6 +9009,16 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init + + + + + + + + + + diff --git a/lib/checkother.cpp b/lib/checkother.cpp index e1728788ecb..df842260906 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1513,6 +1513,8 @@ void CheckOther::commaSeparatedReturnError(const Token *tok) static bool isLargeContainer(const Variable* var, const Settings& settings) { const ValueType* vt = var->valueType(); + if (vt->container->startPattern == "std :: initializer_list <") + return false; if (vt->container->size_templateArgNo < 0) return true; const std::size_t maxByValueSize = 2 * settings.platform.sizeof_pointer; diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index 455dbf7df7c..8a9976a94ae 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -5307,3 +5307,15 @@ void containerOutOfBounds_std_string(std::string &var) { // #11403 // TODO cppcheck-suppress containerOutOfBounds var+= s5[3]; } + +int containerOutOfBounds_std_initializer_list_access(const std::vector& v) { + // cppcheck-suppress containerOutOfBounds + return v[2]; +} + +int containerOutOfBounds_std_initializer_list() { // #14340 + std::initializer_list x{ 1, 2 }; + // cppcheck-suppress derefInvalidIterator + int i = *x.end(); + return i + containerOutOfBounds_std_initializer_list_access(x); +} \ No newline at end of file