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

Function isUsedAsBool

lib/astutils.cpp:1520–1566  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1518}
1519
1520bool isUsedAsBool(const Token* const tok, const Settings& settings)
1521{
1522 if (!tok)
1523 return false;
1524 if (isForLoopIncrement(tok))
1525 return false;
1526 if (astIsBool(tok))
1527 return true;
1528 if (Token::Match(tok, "!|&&|%oror%|%comp%"))
1529 return true;
1530 const Token* parent = tok->astParent();
1531 if (!parent)
1532 return false;
1533 if (Token::simpleMatch(parent, "["))
1534 return false;
1535 if (parent->isUnaryOp("*"))
1536 return false;
1537 if (Token::simpleMatch(parent, ".")) {
1538 if (astIsRHS(tok))
1539 return isUsedAsBool(parent, settings);
1540 return false;
1541 }
1542 if (Token::Match(parent, "&&|!|%oror%"))
1543 return true;
1544 if (parent->isCast())
1545 return !Token::simpleMatch(parent->astOperand1(), "dynamic_cast") && isUsedAsBool(parent, settings);
1546 if (parent->isUnaryOp("*"))
1547 return isUsedAsBool(parent, settings);
1548 if (Token::Match(parent, "==|!=") && tok->valueType() && tok->valueType()->pointer &&
1549 tok->astSibling()->hasKnownIntValue() && tok->astSibling()->getKnownIntValue() == 0)
1550 return true;
1551 if (parent->str() == "(" && astIsRHS(tok) && Token::Match(parent->astOperand1(), "if|while"))
1552 return true;
1553 if (Token::simpleMatch(parent, "?") && astIsLHS(tok))
1554 return true;
1555 if (isForLoopCondition(tok))
1556 return true;
1557 if (!Token::Match(parent, "%cop%") && !(parent->str() == "(" && tok == parent->astOperand1())) {
1558 if (parent->str() == "," && parent->isInitComma())
1559 return false;
1560 std::vector<ValueType> vtParents = getParentValueTypes(tok, settings);
1561 return std::any_of(vtParents.cbegin(), vtParents.cend(), [&](const ValueType& vt) {
1562 return vt.pointer == 0 && vt.type == ValueType::BOOL;
1563 });
1564 }
1565 return false;
1566}
1567
1568bool compareTokenFlags(const Token* tok1, const Token* tok2, bool macro) {
1569 if (macro) {

Callers 9

valueFlowInferConditionFunction · 0.85
alwaysTrueFalseMethod · 0.85
executeImplMethod · 0.85
astIsBoolLikeFunction · 0.85
isOppositeCondFunction · 0.85
getExprUsageFunction · 0.85
isUsedAsBoolMethod · 0.85

Calls 14

isForLoopIncrementFunction · 0.85
astIsBoolFunction · 0.85
astIsRHSFunction · 0.85
astIsLHSFunction · 0.85
isForLoopConditionFunction · 0.85
getParentValueTypesFunction · 0.85
astParentMethod · 0.80
isUnaryOpMethod · 0.80
isCastMethod · 0.80
astOperand1Method · 0.80
getKnownIntValueMethod · 0.80
simpleMatchFunction · 0.70

Tested by 1

isUsedAsBoolMethod · 0.68