diff --git a/.travis_suppressions b/.travis_suppressions index 2adc62515..b616b1480 100644 --- a/.travis_suppressions +++ b/.travis_suppressions @@ -9,7 +9,6 @@ bitwiseOnBoolean unusedPrivateFunction:test/test*.cpp useStlAlgorithm simplifyUsing:lib/valueptr.h -uninitvar # debug suppressions valueFlowBailout diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 88a61c42a..1025ebced 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1012,6 +1012,11 @@ static bool astIsRhs(const Token *tok) return tok && tok->astParent() && tok == tok->astParent()->astOperand2(); } +static bool isVoidCast(const Token *tok) +{ + return Token::simpleMatch(tok, "(") && tok->isCast() && tok->valueType() && tok->valueType()->type == ValueType::Type::VOID && tok->valueType()->pointer == 0; +} + const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const { const Token *valueExpr = vartok; // non-dereferenced , no address of value as variable @@ -1065,6 +1070,15 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, return nullptr; // safe operations + if (isVoidCast(valueExpr->astParent())) + return nullptr; + if (Token::simpleMatch(valueExpr->astParent(), ".")) { + const Token *parent = valueExpr->astParent(); + while (Token::simpleMatch(parent, ".")) + parent = parent->astParent(); + if (isVoidCast(parent)) + return nullptr; + } if (alloc != NO_ALLOC) { if (Token::Match(valueExpr->astParent(), "%comp%|%oror%|&&|?|!")) return nullptr; diff --git a/test/cfg/gtk.c b/test/cfg/gtk.c index dc6a86c87..cd7571b88 100644 --- a/test/cfg/gtk.c +++ b/test/cfg/gtk.c @@ -70,7 +70,7 @@ void validCode(int argInt, GHashTableIter * hash_table_iter, GHashTable * hash_t // NULL is handled graciously char* str = g_strdup(NULL); - if(g_strcmp0(str, NULL) || g_strcmp0(NULL, str)) + if (g_strcmp0(str, NULL) || g_strcmp0(NULL, str)) printf("%s", str); g_free(str); }