From aa1b8c92d03bf3e103c814e9418c14fec0d52f44 Mon Sep 17 00:00:00 2001 From: orbitcowboy Date: Sat, 1 Jun 2024 19:17:10 +0200 Subject: [PATCH] Replaced 'tok->next()->link()' by 'tok->linkAt(1)' --- lib/astutils.cpp | 2 +- lib/checkassert.cpp | 2 +- lib/checkboost.cpp | 2 +- lib/checkbufferoverrun.cpp | 2 +- lib/checkclass.cpp | 4 +-- lib/checkcondition.cpp | 4 +-- lib/checkexceptionsafety.cpp | 10 +++---- lib/checkleakautovar.cpp | 2 +- lib/checkmemoryleak.cpp | 2 +- lib/checknullpointer.cpp | 6 ++-- lib/checkother.cpp | 2 +- lib/checkstl.cpp | 18 ++++++------ lib/checkstring.cpp | 4 +-- lib/checkuninitvar.cpp | 8 +++--- lib/checkunusedvar.cpp | 4 +-- lib/forwardanalyzer.cpp | 8 +++--- lib/pathanalysis.cpp | 6 ++-- lib/symboldatabase.cpp | 56 ++++++++++++++++++------------------ lib/templatesimplifier.cpp | 12 ++++---- lib/tokenize.cpp | 48 +++++++++++++++---------------- lib/tokenlist.cpp | 4 +-- lib/valueflow.cpp | 8 +++--- 22 files changed, 107 insertions(+), 107 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index efe879e180d..ac72174c974 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -484,7 +484,7 @@ static bool isFunctionCall(const Token* tok) { if (Token::Match(tok, "%name% (")) return true; - if (Token::Match(tok, "%name% <") && Token::simpleMatch(tok->next()->link(), "> (")) + if (Token::Match(tok, "%name% <") && Token::simpleMatch(tok->linkAt(1), "> (")) return true; if (Token::Match(tok, "%name% ::")) return isFunctionCall(tok->tokAt(2)); diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 26d0c93b8cc..7bdff94a119 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -55,7 +55,7 @@ void CheckAssert::assertWithSideEffects() if (!Token::simpleMatch(tok, "assert (")) continue; - const Token *endTok = tok->next()->link(); + const Token *endTok = tok->linkAt(1); for (const Token* tmp = tok->next(); tmp != endTok; tmp = tmp->next()) { if (Token::simpleMatch(tmp, "sizeof (")) tmp = tmp->linkAt(1); diff --git a/lib/checkboost.cpp b/lib/checkboost.cpp index 4913a691fba..b5c3612b78a 100644 --- a/lib/checkboost.cpp +++ b/lib/checkboost.cpp @@ -40,7 +40,7 @@ void CheckBoost::checkBoostForeachModification() if (!Token::simpleMatch(tok, "BOOST_FOREACH (")) continue; - const Token *containerTok = tok->next()->link()->previous(); + const Token *containerTok = tok->linkAt(1)->previous(); if (!Token::Match(containerTok, "%var% ) {")) continue; diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 45820f02de4..144ae310919 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -787,7 +787,7 @@ void CheckBufferOverrun::stringNotZeroTerminated() } // Is the buffer zero terminated after the call? bool isZeroTerminated = false; - for (const Token *tok2 = tok->next()->link(); tok2 != scope->bodyEnd; tok2 = tok2->next()) { + for (const Token *tok2 = tok->linkAt(1); tok2 != scope->bodyEnd; tok2 = tok2->next()) { if (!Token::simpleMatch(tok2, "] =")) continue; const Token *rhs = tok2->next()->astOperand2(); diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index c05d60478ca..e7bfefd40f5 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -949,7 +949,7 @@ void CheckClass::initializeVarList(const Function &func, std::listnext(); // Passing "this" => assume that everything is initialized - for (const Token *tok2 = ftok->next()->link(); tok2 && tok2 != ftok; tok2 = tok2->previous()) { + for (const Token *tok2 = ftok->linkAt(1); tok2 && tok2 != ftok; tok2 = tok2->previous()) { if (tok2->str() == "this") { assignAllVar(usage); return; @@ -1020,7 +1020,7 @@ void CheckClass::initializeVarList(const Function &func, std::listtokAt(2); tok && tok != ftok->next()->link(); tok = tok->next()) { + for (const Token *tok = ftok->tokAt(2); tok && tok != ftok->linkAt(1); tok = tok->next()) { if (tok->isName()) { assignVar(usage, tok->varId()); } diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index bc1df36aacc..9a673452e4b 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1803,9 +1803,9 @@ void CheckCondition::checkDuplicateConditionalAssign() for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) { if (!Token::simpleMatch(tok, "if (")) continue; - if (!Token::simpleMatch(tok->next()->link(), ") {")) + if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; - const Token *blockTok = tok->next()->link()->next(); + const Token *blockTok = tok->linkAt(1)->next(); const Token *condTok = tok->next()->astOperand2(); const bool isBoolVar = Token::Match(condTok, "!| %var%"); if (!isBoolVar && !Token::Match(condTok, "==|!=")) diff --git a/lib/checkexceptionsafety.cpp b/lib/checkexceptionsafety.cpp index c4e1e5c0c94..371158ddf25 100644 --- a/lib/checkexceptionsafety.cpp +++ b/lib/checkexceptionsafety.cpp @@ -63,13 +63,13 @@ void CheckExceptionSafety::destructors() for (const Token *tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { // Skip try blocks if (Token::simpleMatch(tok, "try {")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); } // Skip uncaught exceptions else if (Token::simpleMatch(tok, "if ( ! std :: uncaught_exception ( ) ) {")) { - tok = tok->next()->link(); // end of if ( ... ) - tok = tok->next()->link(); // end of { ... } + tok = tok->linkAt(1); // end of if ( ... ) + tok = tok->linkAt(1); // end of { ... } } // throw found within a destructor @@ -183,8 +183,8 @@ void CheckExceptionSafety::checkRethrowCopy() const unsigned int varid = scope.bodyStart->tokAt(-2)->varId(); if (varid) { for (const Token* tok = scope.bodyStart->next(); tok && tok != scope.bodyEnd; tok = tok->next()) { - if (Token::simpleMatch(tok, "catch (") && tok->next()->link() && tok->next()->link()->next()) { // Don't check inner catch - it is handled in another iteration of outer loop. - tok = tok->next()->link()->next()->link(); + if (Token::simpleMatch(tok, "catch (") && tok->linkAt(1) && tok->linkAt(1)->next()) { // Don't check inner catch - it is handled in another iteration of outer loop. + tok = tok->linkAt(1)->next()->link(); if (!tok) break; } else if (Token::Match(tok, "%varid% .", varid)) { diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 2f3a26a58f5..d71865c3312 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -701,7 +701,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken, continue; functionCall(ftok, openingPar, varInfo, allocation, af); - tok = ftok->next()->link(); + tok = ftok->linkAt(1); // Handle scopes that might be noreturn if (allocation.status == VarInfo::NOALLOC && Token::simpleMatch(tok, ") ; }")) { diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index e9f7d4100aa..37ac45ca21b 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -1103,7 +1103,7 @@ void CheckMemoryLeakNoVar::checkForUnsafeArgAlloc(const Scope *scope) for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) { if (Token::Match(tok, "%name% (")) { - const Token *endParamToken = tok->next()->link(); + const Token *endParamToken = tok->linkAt(1); const Token* pointerType = nullptr; const Token* functionCalled = nullptr; diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 35a0219276b..6e034738260 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -285,7 +285,7 @@ void CheckNullPointer::nullPointerByDeRefAndChec() for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { if (isUnevaluated(tok)) { - tok = tok->next()->link(); + tok = tok->linkAt(1); continue; } @@ -347,7 +347,7 @@ void CheckNullPointer::nullConstantDereference() for (; tok != scope->bodyEnd; tok = tok->next()) { if (isUnevaluated(tok)) - tok = tok->next()->link(); + tok = tok->linkAt(1); else if (Token::simpleMatch(tok, "* 0")) { if (Token::Match(tok->previous(), "return|throw|;|{|}|:|[|(|,") || tok->previous()->isOp()) { @@ -355,7 +355,7 @@ void CheckNullPointer::nullConstantDereference() } } - else if (Token::Match(tok, "0 [") && (tok->previous()->str() != "&" || !Token::Match(tok->next()->link()->next(), "[.(]"))) + else if (Token::Match(tok, "0 [") && (tok->previous()->str() != "&" || !Token::Match(tok->linkAt(1)->next(), "[.(]"))) nullPointerError(tok); else if (Token::Match(tok->previous(), "!!. %name% (|{") && (tok->previous()->str() != "::" || tok->strAt(-2) == "std")) { diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 13fc6359078..6b99f9d64f4 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -3215,7 +3215,7 @@ void CheckOther::checkInterlockedDecrement() raceAfterInterlockedDecrementError(checkStartTok); } } else if (Token::Match(tok, "if ( ::| InterlockedDecrement ( & %name%")) { - const Token* condEnd = tok->next()->link(); + const Token* condEnd = tok->linkAt(1); const Token* funcTok = tok->tokAt(2); const Token* firstAccessTok = funcTok->str() == "::" ? funcTok->tokAt(4) : funcTok->tokAt(3); if (condEnd && condEnd->next() && condEnd->next()->link()) { diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 07453a26f49..61deb6d0d57 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -1110,7 +1110,7 @@ void CheckStl::invalidContainer() for (const Scope * scope : symbolDatabase->functionScopes) { for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { if (const Token* contTok = getLoopContainer(tok)) { - const Token* blockStart = tok->next()->link()->next(); + const Token* blockStart = tok->linkAt(1)->next(); const Token* blockEnd = blockStart->link(); if (contTok->exprId() == 0) continue; @@ -1688,7 +1688,7 @@ void CheckStl::checkFindInsert() for (const Token *tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { if (!Token::simpleMatch(tok, "if (")) continue; - if (!Token::simpleMatch(tok->next()->link(), ") {")) + if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; if (!Token::Match(tok->next()->astOperand2(), "%comp%")) continue; @@ -1702,7 +1702,7 @@ void CheckStl::checkFindInsert() if (mSettings->standards.cpp < Standards::CPP17 && !(keyTok && keyTok->valueType() && (keyTok->valueType()->isIntegral() || keyTok->valueType()->pointer > 0))) continue; - const Token *thenTok = tok->next()->link()->next(); + const Token *thenTok = tok->linkAt(1)->next(); const Token *valueTok = findInsertValue(thenTok, containerTok, keyTok, *mSettings); if (!valueTok) continue; @@ -2040,7 +2040,7 @@ void CheckStl::string_c_str() else break; if (!tok2 && j == i->second.n - 1) - tok2 = tok->next()->link(); + tok2 = tok->linkAt(1); else if (tok2) tok2 = tok2->previous(); else @@ -2420,7 +2420,7 @@ void CheckStl::checkDereferenceInvalidIterator2() for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { if (Token::Match(tok, "sizeof|decltype|typeid|typeof (")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); continue; } @@ -2742,7 +2742,7 @@ namespace { std::set varsChanged; explicit LoopAnalyzer(const Token* tok, const Settings* psettings) - : bodyTok(tok->next()->link()->next()), settings(psettings) + : bodyTok(tok->linkAt(1)->next()), settings(psettings) { const Token* splitTok = tok->next()->astOperand2(); if (Token::simpleMatch(splitTok, ":") && splitTok->previous()->varId() != 0) { @@ -2893,7 +2893,7 @@ void CheckStl::useStlAlgorithm() // Parse range-based for loop if (!Token::simpleMatch(tok, "for (")) continue; - if (!Token::simpleMatch(tok->next()->link(), ") {")) + if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; LoopAnalyzer a{tok, mSettings}; std::string algoName = a.findAlgo(); @@ -2902,7 +2902,7 @@ void CheckStl::useStlAlgorithm() continue; } - const Token *bodyTok = tok->next()->link()->next(); + const Token *bodyTok = tok->linkAt(1)->next(); const Token *splitTok = tok->next()->astOperand2(); const Token* loopVar{}; bool isIteratorLoop = false; @@ -3114,7 +3114,7 @@ void CheckStl::knownEmptyContainer() // Parse range-based for loop if (tok->str() == "for") { - if (!Token::simpleMatch(tok->next()->link(), ") {")) + if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; const Token *splitTok = tok->next()->astOperand2(); if (!Token::simpleMatch(splitTok, ":")) diff --git a/lib/checkstring.cpp b/lib/checkstring.cpp index 5024b4a5155..43b2ffe922b 100644 --- a/lib/checkstring.cpp +++ b/lib/checkstring.cpp @@ -287,8 +287,8 @@ void CheckString::checkIncorrectStringCompare() // skip "assert(str && ..)" and "assert(.. && str)" if ((endsWith(tok->str(), "assert") || endsWith(tok->str(), "ASSERT")) && Token::Match(tok, "%name% (") && - (Token::Match(tok->tokAt(2), "%str% &&") || Token::Match(tok->next()->link()->tokAt(-2), "&& %str% )"))) - tok = tok->next()->link(); + (Token::Match(tok->tokAt(2), "%str% &&") || Token::Match(tok->linkAt(1)->tokAt(-2), "&& %str% )"))) + tok = tok->linkAt(1); if (Token::simpleMatch(tok, ". substr (") && Token::Match(tok->tokAt(3)->nextArgument(), "%num% )")) { const MathLib::biguint clen = MathLib::toBigUNumber(tok->linkAt(2)->strAt(-1)); diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 90a6b252394..a053c811a75 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -503,7 +503,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var } // goto the { - tok = tok->next()->link()->next(); + tok = tok->linkAt(1)->next(); if (!tok) break; @@ -583,7 +583,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var // = { .. } else if (Token::simpleMatch(tok, "= {") || (Token::Match(tok, "%name% {") && tok->variable() && tok == tok->variable()->nameToken())) { // end token - const Token *end = tok->next()->link(); + const Token *end = tok->linkAt(1); // If address of variable is taken in the block then bail out if (var.isPointer() || var.isArray()) { @@ -630,7 +630,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var return true; // goto the { - const Token *tok2 = forwhile ? tok->next()->link()->next() : tok->next(); + const Token *tok2 = forwhile ? tok->linkAt(1)->next() : tok->next(); if (tok2 && tok2->str() == "{") { const bool init = checkLoopBody(tok2, var, *alloc, membervar, (number_of_if > 0) || suppressErrors); @@ -642,7 +642,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var // is variable used in for-head? bool initcond = false; if (!suppressErrors) { - const Token *startCond = forwhile ? tok->next() : tok->next()->link()->tokAt(2); + const Token *startCond = forwhile ? tok->next() : tok->linkAt(1)->tokAt(2); initcond = checkIfForWhileHead(startCond, var, false, bool(number_of_if == 0), *alloc, membervar); } diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 58c016272bb..ebc2e213ed3 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1069,8 +1069,8 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const } else if (Token::Match(tok, "[(,] & %var% [,)]")) { variables.eraseAll(tok->tokAt(2)->varId()); } else if (Token::Match(tok, "[(,] (") && - Token::Match(tok->next()->link(), ") %var% [,)[]")) { - variables.use(tok->next()->link()->next()->varId(), tok); // use = read + write + Token::Match(tok->linkAt(1), ") %var% [,)[]")) { + variables.use(tok->linkAt(1)->next()->varId(), tok); // use = read + write } else if (Token::Match(tok, "[(,] *| *| %var%")) { const Token* vartok = tok->next(); while (vartok->str() == "*") diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index d299624cc2b..21988d44a7b 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -656,13 +656,13 @@ namespace { return Break(); } } else if (tok->isControlFlowKeyword() && Token::Match(tok, "if|while|for (") && - Token::simpleMatch(tok->next()->link(), ") {")) { + Token::simpleMatch(tok->linkAt(1), ") {")) { if ((settings.vfOptions.maxForwardBranches > 0) && (++branchCount > settings.vfOptions.maxForwardBranches)) { // TODO: should be logged on function-level instead of file-level reportError(Severity::information, "normalCheckLevelMaxBranches", "Limiting analysis of branches. Use --check-level=exhaustive to analyze all branches."); return Break(Analyzer::Terminate::Bail); } - Token* endCond = tok->next()->link(); + Token* endCond = tok->linkAt(1); Token* endBlock = endCond->next()->link(); Token* condTok = getCondTok(tok); Token* initTok = getInitTok(tok); @@ -769,7 +769,7 @@ namespace { } } } else if (Token::simpleMatch(tok, "try {")) { - Token* endBlock = tok->next()->link(); + Token* endBlock = tok->linkAt(1); ForwardTraversal tryTraversal = fork(); tryTraversal.updateScope(endBlock, depth - 1); bool bail = tryTraversal.actions.isModified(); @@ -792,7 +792,7 @@ namespace { return Break(); tok = endBlock; } else if (Token::simpleMatch(tok, "do {")) { - Token* endBlock = tok->next()->link(); + Token* endBlock = tok->linkAt(1); Token* condTok = Token::simpleMatch(endBlock, "} while (") ? endBlock->tokAt(2)->astOperand2() : nullptr; if (updateLoop(end, endBlock, condTok) == Progress::Break) return Break(); diff --git a/lib/pathanalysis.cpp b/lib/pathanalysis.cpp index 1ad6a941a72..0957d1b930b 100644 --- a/lib/pathanalysis.cpp +++ b/lib/pathanalysis.cpp @@ -123,14 +123,14 @@ PathAnalysis::Progress PathAnalysis::forwardRange(const Token* startToken, const if (Token::simpleMatch(tok, "} else {")) { tok = tok->linkAt(2); } - } else if (Token::Match(tok, "if|while|for (") && Token::simpleMatch(tok->next()->link(), ") {")) { - const Token * endCond = tok->next()->link(); + } else if (Token::Match(tok, "if|while|for (") && Token::simpleMatch(tok->linkAt(1), ") {")) { + const Token * endCond = tok->linkAt(1); const Token * endBlock = endCond->next()->link(); const Token * condTok = getCondTok(tok); if (!condTok) continue; // Traverse condition - if (forwardRange(tok->next(), tok->next()->link(), info, f) == Progress::Break) + if (forwardRange(tok->next(), tok->linkAt(1), info, f) == Progress::Break) return Progress::Break; Info i = info; i.known = false; diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 7d900e6a44c..429fee1eb07 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -423,13 +423,13 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // unnamed struct and union else if (tok->isKeyword() && Token::Match(tok, "struct|union {") && - Token::Match(tok->next()->link(), "} *|&| %name% ;|[|=")) { + Token::Match(tok->linkAt(1), "} *|&| %name% ;|[|=")) { scopeList.emplace_back(this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; - const Token* varNameTok = tok->next()->link()->next(); + const Token* varNameTok = tok->linkAt(1)->next(); if (varNameTok->str() == "*") { varNameTok = varNameTok->next(); } else if (varNameTok->str() == "&") { @@ -464,7 +464,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // anonymous struct, union and namespace else if (tok->isKeyword() && ((Token::Match(tok, "struct|union {") && - Token::simpleMatch(tok->next()->link(), "} ;")) || + Token::simpleMatch(tok->linkAt(1), "} ;")) || Token::simpleMatch(tok, "namespace {"))) { scopeList.emplace_back(this, tok, scope); @@ -713,8 +713,8 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() tok = tok1; scope->nestedList.push_back(&scopeList.back()); scope = &scopeList.back(); - } else if (tok->isKeyword() && Token::Match(tok, "if|for|while|catch|switch (") && Token::simpleMatch(tok->next()->link(), ") {")) { - const Token *scopeStartTok = tok->next()->link()->next(); + } else if (tok->isKeyword() && Token::Match(tok, "if|for|while|catch|switch (") && Token::simpleMatch(tok->linkAt(1), ") {")) { + const Token *scopeStartTok = tok->linkAt(1)->next(); if (tok->str() == "if") scopeList.emplace_back(this, tok, scope, Scope::eIf, scopeStartTok); else if (tok->str() == "for") { @@ -734,7 +734,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() scope->checkVariable(tok->tokAt(2), AccessControl::Throw, mSettings); // check for variable declaration and add it to new scope if found tok = scopeStartTok; } else if (Token::Match(tok, "%var% {")) { - endInitList.emplace(tok->next()->link(), scope); + endInitList.emplace(tok->linkAt(1), scope); tok = tok->next(); } else if (const Token *lambdaEndToken = findLambdaEndToken(tok)) { tok = addLambda(tok, lambdaEndToken); @@ -1153,7 +1153,7 @@ void SymbolDatabase::createSymbolDatabaseSetFunctionPointers(bool firstPass) if (inTemplateArg == tok) inTemplateArg = nullptr; if (tok->isName() && !tok->function() && tok->varId() == 0 && ((tok->astParent() && tok->astParent()->isComparisonOp()) || Token::Match(tok, "%name% [{(,)>;]")) && !isReservedName(tok)) { - if (tok->next()->str() == ">" && !tok->next()->link()) + if (tok->next()->str() == ">" && !tok->linkAt(1)) continue; const Function *function = findFunction(tok); @@ -1348,14 +1348,14 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers() // func(...).var // func(...)[...].var else if (tok->function() && tok->next()->str() == "(" && - (Token::Match(tok->next()->link(), ") . %name% !!(") || - (Token::Match(tok->next()->link(), ") [") && Token::Match(tok->next()->link()->next()->link(), "] . %name% !!(")))) { + (Token::Match(tok->linkAt(1), ") . %name% !!(") || + (Token::Match(tok->linkAt(1), ") [") && Token::Match(tok->linkAt(1)->next()->link(), "] . %name% !!(")))) { const Type *type = tok->function()->retType; Token* membertok; - if (tok->next()->link()->next()->str() == ".") - membertok = tok->next()->link()->next()->next(); + if (tok->linkAt(1)->next()->str() == ".") + membertok = tok->linkAt(1)->next()->next(); else - membertok = tok->next()->link()->next()->link()->next()->next(); + membertok = tok->linkAt(1)->next()->link()->next()->next(); if (type) { const Variable *membervar = membertok->variable(); if (!membervar) { @@ -1376,12 +1376,12 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers() } } else if (Token::simpleMatch(tok->astParent(), ".") && tok->next()->str() == "(" && - astIsContainer(tok->astParent()->astOperand1()) && Token::Match(tok->next()->link(), ") . %name% !!(")) { + astIsContainer(tok->astParent()->astOperand1()) && Token::Match(tok->linkAt(1), ") . %name% !!(")) { const ValueType* vt = tok->astParent()->astOperand1()->valueType(); const Library::Container* cont = vt->container; auto it = cont->functions.find(tok->str()); if (it != cont->functions.end() && isContainerYieldElement(it->second.yield) && vt->containerTypeToken) { - Token* memberTok = tok->next()->link()->tokAt(2); + Token* memberTok = tok->linkAt(1)->tokAt(2); const Scope* scope = vt->containerTypeToken->scope(); const Type* contType{}; const std::string& typeStr = vt->containerTypeToken->str(); // TODO: handle complex type expressions @@ -1657,8 +1657,8 @@ void SymbolDatabase::createSymbolDatabaseExprIds() std::unordered_map unknownConstantIds; const Token* inConstExpr = nullptr; for (const Token* tok = mTokenizer.list.front(); tok != mTokenizer.list.back(); tok = tok->next()) { - if (Token::Match(tok, "decltype|sizeof|typeof (") && tok->next()->link()) { - tok = tok->next()->link()->previous(); + if (Token::Match(tok, "decltype|sizeof|typeof (") && tok->linkAt(1)) { + tok = tok->linkAt(1)->previous(); } else if (tok == inConstExpr) { inConstExpr = nullptr; } else if (inConstExpr) { @@ -1673,7 +1673,7 @@ void SymbolDatabase::createSymbolDatabaseExprIds() } else if (tok->link() && tok->str() == "<") { inConstExpr = tok->link(); } else if (Token::Match(tok, "%var% [") && tok->variable() && tok->variable()->nameToken() == tok) { - inConstExpr = tok->next()->link(); + inConstExpr = tok->linkAt(1); } } @@ -1724,7 +1724,7 @@ void SymbolDatabase::createSymbolDatabaseExprIds() if (tok->isControlFlowKeyword()) continue; - if (Token::Match(tok, "%name% <") && tok->next()->link()) { + if (Token::Match(tok, "%name% <") && tok->linkAt(1)) { tok->exprId(id); ++id; } else { @@ -1923,7 +1923,7 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const } } - else if (!tok->isName() || !tok->next() || !tok->next()->link()) + else if (!tok->isName() || !tok->next() || !tok->linkAt(1)) return false; // regular function? @@ -1931,7 +1931,7 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const (Token::Match(tok->previous(), "%name%|>|&|&&|*|::|~") || // Either a return type or scope qualifier in front of tok outerScope->isClassOrStructOrUnion())) { // or a ctor/dtor const Token* tok1 = tok->previous(); - const Token* tok2 = tok->next()->link()->next(); + const Token* tok2 = tok->linkAt(1)->next(); if (!Tokenizer::isFunctionHead(tok->next(), ";:{")) return false; @@ -2052,10 +2052,10 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const } // template constructor? - else if (Token::Match(tok, "%name% <") && Token::simpleMatch(tok->next()->link(), "> (")) { + else if (Token::Match(tok, "%name% <") && Token::simpleMatch(tok->linkAt(1), "> (")) { if (tok->isKeyword() || tok->isStandardType() || !outerScope->isClassOrStructOrUnion()) return false; - const Token* tok2 = tok->next()->link()->next()->link(); + const Token* tok2 = tok->linkAt(1)->next()->link(); if (Token::Match(tok2, ") const| ;|{|=") || Token::Match(tok2, ") : ::| %name% (|::|<|{") || Token::Match(tok2, ") const| noexcept {|;|(")) { @@ -3299,7 +3299,7 @@ void SymbolDatabase::addClassFunction(Scope *&scope, const Token *&tok, const To Function * func = findFunctionInScope(tok1, it2->scope, path, path_length); if (func) { if (!func->hasBody()) { - const Token *closeParen = tok->next()->link(); + const Token *closeParen = tok->linkAt(1); if (closeParen) { const Token *eq = Tokenizer::isFunctionHead(closeParen, ";"); if (eq && Token::simpleMatch(eq->tokAt(-2), "= default ;")) { @@ -3372,7 +3372,7 @@ void SymbolDatabase::addClassFunction(Scope *&scope, const Token *&tok, const To auto * func = const_cast(it->second); if (!func->hasBody()) { if (func->argsMatch(scope1, func->argDef, tok->next(), path, path_length)) { - const Token *closeParen = tok->next()->link(); + const Token *closeParen = tok->linkAt(1); if (closeParen) { const Token *eq = Tokenizer::isFunctionHead(closeParen, ";"); if (eq && Token::simpleMatch(eq->tokAt(-2), "= default ;")) { @@ -4451,7 +4451,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s // skip array dimension(s) tok = tok->link(); while (tok->next()->str() == "[") - tok = tok->next()->link(); + tok = tok->linkAt(1); } else if (tok->str() == "<") { tok = tok->link(); if (!tok) // something is wrong so just bail out @@ -4815,11 +4815,11 @@ void Scope::getVariableList(const Settings& settings, const Token* start, const break; } if (tok->isKeyword() && Token::Match(tok, "struct|union {")) { - if (Token::Match(tok->next()->link(), "} %name% ;|[")) { - tok = tok->next()->link()->tokAt(2); + if (Token::Match(tok->linkAt(1), "} %name% ;|[")) { + tok = tok->linkAt(1)->tokAt(2); continue; } - if (Token::simpleMatch(tok->next()->link(), "} ;")) { + if (Token::simpleMatch(tok->linkAt(1), "} ;")) { tok = tok->next(); continue; } diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index fc6e7b585eb..3b991d80ab3 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -296,11 +296,11 @@ void TemplateSimplifier::checkComplicatedSyntaxErrorsInTemplates() // skip executing scopes (ticket #1985).. else if (Token::simpleMatch(tok, "try {")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); while (Token::simpleMatch(tok, "} catch (")) { tok = tok->linkAt(2); if (Token::simpleMatch(tok, ") {")) - tok = tok->next()->link(); + tok = tok->linkAt(1); } } @@ -2803,7 +2803,7 @@ bool TemplateSimplifier::simplifyCalculations(Token* frontToken, const Token *ba validTokenEnd(bounded, tok, backToken, 2))))) { tok->deleteNext(); if (tok->next()->str() == "(") - eraseTokens(tok, tok->next()->link()); + eraseTokens(tok, tok->linkAt(1)); tok->deleteNext(); ret = true; } else if (validTokenEnd(bounded, tok, backToken, 4) && @@ -2812,7 +2812,7 @@ bool TemplateSimplifier::simplifyCalculations(Token* frontToken, const Token *ba tok->deleteNext(); tok->deleteNext(); if (tok->next()->str() == "(") - eraseTokens(tok, tok->next()->link()); + eraseTokens(tok, tok->linkAt(1)); tok->deleteNext(); ret = true; } @@ -2824,7 +2824,7 @@ bool TemplateSimplifier::simplifyCalculations(Token* frontToken, const Token *ba Token::Match(tok->previous(), "return|case 1 %oror% %any% ,|:|;|=|%cop%"))) { tok->deleteNext(); if (tok->next()->str() == "(") - eraseTokens(tok, tok->next()->link()); + eraseTokens(tok, tok->linkAt(1)); tok->deleteNext(); ret = true; } else if (validTokenEnd(bounded, tok, backToken, 4) && @@ -2833,7 +2833,7 @@ bool TemplateSimplifier::simplifyCalculations(Token* frontToken, const Token *ba tok->deleteNext(); tok->deleteNext(); if (tok->next()->str() == "(") - eraseTokens(tok, tok->next()->link()); + eraseTokens(tok, tok->linkAt(1)); tok->deleteNext(); ret = true; } diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 63866954e00..58d8c8d8eea 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3718,9 +3718,9 @@ void Tokenizer::simplifyRedundantConsecutiveBraces() for (Token *tok = list.front(); tok;) { if (Token::simpleMatch(tok, "= {")) { tok = tok->linkAt(1); - } else if (Token::simpleMatch(tok, "{ {") && Token::simpleMatch(tok->next()->link(), "} }")) { + } else if (Token::simpleMatch(tok, "{ {") && Token::simpleMatch(tok->linkAt(1), "} }")) { //remove internal parentheses - tok->next()->link()->deleteThis(); + tok->linkAt(1)->deleteThis(); tok->deleteNext(); } else tok = tok->next(); @@ -5554,7 +5554,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) // if (x) MACRO() .. for (const Token *tok = list.front(); tok; tok = tok->next()) { if (Token::simpleMatch(tok, "if (")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); if (Token::Match(tok, ") %name% (") && tok->next()->isUpperCaseName() && Token::Match(tok->linkAt(2), ") {|else")) { @@ -6901,7 +6901,7 @@ void Tokenizer::simplifyFunctionParameters() tok->linenr(tok->previous()->linenr()); } //goto forward and continue - tok = tok->next()->link(); + tok = tok->linkAt(1); } } } @@ -6934,7 +6934,7 @@ void Tokenizer::simplifyFunctionPointers() // #2873 - do not simplify function pointer usage here: // (void)(xy(*p)(0)); if (Token::simpleMatch(tok, ") (")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); continue; } @@ -7069,14 +7069,14 @@ void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, co if (Token::Match(tok, "class|struct|namespace|union")) scopeDecl = true; if (Token::Match(tok, "decltype|noexcept (")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); // skip decltype(...){...} if (tok && Token::simpleMatch(tok->previous(), ") {")) tok = tok->link(); } else if (Token::simpleMatch(tok, "= {") || (!scopeDecl && Token::Match(tok, "%name%|> {") && !Token::Match(tok, "else|try|do|const|constexpr|override|volatile|noexcept"))) { - if (!tok->next()->link()) + if (!tok->linkAt(1)) syntaxError(tokBegin); // Check for lambdas before skipping if (Token::Match(tok->tokAt(-2), ") . %name%")) { // trailing return type @@ -7088,18 +7088,18 @@ void Tokenizer::simplifyVarDecl(Token * tokBegin, const Token * const tokEnd, co if (lambdaEnd) simplifyVarDecl(lambdaEnd->link()->next(), lambdaEnd, only_k_r_fpar); } else { - for (Token* tok2 = tok->next(); tok2 != tok->next()->link(); tok2 = tok2->next()) { + for (Token* tok2 = tok->next(); tok2 != tok->linkAt(1); tok2 = tok2->next()) { Token* lambdaEnd = findLambdaEndScope(tok2); if (!lambdaEnd) continue; simplifyVarDecl(lambdaEnd->link()->next(), lambdaEnd, only_k_r_fpar); } } - tok = tok->next()->link(); + tok = tok->linkAt(1); } } else if (Token::simpleMatch(tok, "= {")) { - tok = tok->next()->link(); + tok = tok->linkAt(1); } if (!tok) { syntaxError(tokBegin); @@ -7843,7 +7843,7 @@ bool Tokenizer::simplifyRedundantParentheses() } while (Token::simpleMatch(tok, "( (") && - tok->link() && tok->link()->previous() == tok->next()->link()) { + tok->link() && tok->link()->previous() == tok->linkAt(1)) { // We have "(( *something* ))", remove the inner // parentheses tok->deleteNext(); @@ -8002,7 +8002,7 @@ void Tokenizer::simplifyTypeIntrinsics() auto p = intrinsics.find(tok->str()); if (p == intrinsics.end()) continue; - Token * end = tok->next()->link(); + Token * end = tok->linkAt(1); Token * prev = tok->previous(); tok->str(p->second); prev->insertToken("::"); @@ -8263,7 +8263,7 @@ static bool isCPPAttribute(const Token * tok) static bool isAlignAttribute(const Token * tok) { - return Token::simpleMatch(tok, "alignas (") && tok->next()->link(); + return Token::simpleMatch(tok, "alignas (") && tok->linkAt(1); } template @@ -8272,7 +8272,7 @@ static T* skipCPPOrAlignAttribute(T * tok) if (isCPPAttribute(tok)) return tok->link(); if (isAlignAttribute(tok)) { - return tok->next()->link(); + return tok->linkAt(1); } return tok; } @@ -8599,7 +8599,7 @@ void Tokenizer::findGarbageCode() const // count number of semicolons int semicolons = 0, colons = 0; const Token* const startTok = tok; - tok = tok->next()->link()->previous(); // find ")" of the for-loop + tok = tok->linkAt(1)->previous(); // find ")" of the for-loop // walk backwards until we find the beginning (startTok) of the for() again for (; tok != startTok; tok = tok->previous()) { if (tok->str() == ";") { // do the counting @@ -8933,7 +8933,7 @@ void Tokenizer::simplifyStructDecl() continue; // check for anonymous struct/union if (Token::Match(tok, "struct|union {")) { - if (Token::Match(tok->next()->link(), "} const| *|&| const| %type% ,|;|[|(|{|=")) { + if (Token::Match(tok->linkAt(1), "} const| *|&| const| %type% ,|;|[|(|{|=")) { tok->insertToken("Anonymous" + std::to_string(count++)); } } @@ -9144,9 +9144,9 @@ void Tokenizer::simplifyDeclspec() functok->isAttributeExport(true); } } else if (tok->strAt(2) == "property") - tok->next()->link()->insertToken("__property"); + tok->linkAt(1)->insertToken("__property"); - Token::eraseTokens(tok, tok->next()->link()->next()); + Token::eraseTokens(tok, tok->linkAt(1)->next()); tok->deleteThis(); } } @@ -9567,9 +9567,9 @@ void Tokenizer::simplifyAsm() std::string instruction; for (Token *tok = list.front(); tok; tok = tok->next()) { if (Token::Match(tok, "__asm|_asm|asm {") && - tok->next()->link()->next()) { - instruction = tok->tokAt(2)->stringifyList(tok->next()->link()); - Token::eraseTokens(tok, tok->next()->link()->next()); + tok->linkAt(1)->next()) { + instruction = tok->tokAt(2)->stringifyList(tok->linkAt(1)); + Token::eraseTokens(tok, tok->linkAt(1)->next()); } else if (Token::Match(tok, "asm|__asm|__asm__ volatile|__volatile|__volatile__| (")) { @@ -9662,7 +9662,7 @@ void Tokenizer::simplifyAsm2() start = start->previous(); } - const Token *last = tok->next()->link(); + const Token *last = tok->linkAt(1); if (Token::simpleMatch(last, ") {")) last = last->linkAt(1); last = last->next(); @@ -9904,7 +9904,7 @@ void Tokenizer::simplifyMicrosoftMemoryFunctions() Token *tok2 = tok1->nextArgument(); // Third argument if (tok2) - Token::move(tok1->previous(), tok2->tokAt(-2), tok->next()->link()->previous()); // Swap third with second argument + Token::move(tok1->previous(), tok2->tokAt(-2), tok->linkAt(1)->previous()); // Swap third with second argument } } else if (Token::Match(tok, "ZeroMemory|RtlZeroMemory|RtlZeroBytes|RtlSecureZeroMemory")) { // ZeroMemory(dst, len) -> memset(dst, 0, len) @@ -10084,7 +10084,7 @@ bool Tokenizer::operatorEnd(const Token * tok) tok = tok->link()->next(); } } else if (tok->str() == "throw" && tok->next() && tok->next()->str() == "(") { - tok = tok->next()->link()->next(); + tok = tok->linkAt(1)->next(); } // unknown macros ") MACRO {" and ") MACRO(...) {" else if (tok->isUpperCaseName()) { diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 71ad1fadf76..08aa54f22a0 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -804,7 +804,7 @@ static void compileTerm(Token *&tok, AST_state& state) repeat = true; } if (Token::simpleMatch(tok->next(), "<") && Token::Match(tok->linkAt(1), "> %name%")) { - tok = tok->next()->link()->next(); + tok = tok->linkAt(1)->next(); repeat = true; } } @@ -1597,7 +1597,7 @@ static Token * createAstAtToken(Token *tok) compileExpression(tok3, state1); } Token *init1 = nullptr; - Token * const endPar = tok->next()->link(); + Token * const endPar = tok->linkAt(1); if (tok2 == tok->tokAt(2) && Token::Match(tok2, "%op%|(")) { init1 = tok2; AST_state state1(cpp); diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 8b72c91d502..217b8821786 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -583,7 +583,7 @@ static void valueFlowArray(TokenList &tokenlist, const Settings &settings) // const array decl else if (tok->variable() && tok->variable()->isArray() && tok->variable()->isConst() && tok->variable()->nameToken() == tok && Token::Match(tok, "%var% [ %num%| ] = {")) { - Token* rhstok = tok->next()->link()->tokAt(2); + Token* rhstok = tok->linkAt(1)->tokAt(2); constantArrays[tok->varId()] = rhstok; tok = rhstok->link(); } @@ -604,7 +604,7 @@ static void valueFlowArray(TokenList &tokenlist, const Settings &settings) if (Token::Match(tok, "const %type% %var% [ %num%| ] = {")) { Token *vartok = tok->tokAt(2); - Token *rhstok = vartok->next()->link()->tokAt(2); + Token *rhstok = vartok->linkAt(1)->tokAt(2); constantArrays[vartok->varId()] = rhstok; tok = rhstok->link(); continue; @@ -612,7 +612,7 @@ static void valueFlowArray(TokenList &tokenlist, const Settings &settings) if (Token::Match(tok, "const char %var% [ %num%| ] = %str% ;")) { Token *vartok = tok->tokAt(2); - Token *strtok = vartok->next()->link()->tokAt(2); + Token *strtok = vartok->linkAt(1)->tokAt(2); constantArrays[vartok->varId()] = strtok; tok = strtok->next(); continue; @@ -4191,7 +4191,7 @@ static void valueFlowLifetime(TokenList &tokenlist, ErrorLogger &errorLogger, co valueFlowLifetimeConstructor(tok->next(), tokenlist, errorLogger, settings); } // Check function calls - else if (Token::Match(tok, "%name% (") && !Token::simpleMatch(tok->next()->link(), ") {")) { + else if (Token::Match(tok, "%name% (") && !Token::simpleMatch(tok->linkAt(1), ") {")) { valueFlowLifetimeFunction(tok, tokenlist, errorLogger, settings); } // Unique pointer lifetimes