From 5d379b1ea195f0f95f9b60daae8d940729c892a8 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 16 Jun 2026 10:47:13 +0200 Subject: [PATCH 1/5] checkstl.cpp: pass `Settings` by reference --- lib/checkstl.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index c8fcca48f1a..3fce6fd675d 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2869,10 +2869,10 @@ namespace { struct LoopAnalyzer { const Token* bodyTok = nullptr; const Token* loopVar = nullptr; - const Settings* settings = nullptr; + const Settings& settings; std::set varsChanged; - explicit LoopAnalyzer(const Token* tok, const Settings* psettings) + explicit LoopAnalyzer(const Token* tok, const Settings& psettings) : bodyTok(tok->linkAt(1)->next()), settings(psettings) { const Token* splitTok = tok->next()->astOperand2(); @@ -2894,11 +2894,11 @@ namespace { int n = 1 + (astIsPointer(tok) ? 1 : 0); for (int i = 0; i < n; i++) { bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, i, *settings, &inconclusive)) + if (isVariableChangedByFunctionCall(tok, i, settings, &inconclusive)) return true; if (inconclusive) return true; - if (isVariableChanged(tok, i, *settings)) + if (isVariableChanged(tok, i, settings)) return true; } return false; @@ -3044,7 +3044,7 @@ void CheckStlImpl::useStlAlgorithm() continue; if (!Token::simpleMatch(tok->linkAt(1), ") {")) continue; - LoopAnalyzer a{tok, &mSettings}; + LoopAnalyzer a{tok, mSettings}; std::string algoName = a.findAlgo(); if (!algoName.empty()) { useStlAlgorithmError(tok, algoName); From d5f61d0dcb3c7f352ba025eb18ebe42f21fb4e89 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 18 Jun 2026 11:05:30 +0200 Subject: [PATCH 2/5] checkstl.cpp: cleaned up `LoopAnalyzer` access --- lib/checkstl.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 3fce6fd675d..c9a78c8d983 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2867,11 +2867,13 @@ static bool isTernaryAssignment(const Token* assignTok, nonneg int loopVarId, no namespace { struct LoopAnalyzer { - const Token* bodyTok = nullptr; - const Token* loopVar = nullptr; + private: + const Token* bodyTok; + const Token* loopVar{}; const Settings& settings; std::set varsChanged; + public: explicit LoopAnalyzer(const Token* tok, const Settings& psettings) : bodyTok(tok->linkAt(1)->next()), settings(psettings) { @@ -2883,6 +2885,7 @@ namespace { findChangedVariables(); } } + private: bool isLoopVarChanged() const { return varsChanged.count(loopVar->varId()) > 0; } @@ -2934,6 +2937,7 @@ namespace { return bodyTok && loopVar; } + public: std::string findAlgo() const { if (!valid()) @@ -2965,7 +2969,7 @@ namespace { } return ""; } - + private: bool isLocalVar(const Variable* var) const { if (!var) @@ -2978,7 +2982,6 @@ namespace { return scope && scope->isNestedIn(bodyTok->scope()); } - private: void findChangedVariables() { std::set vars; From a01d966b4125618b132392a0660ffa896f5641be Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 18 Jun 2026 12:32:11 +0200 Subject: [PATCH 3/5] checkstl.cpp: fixed `naming-privateMemberVariable` selfcheck warnings --- lib/checkstl.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index c9a78c8d983..fcda7245c7c 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2868,18 +2868,18 @@ static bool isTernaryAssignment(const Token* assignTok, nonneg int loopVarId, no namespace { struct LoopAnalyzer { private: - const Token* bodyTok; - const Token* loopVar{}; - const Settings& settings; - std::set varsChanged; + const Token* mBodyTok; + const Token* mLoopVar{}; + const Settings& mSettings; + std::set mVarsChanged; public: explicit LoopAnalyzer(const Token* tok, const Settings& psettings) - : bodyTok(tok->linkAt(1)->next()), settings(psettings) + : mBodyTok(tok->linkAt(1)->next()), mSettings(psettings) { const Token* splitTok = tok->next()->astOperand2(); if (Token::simpleMatch(splitTok, ":") && splitTok->previous()->varId() != 0) { - loopVar = splitTok->previous(); + mLoopVar = splitTok->previous(); } if (valid()) { findChangedVariables(); @@ -2887,7 +2887,7 @@ namespace { } private: bool isLoopVarChanged() const { - return varsChanged.count(loopVar->varId()) > 0; + return mVarsChanged.count(mLoopVar->varId()) > 0; } bool isModified(const Token* tok) const @@ -2897,11 +2897,11 @@ namespace { int n = 1 + (astIsPointer(tok) ? 1 : 0); for (int i = 0; i < n; i++) { bool inconclusive = false; - if (isVariableChangedByFunctionCall(tok, i, settings, &inconclusive)) + if (isVariableChangedByFunctionCall(tok, i, mSettings, &inconclusive)) return true; if (inconclusive) return true; - if (isVariableChanged(tok, i, settings)) + if (isVariableChanged(tok, i, mSettings)) return true; } return false; @@ -2910,7 +2910,7 @@ namespace { template void findTokens(Predicate pred, F f) const { - for (const Token* tok = bodyTok; precedes(tok, bodyTok->link()); tok = tok->next()) { + for (const Token* tok = mBodyTok; precedes(tok, mBodyTok->link()); tok = tok->next()) { if (pred(tok)) f(tok); } @@ -2919,7 +2919,7 @@ namespace { template const Token* findToken(Predicate pred) const { - for (const Token* tok = bodyTok; precedes(tok, bodyTok->link()); tok = tok->next()) { + for (const Token* tok = mBodyTok; precedes(tok, mBodyTok->link()); tok = tok->next()) { if (pred(tok)) return tok; } @@ -2934,7 +2934,7 @@ namespace { } bool valid() const { - return bodyTok && loopVar; + return mBodyTok && mLoopVar; } public: @@ -2943,7 +2943,7 @@ namespace { if (!valid()) return ""; bool loopVarChanged = isLoopVarChanged(); - if (!loopVarChanged && varsChanged.empty()) { + if (!loopVarChanged && mVarsChanged.empty()) { if (hasGotoOrBreak()) return ""; bool alwaysTrue = true; @@ -2976,16 +2976,16 @@ namespace { return false; if (var->isPointer() || var->isReference()) return false; - if (var->declarationId() == loopVar->varId()) + if (var->declarationId() == mLoopVar->varId()) return false; const Scope* scope = var->scope(); - return scope && scope->isNestedIn(bodyTok->scope()); + return scope && scope->isNestedIn(mBodyTok->scope()); } void findChangedVariables() { std::set vars; - for (const Token* tok = bodyTok; precedes(tok, bodyTok->link()); tok = tok->next()) { + for (const Token* tok = mBodyTok; precedes(tok, mBodyTok->link()); tok = tok->next()) { if (tok->varId() == 0) continue; if (vars.count(tok->varId()) > 0) @@ -2996,7 +2996,7 @@ namespace { } if (!isModified(tok)) continue; - varsChanged.insert(tok->varId()); + mVarsChanged.insert(tok->varId()); vars.insert(tok->varId()); } } From 0d84dbd7ebed49546d5f31cf733f98c1cd83be2b Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 18 Jun 2026 12:37:05 +0200 Subject: [PATCH 4/5] checkstl.cpp: removed unnessary condition from `LoopAnalyzer::findAlgo()` --- lib/checkstl.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index fcda7245c7c..55661de95b6 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2886,10 +2886,6 @@ namespace { } } private: - bool isLoopVarChanged() const { - return mVarsChanged.count(mLoopVar->varId()) > 0; - } - bool isModified(const Token* tok) const { if (tok->variable() && tok->variable()->isConst()) @@ -2942,8 +2938,7 @@ namespace { { if (!valid()) return ""; - bool loopVarChanged = isLoopVarChanged(); - if (!loopVarChanged && mVarsChanged.empty()) { + if (mVarsChanged.empty()) { if (hasGotoOrBreak()) return ""; bool alwaysTrue = true; From ec0b1c397ad43f28a8fab2fc36f628c6d0f76b63 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 18 Jun 2026 12:38:40 +0200 Subject: [PATCH 5/5] checkstl.cpp: small `LoopAnalyzer::findAlgo()` cleanup --- lib/checkstl.cpp | 49 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 55661de95b6..98ccaafc93b 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2938,31 +2938,30 @@ namespace { { if (!valid()) return ""; - if (mVarsChanged.empty()) { - if (hasGotoOrBreak()) - return ""; - bool alwaysTrue = true; - bool alwaysFalse = true; - auto hasReturn = [](const Token* tok) { - return Token::simpleMatch(tok, "return"); - }; - findTokens(hasReturn, [&](const Token* tok) { - const Token* returnTok = tok->astOperand1(); - if (!returnTok || !returnTok->hasKnownIntValue() || !astIsBool(returnTok)) { - alwaysTrue = false; - alwaysFalse = false; - return; - } - (returnTok->getKnownIntValue() ? alwaysTrue : alwaysFalse) &= true; - (returnTok->getKnownIntValue() ? alwaysFalse : alwaysTrue) &= false; - }); - if (alwaysTrue == alwaysFalse) - return ""; - if (alwaysTrue) - return "std::any_of"; - return "std::all_of or std::none_of"; - } - return ""; + if (!mVarsChanged.empty()) + return ""; + if (hasGotoOrBreak()) + return ""; + bool alwaysTrue = true; + bool alwaysFalse = true; + const auto hasReturn = [](const Token* tok) { + return Token::simpleMatch(tok, "return"); + }; + findTokens(hasReturn, [&](const Token* tok) { + const Token* returnTok = tok->astOperand1(); + if (!returnTok || !returnTok->hasKnownIntValue() || !astIsBool(returnTok)) { + alwaysTrue = false; + alwaysFalse = false; + return; + } + (returnTok->getKnownIntValue() ? alwaysTrue : alwaysFalse) &= true; + (returnTok->getKnownIntValue() ? alwaysFalse : alwaysTrue) &= false; + }); + if (alwaysTrue == alwaysFalse) + return ""; + if (alwaysTrue) + return "std::any_of"; + return "std::all_of or std::none_of"; } private: bool isLocalVar(const Variable* var) const