diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8741df872..03f4386f6 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1666,7 +1666,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library) if (Function::returnsVoid(f)) return false; // Member function call - if (Token::simpleMatch(ftok->previous(), ".")) { + if (Token::simpleMatch(ftok->previous(), ".") || exprDependsOnThis(ftok->next())) { if (f->isConst()) return true; // Check for const overloaded function that just return the const version diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 14038828d..7592d2cf2 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -243,6 +243,7 @@ private: TEST_CASE(buffer_overrun_31); TEST_CASE(buffer_overrun_32); //#10244 TEST_CASE(buffer_overrun_33); //#2019 + TEST_CASE(buffer_overrun_34); //#11035 TEST_CASE(buffer_overrun_errorpath); TEST_CASE(buffer_overrun_bailoutIfSwitch); // ticket #2378 : bailoutIfSwitch TEST_CASE(buffer_overrun_function_array_argument); @@ -3120,6 +3121,22 @@ private: ASSERT_EQUALS("[test.cpp:5]: (error) Array 'z[16]' accessed at index 19, which is out of bounds.\n", errout.str()); } + // #11035 + void buffer_overrun_34() + { + check("struct S {\n" + " std::vector v;\n" + " int a[15] = {};\n" + " int g() const { return v.size(); }\n" + " int f(int i) const {\n" + " if (i < 0 || i >= g())\n" + " return 0;\n" + " return a[i];\n" + " }\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); + } + void buffer_overrun_errorpath() { setMultiline(); settings0.templateLocation = "{file}:{line}:note:{info}";