Skip to content

Commit 4f8a48d

Browse files
Fix #11617 FP constParameter with std::begin/end (#8427)
Co-authored-by: chrchr-github <noreply@github.com>
1 parent 975a52d commit 4f8a48d

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

lib/symboldatabase.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8035,10 +8035,13 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
80358035
}
80368036
}
80378037
//Is iterator fetching function called?
8038-
} else if (Token::simpleMatch(tok->astOperand1(), "::") &&
8039-
tok->astOperand2() &&
8040-
tok->astOperand2()->isVariable()) {
8041-
const auto* const paramVariable = tok->astOperand2()->variable();
8038+
} else if (Token::simpleMatch(tok->astOperand1(), "::") && Token::Match(tok->astOperand2(), "%var%|.|[")) {
8039+
const Token* varTok = tok->astOperand2();
8040+
while (Token::simpleMatch(varTok, "["))
8041+
varTok = varTok->astOperand1();
8042+
while (Token::simpleMatch(varTok, "."))
8043+
varTok = varTok->astOperand2();
8044+
const Variable* const paramVariable = varTok ? varTok->variable() : nullptr;
80428045
if (!paramVariable ||
80438046
!paramVariable->valueType() ||
80448047
!paramVariable->valueType()->container) {

test/cfg/std.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5032,15 +5032,22 @@ struct T_constParameter_std_begin {
50325032
std::vector<int> v;
50335033
};
50345034

5035+
struct U_constParameter_std_begin {
5036+
std::vector<int> v[1][1];
5037+
};
5038+
50355039
void f(S_constParameter_std_begin& s) {
50365040
std::for_each(std::begin(s.a), std::end(s.a), [](int& i) { ++i; });
50375041
}
50385042

5039-
// cppcheck-suppress constParameterReference - FP
50405043
void f(T_constParameter_std_begin& t) {
50415044
std::for_each(std::begin(t.v), std::end(t.v), [](int& i) { ++i; });
50425045
}
50435046

5047+
void f(U_constParameter_std_begin& u) {
5048+
std::for_each(std::begin(u.v[0][0]), std::end(u.v[0][0]), [](int& i) { ++i; });
5049+
}
5050+
50445051
void g_constVariable_std_begin(int* p) { *p = 0; }
50455052

50465053
int f_constVariable_std_begin() {

test/testsymboldatabase.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9969,6 +9969,18 @@ class TestSymbolDatabase : public TestFixture {
99699969
ASSERT(tok && tok->valueType());
99709970
ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str());
99719971
}
9972+
{
9973+
GET_SYMBOL_DB("struct S { std::vector<int> v[1][1]; };\n"
9974+
"void f(S& s) {\n"
9975+
" auto it = std::begin(s.v[0][0]);\n"
9976+
"}\n");
9977+
ASSERT_EQUALS("", errout_str());
9978+
9979+
const Token* tok = tokenizer.tokens();
9980+
tok = Token::findsimplematch(tok, "auto");
9981+
ASSERT(tok && tok->valueType());
9982+
ASSERT_EQUALS("iterator(std :: vector <)", tok->valueType()->str());
9983+
}
99729984
{
99739985
GET_SYMBOL_DB("void f(std::vector<int>::iterator beg, std::vector<int>::iterator end) {\n"
99749986
" auto it = std::find(beg, end, 0);\n"

0 commit comments

Comments
 (0)