From 6b6553e320468865fada68981e0da94ab9b32681 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Sat, 5 Oct 2019 09:14:30 -0500 Subject: [PATCH] Dont warn for arrays that are containers (#2240) --- lib/checkbufferoverrun.cpp | 3 +++ test/testbufferoverrun.cpp | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index f86ff302c..2d7d2b068 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -286,6 +286,9 @@ void CheckBufferOverrun::arrayIndex() continue; } + if (astIsContainer(array)) + continue; + std::vector indexTokens; for (const Token *tok2 = tok; tok2 && tok2->str() == "["; tok2 = tok2->link()->next()) { if (!tok2->astOperand2()) { diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 142d2a443..34e8f1b8e 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -150,6 +150,7 @@ private: TEST_CASE(array_index_valueflow_pointer); TEST_CASE(array_index_function_parameter); TEST_CASE(array_index_enum_array); // #8439 + TEST_CASE(array_index_container); // #9386 TEST_CASE(buffer_overrun_2_struct); TEST_CASE(buffer_overrun_3); @@ -2144,6 +2145,14 @@ private: ASSERT_EQUALS("[test.cpp:4]: (error) Array 'arrE[2]' accessed at index 8, which is out of bounds.\n", errout.str()); } + void array_index_container() { // #9386 + check("constexpr int blockLen = 10;\n" + "void foo(std::array& a) {\n" + " a[2] = 2;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } + void buffer_overrun_2_struct() { check("struct ABC\n" "{\n"