From 7a50330def17d948a9fdd47b12baf224eca4bf47 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 May 2022 17:40:45 -0500 Subject: [PATCH 1/3] Fix 11035: FP arrayIndexOutOfBoundsCond with array and vector --- lib/astutils.cpp | 2 +- test/testbufferoverrun.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8741df8725b..03f4386f6bf 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 14038828d35..05545ab1a9c 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -243,6 +243,7 @@ class TestBufferOverrun : public TestFixture { 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,20 @@ class TestBufferOverrun : public TestFixture { ASSERT_EQUALS("[test.cpp:5]: (error) Array 'z[16]' accessed at index 19, which is out of bounds.\n", errout.str()); } + void buffer_overrun_34() { // #11035 + 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}"; From b0882f79c62d0f62022dabd89c5a25812b66a21e Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 May 2022 17:42:13 -0500 Subject: [PATCH 2/3] Format --- test/testbufferoverrun.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 05545ab1a9c..586712828c8 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -3121,17 +3121,18 @@ class TestBufferOverrun : public TestFixture { ASSERT_EQUALS("[test.cpp:5]: (error) Array 'z[16]' accessed at index 19, which is out of bounds.\n", errout.str()); } - void buffer_overrun_34() { // #11035 + void buffer_overrun_34() + { // #11035 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"); + " 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()); } From 7263fcf1bd8b2fa2c0cf06f11fc316226b391777 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 11 May 2022 17:42:53 -0500 Subject: [PATCH 3/3] Move comment --- test/testbufferoverrun.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 586712828c8..7592d2cf2cc 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -3121,8 +3121,9 @@ class TestBufferOverrun : public TestFixture { 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() - { // #11035 + { check("struct S {\n" " std::vector v;\n" " int a[15] = {};\n"