diff --git a/cfg/gtk.cfg b/cfg/gtk.cfg
index 4dd9700c62c..9b89a069903 100644
--- a/cfg/gtk.cfg
+++ b/cfg/gtk.cfg
@@ -8761,7 +8761,7 @@
false
-
+
diff --git a/cfg/std.cfg b/cfg/std.cfg
index 70e9cc17746..e7dff21da96 100644
--- a/cfg/std.cfg
+++ b/cfg/std.cfg
@@ -8751,7 +8751,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
false
-
+
@@ -8759,7 +8759,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
false
-
+
diff --git a/lib/astutils.cpp b/lib/astutils.cpp
index f16144310ac..bed7eca56b2 100644
--- a/lib/astutils.cpp
+++ b/lib/astutils.cpp
@@ -3471,6 +3471,9 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings
const bool isuninitbad = settings.library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect);
if (isuninitbad && (!addressOf || isnullbad))
return ExprUsage::Used;
+ const Library::ArgumentChecks::Direction argDirection = settings.library.getArgDirection(ftok, argnr + 1, indirect);
+ if (argDirection == Library::ArgumentChecks::Direction::DIR_IN)
+ return ExprUsage::Used;
}
return ExprUsage::Inconclusive;
}
diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp
index 76c49b2c833..1b84b3b1219 100644
--- a/lib/symboldatabase.cpp
+++ b/lib/symboldatabase.cpp
@@ -8035,10 +8035,13 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
}
}
//Is iterator fetching function called?
- } else if (Token::simpleMatch(tok->astOperand1(), "::") &&
- tok->astOperand2() &&
- tok->astOperand2()->isVariable()) {
- const auto* const paramVariable = tok->astOperand2()->variable();
+ } else if (Token::simpleMatch(tok->astOperand1(), "::") && Token::Match(tok->astOperand2(), "%var%|.|[")) {
+ const Token* varTok = tok->astOperand2();
+ while (Token::simpleMatch(varTok, "["))
+ varTok = varTok->astOperand1();
+ if (Token::simpleMatch(varTok, "."))
+ varTok = varTok->astOperand2();
+ const auto* const paramVariable = varTok->variable();
if (!paramVariable ||
!paramVariable->valueType() ||
!paramVariable->valueType()->container) {
diff --git a/test/cfg/posix.c b/test/cfg/posix.c
index 2e53d171dec..52607fe3a98 100644
--- a/test/cfg/posix.c
+++ b/test/cfg/posix.c
@@ -1312,7 +1312,7 @@ void uninitvar(int fd)
pthread_mutex_t mutex, mutex1, mutex2, mutex3;
// cppcheck-suppress uninitvar
write(x1,"ab",2);
- // TODO cppcheck-suppress uninitvar
+ // cppcheck-suppress uninitvar
write(fd,buf,2); // #6325
// cppcheck-suppress uninitvar
write(fd,"ab",x2);
@@ -1408,7 +1408,7 @@ void timet_h(const struct timespec* ptp1)
clock_settime(clk_id2, ptp1);
struct timespec tp;
- // FIXME cppcheck-suppress uninitvar
+ // cppcheck-suppress uninitvar
clock_settime(CLOCK_REALTIME, &tp); // #6577 - false negative
// cppcheck-suppress uninitvar
clock_settime(clk_id3, &tp);
diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp
index 7e406ca2187..1224c6b57ac 100644
--- a/test/cfg/std.cpp
+++ b/test/cfg/std.cpp
@@ -5003,7 +5003,7 @@ void beginEnd()
//cppcheck-suppress ignoredReturnValue
std::crend(v);
- // cppcheck-suppress constVariable
+ // TODO cppcheck-suppress constVariable
int arr[4];
//cppcheck-suppress ignoredReturnValue
@@ -5025,6 +5025,39 @@ void beginEnd()
std::crend(arr);
}
+struct S_constParameter_std_begin { // #11617
+ int a[2];
+};
+
+struct T_constParameter_std_begin {
+ std::vector v;
+};
+
+struct U_constParameter_std_begin {
+ std::vector v[1][1];
+};
+
+void f(S_constParameter_std_begin& s) {
+ std::for_each(std::begin(s.a), std::end(s.a), [](int& i) { ++i; });
+}
+
+void f(T_constParameter_std_begin& t) {
+ std::for_each(std::begin(t.v), std::end(t.v), [](int& i) { ++i; });
+}
+
+void f(U_constParameter_std_begin& u) {
+ std::for_each(std::begin(u.v[0][0]), std::end(u.v[0][0]), [](int& i) { ++i; });
+}
+
+void g_constVariable_std_begin(int* p) { *p = 0; }
+
+int f_constVariable_std_begin() {
+ int arr[1];
+ g_constVariable_std_begin(std::begin(arr));
+ *std::begin(arr) = 1;
+ return arr[0];
+}
+
void smartPtr_get()
{
std::unique_ptr p;
diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp
index 05dd0ab9b8f..8348e0cd44b 100644
--- a/test/testsymboldatabase.cpp
+++ b/test/testsymboldatabase.cpp
@@ -9969,6 +9969,18 @@ class TestSymbolDatabase : public TestFixture {
ASSERT(tok && tok->valueType());
ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str());
}
+ {
+ GET_SYMBOL_DB("struct S { std::vector v[1][1]; };\n"
+ "void f(S& s) {\n"
+ " auto it = std::begin(s.v[0][0]);\n"
+ "}\n");
+ ASSERT_EQUALS("", errout_str());
+
+ const Token* tok = tokenizer.tokens();
+ tok = Token::findsimplematch(tok, "auto");
+ ASSERT(tok && tok->valueType());
+ ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str());
+ }
{
GET_SYMBOL_DB("void f(std::vector::iterator beg, std::vector::iterator end) {\n"
" auto it = std::find(beg, end, 0);\n"