diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index aec70c65e..b565d3682 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -1815,6 +1815,10 @@ bool CheckBufferOverrun::ArrayInfo::declare(const Token *tok, const Tokenizer &t _element_size = tokenizer.sizeOfType(vartok); vartok = vartok->next(); } + else if (tok->str() == "struct") + { + _element_size = 100; + } else { _element_size = tokenizer.sizeOfType(tok); diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 1aafc8995..683744e99 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -126,6 +126,7 @@ private: TEST_CASE(buffer_overrun_13); TEST_CASE(buffer_overrun_14); TEST_CASE(buffer_overrun_15); // ticket #1787 + TEST_CASE(buffer_overrun_16); TEST_CASE(sprintf1); TEST_CASE(sprintf2); @@ -1685,6 +1686,15 @@ private: ASSERT_EQUALS("[test.cpp:7]: (error) Buffer access out-of-bounds\n", errout.str()); } + void buffer_overrun_16() + { + check("void f() {\n" + " struct Foo foo[5];\n" + " memset(foo, 0, sizeof(foo));\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } + void sprintf1() { check("void f()\n"