From 682e68b1b634e5133c5097a507f7e67ed7f39e20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 9 Oct 2013 05:43:50 +0200 Subject: [PATCH] Fixed #5077 (False positive: Comparison of boolean result with relational operator ((X + (Y < 0)) <= b)) --- lib/checkbool.cpp | 22 ++++++++-------------- test/testbool.cpp | 3 +++ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/checkbool.cpp b/lib/checkbool.cpp index 8d39bceec..5de0f2209 100644 --- a/lib/checkbool.cpp +++ b/lib/checkbool.cpp @@ -364,25 +364,19 @@ static bool isNonBoolLHSExpr(const Token *tok) // return value. only return true if we "know" it's a non-bool expression bool nonBoolExpr = false; - // look into () and [] - int indentlevel = 0; - for (; tok; tok = tok->previous()) { - if (tok->str() == ")" || tok->str() == "]") - ++indentlevel; - else if (tok->str() == "(" || tok->str() == "[") { - if (indentlevel <= 0) - break; - --indentlevel; - } else if (tok->isNumber()) + if (tok->str() == ")") { + if (!Token::Match(tok->link()->previous(), "&&|%oror%|( (")) + tok = tok->link(); + } else if (tok->str() == "(" || tok->str() == "[") + break; + else if (tok->isNumber()) nonBoolExpr = true; else if (tok->isArithmeticalOp()) { - if (indentlevel == 0) - return true; - nonBoolExpr = true; + return true; } else if (tok->isComparisonOp() || (tok->str() == "!" && tok->previous()->str()=="(")) return false; - else if (indentlevel == 0 && Token::Match(tok,"[;{}=?:&|^,]")) + else if (Token::Match(tok,"[;{}=?:&|^,]")) break; else if (Token::Match(tok, "&&|%oror%|and|or")) break; diff --git a/test/testbool.cpp b/test/testbool.cpp index 5fa9d3577..2213103f6 100644 --- a/test/testbool.cpp +++ b/test/testbool.cpp @@ -322,6 +322,9 @@ private: check(code, false, "test.c"); ASSERT_EQUALS("", errout.str()); } + + check("int f() { return (a+(b<5)<=c); }"); + ASSERT_EQUALS("",errout.str()); } void comparisonOfBoolExpressionWithInt2() {