From dfd557888d24cf1841eebd4003c0ccabc387e730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20De=20Mar=C3=A9?= Date: Sun, 10 Feb 2013 13:36:40 +0100 Subject: [PATCH] Fixed #4565 (false positive: dangerous usage (not null-terminated)) --- lib/checkuninitvar.cpp | 6 +++++- test/testuninitvar.cpp | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 1fa8d4d6e..e449d003c 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -277,8 +277,12 @@ private: CheckUninitVar *checkUninitVar = dynamic_cast(c->owner); if (checkUninitVar) { - if (c->strncpy_ || c->memset_nonzero) + if (c->strncpy_ || c->memset_nonzero) { + if(!Token::Match(c->var->typeStartToken(), "char|wchar_t")) { + continue; + } checkUninitVar->uninitstringError(tok, c->var->name(), c->strncpy_); + } else if (c->var->isPointer() && !c->var->isArray() && c->alloc) checkUninitVar->uninitdataError(tok, c->var->name()); else diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 8ae5c9d5e..e47a51e93 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -45,6 +45,7 @@ private: TEST_CASE(uninitvar_return); // return TEST_CASE(uninitvar_strncpy); // strncpy doesn't always null-terminate TEST_CASE(uninitvar_memset); // not null-terminated + TEST_CASE(uninitvar_memset_nonchar); TEST_CASE(uninitvar_func); // analyse functions TEST_CASE(func_uninit_var); // analyse function calls for: 'int a(int x) { return x+x; }' TEST_CASE(func_uninit_pointer); // analyse function calls for: 'void a(int *p) { *p = 0; }' @@ -1638,6 +1639,15 @@ private: ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous usage of 'a' (not null-terminated).\n", errout.str()); } + void uninitvar_memset_nonchar() { + checkUninitVar("void f() {\n" + " int a[20];\n" + " memset(a, 1, 20);\n" + " a[0] |= 2;\n" + "}\n"); + ASSERT_EQUALS(errout.str(), ""); + } + std::string analyseFunctions(const char code[]) { // Clear the error buffer.. errout.str("");