From 14a0031e884c765e8ef5705e5330dfc26f985e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 28 Feb 2019 10:26:47 +0100 Subject: [PATCH] Improved isVariableChangedByFunctionCall, better logic when parameter might be passed by reference --- lib/astutils.cpp | 10 ++++++++-- test/testastutils.cpp | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8c5c43823..d7f712156 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -811,6 +811,8 @@ bool isVariableChangedByFunctionCall(const Token *tok, const Settings *settings, if (!tok) return false; + const Token * const tok1 = tok; + // address of variable const bool addressOf = tok->astParent() && tok->astParent()->isUnaryOp("&"); @@ -844,10 +846,13 @@ bool isVariableChangedByFunctionCall(const Token *tok, const Settings *settings, tok = tok->link(); else if (Token::Match(tok->previous(), "%name% (")) break; + else if (Token::simpleMatch(tok->previous(), "> (") && tok->previous()->link()) + break; tok = tok->previous(); } if (!tok || tok->str() != "(") return false; + const bool possiblyPassedByReference = (tok->next() == tok1 || Token::simpleMatch(tok->previous(), ", %name% [,)]")); tok = tok->previous(); if (tok && tok->link() && tok->str() == ">") tok = tok->link()->previous(); @@ -879,12 +884,13 @@ bool isVariableChangedByFunctionCall(const Token *tok, const Settings *settings, // => it is assumed that parameter is an in parameter (TODO: this is a bad heuristic) if (!addressOf && settings && settings->library.isnullargbad(tok, 1+argnr)) return false; - // addressOf => inconclusive - if (!addressOf) { + // possible pass-by-reference => inconclusive + if (possiblyPassedByReference) { if (inconclusive != nullptr) *inconclusive = true; return false; } + // Safe guess: Assume that parameter is changed by function call return true; } diff --git a/test/testastutils.cpp b/test/testastutils.cpp index c5cf38415..a66e43fe3 100644 --- a/test/testastutils.cpp +++ b/test/testastutils.cpp @@ -135,7 +135,7 @@ private: "}"; inconclusive = false; ASSERT_EQUALS(false, isVariableChangedByFunctionCall(code, "x ) ;", &inconclusive)); - // FIXME : ASSERT_EQUALS(true, inconclusive); + ASSERT_EQUALS(true, inconclusive); } bool nextAfterAstRightmostLeaf(const char code[], const char parentPattern[], const char rightPattern[]) {