From 24ecaf8b0a3d32216ba091dbfdfe01d6abf31de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 14 Oct 2014 16:40:30 +0200 Subject: [PATCH] leakautovar: handling of unknown/non-pod types in c++ --- lib/checkleakautovar.cpp | 4 ++++ test/testleakautovar.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 3163034f6..1feca5ddd 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -224,6 +224,10 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken, continue; } + // non-pod variable + if (_tokenizer->isCPP() && (!var || !var->typeStartToken()->isStandardType())) + continue; + // Don't check reference variables if (var && var->isReference()) continue; diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index acee178dc..cdc5a7612 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -97,6 +97,7 @@ private: TEST_CASE(test2); TEST_CASE(test3); // #3954 - reference pointer TEST_CASE(test4); // #5923 - static pointer + TEST_CASE(test5); // unknown type // Execution reaches a 'throw' TEST_CASE(throw1); @@ -137,6 +138,31 @@ private: c.runSimplifiedChecks(&tokenizer, &settings, this); } + void checkcpp(const char code[]) { + // Clear the error buffer.. + errout.str(""); + + // Tokenize.. + Settings settings; + int id = 0; + while (!settings.library.ismemory(++id)); + settings.library.setalloc("malloc",id); + settings.library.setdealloc("free",id); + while (!settings.library.isresource(++id)); + settings.library.setalloc("fopen",id); + settings.library.setdealloc("fclose",id); + Tokenizer tokenizer(&settings, this); + std::istringstream istr(code); + tokenizer.tokenize(istr, "test.c.cpp"); + tokenizer.simplifyTokenList2(); + + // Check for leaks.. + CheckLeakAutoVar c; + settings.checkLibrary = true; + settings.addEnabled("information"); + c.runSimplifiedChecks(&tokenizer, &settings, this); + } + void assign1() { check("void f() {\n" " char *p = malloc(10);\n" @@ -622,6 +648,14 @@ private: ASSERT_EQUALS("", errout.str()); } + void test5() { // unknown type + checkcpp("void f() { Fred *p = malloc(10); }"); + ASSERT_EQUALS("", errout.str()); + + check("void f() { Fred *p = malloc(10); }"); + ASSERT_EQUALS("[test.c:1]: (error) Memory leak: p\n", errout.str()); + } + void throw1() { // 3987 - Execution reach a 'throw' check("void f() {\n" " char *p = malloc(10);\n"