From 8baf8dbebb95995eb9085e5984330dbc55cfbac6 Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Sun, 2 Mar 2014 15:56:42 +0100 Subject: [PATCH] Ticket #5425: Avoid infinite recursion in checkMemsetType for invalid input --- lib/checkclass.cpp | 5 +++-- test/testclass.cpp | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 4fb84c261..18d9160ed 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1020,6 +1020,7 @@ void CheckClass::checkMemsetType(const Scope *start, const Token *tok, const Sco // don't warn if variable static or const, pointer or reference if (!var->isStatic() && !var->isConst() && !var->isPointer() && !var->isReference()) { const Token *tok1 = var->typeStartToken(); + const Scope *typeScope = var->typeScope(); // check for std:: type if (var->isStlType()) @@ -1029,8 +1030,8 @@ void CheckClass::checkMemsetType(const Scope *start, const Token *tok, const Sco memsetError(tok, tok->str(), "'std::" + tok1->strAt(2) + "'", type->classDef->str()); // check for known type - else if (var->typeScope()) - checkMemsetType(start, tok, var->typeScope(), allocation); + else if (typeScope && typeScope != type) + checkMemsetType(start, tok, typeScope, allocation); } } } diff --git a/test/testclass.cpp b/test/testclass.cpp index 1954469d4..2fd57d41a 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -80,6 +80,7 @@ private: TEST_CASE(memsetOnStruct); TEST_CASE(memsetVector); TEST_CASE(memsetOnClass); + TEST_CASE(memsetOnInvalid); // Ticket #5425: Crash upon invalid TEST_CASE(mallocOnClass); TEST_CASE(this_subtraction); // warn about "this-x" @@ -2285,6 +2286,22 @@ private: ASSERT_EQUALS("", errout.str()); } + void memsetOnInvalid() { // Ticket #5425 + checkNoMemset("union ASFStreamHeader {\n" + " struct AVMPACKED {\n" + " union {\n" + " struct AVMPACKED {\n" + " int width;\n" + " } vid;\n" + " };\n" + " } hdr;\n" + "};" + "void parseHeader() {\n" + " ASFStreamHeader strhdr;\n" + " memset(&strhdr, 0, sizeof(strhdr));\n" + "}"); + } + void memsetOnStruct() { checkNoMemset("struct A\n" "{\n"