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

Function getExprUsage

lib/astutils.cpp:3516–3566  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3514}
3515
3516ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings)
3517{
3518 const Token* parent = tok->astParent();
3519 if (indirect > 0 && parent) {
3520 while (Token::simpleMatch(parent, "[") && parent->astParent())
3521 parent = parent->astParent();
3522 if (Token::Match(parent, "%assign%") && (astIsRHS(tok) || astIsLHS(parent->astOperand1())))
3523 return ExprUsage::NotUsed;
3524 if (Token::Match(parent, "++|--"))
3525 return ExprUsage::NotUsed;
3526 if (parent->isConstOp())
3527 return ExprUsage::NotUsed;
3528 if (parent->isCast())
3529 return ExprUsage::NotUsed;
3530 if (Token::simpleMatch(parent, ":") && Token::simpleMatch(parent->astParent(), "?"))
3531 return getExprUsage(parent->astParent(), indirect, settings);
3532 if (isUsedAsBool(tok, settings))
3533 return ExprUsage::NotUsed;
3534 }
3535 if (tok->isUnaryOp("&") && !parent)
3536 return ExprUsage::NotUsed;
3537 if (indirect == 0) {
3538 if (Token::Match(parent, "%cop%|%assign%|++|--") && parent->str() != "=" &&
3539 !parent->isUnaryOp("&") &&
3540 !(astIsRHS(tok) && isLikelyStreamRead(parent)))
3541 return ExprUsage::Used;
3542 if (isLeafDot(tok)) {
3543 const Token* op = parent->astParent();
3544 while (Token::simpleMatch(op, "."))
3545 op = op->astParent();
3546 if (Token::Match(op, "%assign%|++|--")) {
3547 if (op->str() == "=") {
3548 if (precedes(tok, op))
3549 return ExprUsage::NotUsed;
3550 } else
3551 return ExprUsage::Used;
3552 }
3553 }
3554 if (Token::simpleMatch(parent, "=") && astIsRHS(tok)) {
3555 const Token* const lhs = parent->astOperand1();
3556 if (lhs && lhs->variable() && lhs->variable()->isReference() && lhs == lhs->variable()->nameToken())
3557 return ExprUsage::NotUsed;
3558 return ExprUsage::Used;
3559 }
3560 // Function call or index
3561 if (((Token::simpleMatch(parent, "(") && !parent->isCast()) || (Token::simpleMatch(parent, "[") && tok->valueType())) &&
3562 (astIsLHS(tok) || Token::simpleMatch(parent, "( )")))
3563 return ExprUsage::Used;
3564 }
3565 return getFunctionUsage(tok, indirect, settings);
3566}
3567
3568static void getLHSVariablesRecursive(std::vector<const Variable*>& vars, const Token* tok)
3569{

Callers 2

valueFlowUninitMethod · 0.85

Calls 15

astIsRHSFunction · 0.85
astIsLHSFunction · 0.85
isUsedAsBoolFunction · 0.85
isLikelyStreamReadFunction · 0.85
isLeafDotFunction · 0.85
precedesFunction · 0.85
getFunctionUsageFunction · 0.85
astParentMethod · 0.80
astOperand1Method · 0.80
isConstOpMethod · 0.80
isCastMethod · 0.80
isUnaryOpMethod · 0.80

Tested by

no test coverage detected