From 0d72216cca6fcbf30b366eb385ecb349994718f9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 22 Jul 2022 07:24:34 +0200 Subject: [PATCH] Fix BufferOverrun TODO (#4300) * Fix BufferOverrun TODO * clang-tidy --- lib/checkbufferoverrun.cpp | 15 +++++++++++++++ test/testbufferoverrun.cpp | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 68b42a1d1..51ac7ba48 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -318,6 +318,21 @@ void CheckBufferOverrun::arrayIndex() if (!getDimensionsEtc(tok->astOperand1(), mSettings, &dimensions, &errorPath, &mightBeLarger, &path)) continue; + const Variable* const var = array->variable(); + if (var && var->isArgument() && var->scope()) { + const Token* changeTok = var->scope()->bodyStart; + bool isChanged = false; + while ((changeTok = findVariableChanged(changeTok->next(), var->scope()->bodyEnd, /*indirect*/ 0, var->declarationId(), + /*globalvar*/ false, mSettings, mTokenizer->isCPP()))) { + if (!Token::simpleMatch(changeTok->astParent(), "[")) { + isChanged = true; + break; + } + } + if (isChanged) + continue; + } + // Positive index if (!mightBeLarger) { // TODO check arrays with dim 1 also const std::vector& indexValues = diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 7a0d88461..c2cc7b6f2 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -2641,7 +2641,13 @@ private: " a += 4;\n" " a[-1] = 0;\n" "}"); - TODO_ASSERT_EQUALS("", "[test.cpp:3]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("", errout.str()); + + check("void f(char a[10]) {\n" + " a[0] = 0;\n" + " a[-1] = 0;\n" + "}"); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout.str()); } void array_index_enum_array() { // #8439