diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index c6f91cc63..cc45c3223 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -218,13 +218,11 @@ void CheckBool::checkComparisonOfFuncReturningBool() for (const Token* tok = scope->classStart->next(); tok != scope->classEnd; tok = tok->next()) { if (tok->type() != Token::eComparisonOp || tok->str() == "==" || tok->str() == "!=") continue; - const Token *first_token; - bool first_token_func_of_type_bool = false; + const Token *first_token = tok->previous(); if (tok->strAt(-1) == ")") { - first_token = tok->previous()->link()->previous(); - } else { - first_token = tok->previous(); + first_token = first_token->link()->previous(); } + bool first_token_func_of_type_bool = false; if (Token::Match(first_token, "%var% (") && !Token::Match(first_token->previous(), "::|.")) { const Function* func = first_token->function(); if (func && func->tokenDef && func->tokenDef->strAt(-1) == "bool") { @@ -233,10 +231,10 @@ void CheckBool::checkComparisonOfFuncReturningBool() } Token *second_token = tok->next(); - bool second_token_func_of_type_bool = false; while (second_token->str()=="!") { second_token = second_token->next(); } + bool second_token_func_of_type_bool = false; if (Token::Match(second_token, "%var% (") && !Token::Match(second_token->previous(), "::|.")) { const Function* func = second_token->function(); if (func && func->tokenDef && func->tokenDef->strAt(-1) == "bool") { @@ -299,7 +297,6 @@ void CheckBool::checkComparisonOfBoolWithBool() if (tok->type() != Token::eComparisonOp || tok->str() == "==" || tok->str() == "!=") continue; bool first_token_bool = false; - bool second_token_bool = false; const Token *first_token = tok->previous(); if (first_token->varId()) { @@ -307,13 +304,17 @@ void CheckBool::checkComparisonOfBoolWithBool() first_token_bool = true; } } + if (!first_token_bool) + continue; + + bool second_token_bool = false; const Token *second_token = tok->next(); if (second_token->varId()) { if (isBool(second_token->variable())) { second_token_bool = true; } } - if ((first_token_bool == true) && (second_token_bool == true)) { + if (second_token_bool) { comparisonOfBoolWithBoolError(first_token->next(), first_token->str()); } } @@ -374,7 +375,7 @@ void CheckBool::checkComparisonOfBoolExpressionWithInt() continue; // Skip template parameters - if (tok->str() == "<" && tok->link()) { + if (tok->link() && tok->str() == "<") { tok = tok->link(); continue; } @@ -394,11 +395,11 @@ void CheckBool::checkComparisonOfBoolExpressionWithInt() continue; } - if (Token::Match(boolExpr,"%bool%")) - // The CheckBool::checkComparisonOfBoolWithInt warns about this. + if (!numTok || !boolExpr) continue; - if (!numTok || !boolExpr) + if (Token::Match(boolExpr,"%bool%")) + // The CheckBool::checkComparisonOfBoolWithInt warns about this. continue; if (boolExpr->isOp() && numTok->isName() && Token::Match(tok, "==|!=")) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 09c72b1ce..288afe711 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -138,8 +138,6 @@ void CheckClass::constructors() if (var->hasDefault()) usage[count].init = true; - bool inconclusive = false; - if (usage[count].assign || usage[count].init || var->isStatic()) continue; @@ -169,14 +167,19 @@ void CheckClass::constructors() } } + bool inconclusive = false; // Don't warn about unknown types in copy constructors since we // don't know if they can be copied or not.. if (!var->isPointer() && !(var->type() && var->type()->needInitialization != Type::True) && (func->type == Function::eCopyConstructor || func->type == Function::eOperatorEqual)) { bool stdtype = false; - for (const Token *type = var->typeStartToken(); type && type->isName(); type = type->next()) - stdtype |= type->isStandardType(); + for (const Token *type = var->typeStartToken(); type && type->isName(); type = type->next()) { + if (type->isStandardType()) { + stdtype = true; + break; + } + } if (!stdtype) { if (_settings->inconclusive) inconclusive = true; @@ -942,7 +945,8 @@ void CheckClass::checkMemset() const Token* arg1 = tok->tokAt(2); const Token* arg3 = arg1; arg3 = arg3->nextArgument(); - arg3 = (arg3 != nullptr) ? arg3->nextArgument() : nullptr; + if (arg3) + arg3 = arg3->nextArgument(); if (!arg3) // weird, shouldn't happen: memset etc should have // 3 arguments. @@ -1268,12 +1272,11 @@ void CheckClass::operatorEqToSelf() const std::size_t classes = symbolDatabase->classAndStructScopes.size(); for (std::size_t i = 0; i < classes; ++i) { const Scope * scope = symbolDatabase->classAndStructScopes[i]; - std::list::const_iterator func; - // skip classes with multiple inheritance if (scope->definedType->derivedFrom.size() > 1) continue; + std::list::const_iterator func; for (func = scope->functionList.begin(); func != scope->functionList.end(); ++func) { if (func->type == Function::eOperatorEqual && func->hasBody) { // make sure that the operator takes an object of the same type as *this, otherwise we can't detect self-assignment checks diff --git a/lib/checkio.cpp b/lib/checkio.cpp index b724f0841..cd9394a85 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -1404,7 +1404,7 @@ CheckIO::ArgumentInfo::ArgumentInfo(const Token * tok, const Settings *settings) break; } else if (tok1->str() == "(" || tok1->str() == "{" || tok1->str() == "[") tok1 = tok1->link(); - else if (tok1->str() == "<" && tok1->link()) + else if (tok1->link() && tok1->str() == "<") tok1 = tok1->link(); // check for some common well known functions @@ -1419,10 +1419,13 @@ CheckIO::ArgumentInfo::ArgumentInfo(const Token * tok, const Settings *settings) tempToken->str("long"); if (settings->sizeof_long != 8) tempToken->isLong(true); - } else if (settings->sizeof_size_t == 4 && settings->sizeof_long == 4) - tempToken->str("long"); - else if (settings->sizeof_size_t == 4) - tempToken->str("int"); + } else if (settings->sizeof_size_t == 4) { + if (settings->sizeof_long == 4) { + tempToken->str("long"); + } else { + tempToken->str("int"); + } + } tempToken->originalName("size_t"); tempToken->isUnsigned(true); diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index 1cfdd0b09..b126df5d6 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -1820,7 +1820,7 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string const std::string def = getdef(line, true); const std::string ndef = getdef(line, false); - const bool emptymatch = matching_ifdef.empty() | matched_ifdef.empty(); + const bool emptymatch = matching_ifdef.empty() || matched_ifdef.empty(); if (line.compare(0, 8, "#define ") == 0) { match = true; @@ -1842,8 +1842,14 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string } } - for (std::list::const_iterator it = matching_ifdef.begin(); it != matching_ifdef.end(); ++it) - match &= bool(*it); + if (match) { + for (std::list::const_iterator it = matching_ifdef.begin(); it != matching_ifdef.end(); ++it) { + if (!bool(*it)) { + match = false; + break; + } + } + } if (match) { std::string::size_type pos = line.find_first_of(" (", 8); @@ -1915,8 +1921,12 @@ std::string Preprocessor::getcode(const std::string &filedata, const std::string if (!line.empty() && line[0] == '#') { match = true; - for (std::list::const_iterator it = matching_ifdef.begin(); it != matching_ifdef.end(); ++it) - match &= bool(*it); + for (std::list::const_iterator it = matching_ifdef.begin(); it != matching_ifdef.end(); ++it) { + if (!bool(*it)) { + match = false; + break; + } + } } // #error => return ""