MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / singleAssignInScope

Function singleAssignInScope

lib/checkstl.cpp:2652–2684  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2650enum class LoopType : std::uint8_t { OTHER, RANGE, ITERATOR, INDEX };
2651
2652static const Token *singleAssignInScope(const Token *start, nonneg int varid, bool &input, bool &hasBreak, LoopType loopType, const Settings& settings)
2653{
2654 const Token *endStatement = singleStatement(start);
2655 if (!endStatement)
2656 return nullptr;
2657 if (!Token::Match(start->next(), "%var% %assign%"))
2658 return nullptr;
2659 const Token *assignTok = start->tokAt(2);
2660 if (isVariableChanged(assignTok->next(), endStatement, assignTok->astOperand1()->varId(), /*globalvar*/ false, settings))
2661 return nullptr;
2662 if (isVariableChanged(assignTok->next(), endStatement, varid, /*globalvar*/ false, settings))
2663 return nullptr;
2664 input = Token::findmatch(assignTok->next(), "%varid%", endStatement, varid) || !Token::Match(start->next(), "%var% =");
2665 hasBreak = Token::simpleMatch(endStatement->previous(), "break");
2666
2667 if (loopType == LoopType::INDEX) { // check for container access
2668 nonneg int containerId{};
2669 for (const Token* tok = assignTok->next(); tok != endStatement; tok = tok->next()) {
2670 if (tok->varId() == varid) {
2671 if (!Token::simpleMatch(tok->astParent(), "["))
2672 return nullptr;
2673 const Token* contTok = tok->astParent()->astOperand1();
2674 if (!contTok->valueType() || !contTok->valueType()->container || contTok->varId() == 0)
2675 return nullptr;
2676 if (containerId > 0 && containerId != contTok->varId()) // allow only one container
2677 return nullptr;
2678 containerId = contTok->varId();
2679 }
2680 }
2681 return containerId > 0 ? assignTok : nullptr;
2682 }
2683 return assignTok;
2684}
2685
2686static const Token *singleMemberCallInScope(const Token *start, nonneg int varid, bool &input, const Settings& settings)
2687{

Callers 1

useStlAlgorithmMethod · 0.85

Calls 7

singleStatementFunction · 0.85
isVariableChangedFunction · 0.85
nextMethod · 0.80
astOperand1Method · 0.80
astParentMethod · 0.80
simpleMatchFunction · 0.70
tokAtMethod · 0.45

Tested by

no test coverage detected