From 7786e12ba2aadce23acec0d4f23c53d9c9d487a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 18 Aug 2012 22:11:48 +0200 Subject: [PATCH] Fixed #3922 (false positive: (error) null pointer dereference) --- lib/tokenize.cpp | 24 ++++++++++++++++++++++++ test/testsimplifytokens.cpp | 9 +++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 91128832e..0fb34281b 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3395,6 +3395,8 @@ bool Tokenizer::simplifyTokenList() modified |= simplifyCalculations(); } + simplifyConditionOperator(); + // replace strlen(str) for (Token *tok = list.front(); tok; tok = tok->next()) { if (Token::Match(tok, "strlen ( %str% )")) { @@ -4144,6 +4146,28 @@ void Tokenizer::simplifyCompoundAssignment() void Tokenizer::simplifyConditionOperator() { for (Token *tok = list.front(); tok; tok = tok->next()) { + if (Token::Match(tok,"return|= ( true|false ) ?")) { + Token *tok2 = tok->tokAt(5); + while (tok2 && (tok2->isName() || tok2->isNumber() || tok2->isArithmeticalOp())) + tok2 = tok2->next(); + if (tok2 && tok2->str() == ":") { + if (tok->strAt(2) == "false") { + Token::eraseTokens(tok,tok2->next()); + } else { + Token *tok3 = tok2->next(); + while (tok3 && (tok3->isName() || tok3->isNumber() || tok3->isArithmeticalOp())) + tok3 = tok3->next(); + + if (tok3 && tok3->str() == ";") { + tok->deleteNext(4); + tok = tok2; + while (tok && tok->str() != ";") + tok->deleteThis(); + } + } + } + } + if (tok->str() == "(") tok = tok->link(); else if (tok->str() == ")") diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index f62c83658..e1785cb65 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -2792,6 +2792,15 @@ private: "1: ; char * p@1 ; if ( a ) { * p@1 = 1 ; } else { * p@1 = 0 ; }\n"; ASSERT_EQUALS(expected, tokenizeDebugListing(code, true)); } + + { + // #3922 - (true) + ASSERT_EQUALS("; x = 2 ;", tok("; x = (true)?2:4;")); + ASSERT_EQUALS("; x = 4 ;", tok("; x = (false)?2:4;")); + ASSERT_EQUALS("; x = * a ;", tok("; x = (true)?*a:*b;")); + ASSERT_EQUALS("; x = * b ;", tok("; x = (false)?*a:*b;")); + ASSERT_EQUALS("void f ( ) { return 1 ; }", tok("void f() { char *p=0; return (p==0)?1:2; }")); + } } void calculations() {