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

Function getUnsafeFunction

lib/ctu.cpp:445–475  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

443}
444
445static 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
477std::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{

Callers 1

getUnsafeUsageMethod · 0.85

Calls 8

isVariableChangedFunction · 0.85
isUnsafeUsageFunction · 0.85
getArgumentVarMethod · 0.80
isArrayOrPointerMethod · 0.80
nextMethod · 0.80
linkAtMethod · 0.80
variableMethod · 0.80

Tested by

no test coverage detected