diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index fb16deb9a..d74f6ea85 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -894,6 +894,12 @@ void CheckBufferOverrun::checkScope(const Token *tok, const std::vector bailout + if (varid > 0 && + Token::Match(tok, "[;{}] %varid% =", varid) && + !Token::Match(tok->tokAt(3), "%varid%", varid)) + break; + // Array index.. if (varid > 0) { diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 1518ee522..c3af55976 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -2497,6 +2497,13 @@ private: " s[10] = 0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[1]' index 10 out of bounds\n", errout.str()); + + check("void foo() {\n" + " const char *s = \"\";\n" + " s = y();\n" + " s[10] = 0;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } // data is allocated with alloca