| 370 | } |
| 371 | |
| 372 | static bool isVariableUsed(const Token *tok, const Variable& var) |
| 373 | { |
| 374 | if (!tok) |
| 375 | return false; |
| 376 | if (tok->str() == "&" && !tok->astOperand2()) |
| 377 | return false; |
| 378 | if (tok->isConstOp()) |
| 379 | return isVariableUsed(tok->astOperand1(),var) || isVariableUsed(tok->astOperand2(),var); |
| 380 | if (tok->varId() != var.declarationId()) |
| 381 | return false; |
| 382 | if (!var.isArray() && !var.isPointer()) |
| 383 | return true; |
| 384 | |
| 385 | const Token *parent = tok->astParent(); |
| 386 | while (Token::Match(parent, "[?:]")) |
| 387 | parent = parent->astParent(); |
| 388 | // no dereference, then array is not "used" |
| 389 | if (!Token::Match(parent, "*|[")) |
| 390 | return false; |
| 391 | const Token *parent2 = parent->astParent(); |
| 392 | // TODO: handle function calls. There is a TODO assertion in TestUninitVar::uninitvar_arrays |
| 393 | return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent); |
| 394 | } |
| 395 | |
| 396 | bool CheckUninitVarImpl::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar, std::map<nonneg int, VariableValue>& variableValue) |
| 397 | { |
no test coverage detected