From de4ca924b52fba17b62ba98fd83a3117d4cd1686 Mon Sep 17 00:00:00 2001 From: Reijo Tomperi Date: Thu, 5 Nov 2009 00:58:15 +0200 Subject: [PATCH] Fixed #896 (False positive with --all when return value of open() is positive in a loop) http://sourceforge.net/apps/trac/cppcheck/ticket/896 --- lib/tokenize.cpp | 38 +++++++++++++++++++++---------------- lib/tokenize.h | 6 ++++++ test/testsimplifytokens.cpp | 3 +++ 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 3df4630a2..d6af72194 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -577,19 +577,7 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[]) unsignedint(); // Use "<" comparison instead of ">" - for (Token *tok = _tokens; tok; tok = tok->next()) - { - if (Token::Match(tok, "[;(] %any% >|>= %any% [);]")) - { - const std::string op1(tok->strAt(1)); - tok->next()->str(tok->strAt(3)); - tok->tokAt(3)->str(op1); - if (tok->tokAt(2)->str() == ">") - tok->tokAt(2)->str("<"); - else - tok->tokAt(2)->str("<="); - } - } + simplifyComparisonOrder(); /** * @todo simplify "for" @@ -2033,13 +2021,12 @@ void Tokenizer::simplifyTokenList() } simplifyFunctionParameters(); - elseif(); + simplifyIfAssign(); simplifyRedundantParanthesis(); simplifyIfNot(); simplifyIfNotNull(); - simplifyIfAssign(); - + simplifyComparisonOrder(); simplifyNestedStrcat(); for (Token *tok = _tokens; tok; tok = tok->next()) @@ -3136,6 +3123,7 @@ void Tokenizer::simplifyIfAssign() tok2->insertToken(tok->strAt(2)); } tok2->insertToken(tok->strAt(1)); + tok2->next()->varId(tok->tokAt(1)->varId()); while (! braces.empty()) { @@ -4537,6 +4525,24 @@ std::string Tokenizer::simplifyString(const std::string &source) return str; } +void Tokenizer::simplifyComparisonOrder() +{ + // Use "<" comparison instead of ">" + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (Token::Match(tok, "[;(] %any% >|>= %any% [);]")) + { + const std::string op1(tok->strAt(1)); + tok->next()->str(tok->strAt(3)); + tok->tokAt(3)->str(op1); + if (tok->tokAt(2)->str() == ">") + tok->tokAt(2)->str("<"); + else + tok->tokAt(2)->str("<="); + } + } +} + void Tokenizer::getErrorMessages() { syntaxError(0, ' '); diff --git a/lib/tokenize.h b/lib/tokenize.h index e05dba66c..7519f444c 100644 --- a/lib/tokenize.h +++ b/lib/tokenize.h @@ -304,6 +304,12 @@ private: */ std::string simplifyString(const std::string &source); + /** + * Use "<" comparison instead of ">" + * Use "<=" comparison instead of ">=" + */ + void simplifyComparisonOrder(); + /** * Remove exception specifications. This function calls itself recursively. * @param tok First token in scope to cleanup diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 64b4344b4..5b790b150 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -440,6 +440,7 @@ private: ASSERT_EQUALS("return ( a + b ) * c ;", tok("return (a+b)*c;")); ASSERT_EQUALS("void f ( ) { int p ; if ( 2 * p == 0 ) { } }", tok("void f(){int p; if (2*p == 0) {}}")); ASSERT_EQUALS("void f ( ) { DIR * f ; f = opendir ( dirname ) ; if ( closedir ( f ) ) { } }", tok("void f(){DIR * f = opendir(dirname);if (closedir(f)){}}")); + ASSERT_EQUALS("void foo ( int p ) { if ( 0 <= p ) { ; } }", tok("void foo(int p){if((p)>=0);}")); } void declareVar() @@ -1391,6 +1392,8 @@ private: ASSERT_EQUALS("; a = b ( ) ; if ( ! ( a ) ) { ; }", simplifyIfAssign(";if(!(a=b()));")); ASSERT_EQUALS("; a . x = b ( ) ; if ( ! ( a . x ) ) { ; }", simplifyIfAssign(";if(!(a->x=b()));")); ASSERT_EQUALS("A ( ) a = b ; if ( a ) { ; }", simplifyIfAssign("A() if(a=b);")); + ASSERT_EQUALS("void foo ( int a ) { a = b ( ) ; if ( 0 <= a ) { ; } }", tok("void foo(int a) {if((a=b())>=0);}")); + TODO_ASSERT_EQUALS("void foo ( A a ) { a . c = b ( ) ; if ( 0 <= a . c ) { ; } }", tok("void foo(A a) {if((a.c=b())>=0);}")); }