| 443 | } |
| 444 | |
| 445 | static std::vector<std::pair<const Token *, CTU::FileInfo::Value>> getUnsafeFunction(const Settings &settings, const Scope *scope, int argnr, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *value)) |
| 446 | { |
| 447 | std::vector<std::pair<const Token *, CTU::FileInfo::Value>> ret; |
| 448 | const Variable * const argvar = scope->function->getArgumentVar(argnr); |
| 449 | if (!argvar->isArrayOrPointer() && !argvar->isReference()) |
| 450 | return ret; |
| 451 | for (const Token *tok2 = scope->bodyStart; tok2 != scope->bodyEnd; tok2 = tok2->next()) { |
| 452 | if (Token::Match(tok2, ")|else {")) { |
| 453 | tok2 = tok2->linkAt(1); |
| 454 | if (Token::findmatch(tok2->link(), "return|throw", tok2)) |
| 455 | return ret; |
| 456 | int indirect = 0; |
| 457 | if (argvar->valueType()) |
| 458 | indirect = argvar->valueType()->pointer; |
| 459 | if (isVariableChanged(tok2->link(), tok2, indirect, argvar->declarationId(), false, settings)) |
| 460 | return ret; |
| 461 | } |
| 462 | if (Token::Match(tok2, "%oror%|&&|?")) { |
| 463 | tok2 = tok2->findExpressionStartEndTokens().second; |
| 464 | continue; |
| 465 | } |
| 466 | if (tok2->variable() != argvar) |
| 467 | continue; |
| 468 | CTU::FileInfo::Value value; |
| 469 | if (!isUnsafeUsage(settings, tok2, &value)) |
| 470 | return ret; // TODO: Is this a read? then continue.. |
| 471 | ret.emplace_back(tok2, value); |
| 472 | return ret; |
| 473 | } |
| 474 | return ret; |
| 475 | } |
| 476 | |
| 477 | std::list<CTU::FileInfo::UnsafeUsage> CTU::getUnsafeUsage(const Tokenizer &tokenizer, const Settings &settings, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, CTU::FileInfo::Value *value)) |
| 478 | { |
no test coverage detected