From b4c637c58b4be3124cbbc43f17ad2150a16a976b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 2 Jun 2009 18:56:53 +0200 Subject: [PATCH] Fixed #350 (False positive: Array index out of bounds) --- src/checkbufferoverrun.cpp | 4 ++++ test/testbufferoverrun.cpp | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/checkbufferoverrun.cpp b/src/checkbufferoverrun.cpp index 809f79b05..430fd149c 100644 --- a/src/checkbufferoverrun.cpp +++ b/src/checkbufferoverrun.cpp @@ -451,6 +451,10 @@ void CheckBufferOverrunClass::CheckBufferOverrun_GlobalAndLocalVariable() unsigned int varid = 0; int nextTok = 0; + // if the previous token exists, it must be either a variable name or "[;{}]" + if (tok->previous() && (!tok->previous()->isName() && !Token::Match(tok->previous(), "[;{}]"))) + continue; + if (Token::Match(tok, "%type% *| %var% [ %num% ] [;=]")) { unsigned int varpos = 1; diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index cea28b673..6112bfa6b 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -460,6 +460,15 @@ private: " p[i] = 0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5]: (all) Buffer overrun\n", errout.str()); + + // No false positive + check("void foo(int x, int y)\n" + "{\n" + " const char *p[2];\n" + " x = y * p[1];\n" + " p[1] = 0;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); }