From 229604b3e31db0e99f8675da9d19fd77dd130e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 13 Oct 2010 18:06:50 +0200 Subject: [PATCH] Fixed #2093 (False positive: buffer access out of bounds (unknown type)) --- lib/checkbufferoverrun.cpp | 2 +- test/testbufferoverrun.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index b565d3682..fa2ef130e 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -1012,7 +1012,7 @@ void CheckBufferOverrun::checkScope(const Token *tok, const ArrayInfo &arrayInfo if (Token::Match(tok, "strcpy|strcat ( %varid% , %str% )", arrayInfo.varid)) { const unsigned long len = Token::getStrLength(tok->tokAt(4)); - if (len >= total_size) + if (total_size > 0 && len >= total_size) { bufferOverrun(tok, arrayInfo.varname); continue; diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 683744e99..d4cbedba1 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -1688,11 +1688,18 @@ private: void buffer_overrun_16() { + // unknown types check("void f() {\n" " struct Foo foo[5];\n" " memset(foo, 0, sizeof(foo));\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + check("void f() {\n" // ticket #2093 + " gchar x[3];\n" + " strcpy(x, \"12\");\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void sprintf1()