Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions lib/astutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ const Token* findExpression(const nonneg int exprid,
return nullptr;
}

static void astFlattenRecursive(const Token *tok, std::vector<const Token *> *result, const char* op, nonneg int depth = 0)
static void astFlattenRecursive(const Token *tok, TokenVector *result, const char* op, nonneg int depth = 0)
{
++depth;
if (!tok || depth >= 100)
Expand All @@ -114,9 +114,10 @@ static void astFlattenRecursive(const Token *tok, std::vector<const Token *> *re
}
}

std::vector<const Token*> astFlatten(const Token* tok, const char* op)
TokenVector astFlatten(const Token* tok, const char* op)
{
std::vector<const Token*> result;
TokenVector result;
result.clear();
astFlattenRecursive(tok, &result, op);
return result;
}
Expand Down Expand Up @@ -830,7 +831,7 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok, bool inconclus
int n = getArgumentPos(argvar, f);
if (n < 0)
return {{tok, std::move(errors)}};
std::vector<const Token*> args = getArguments(tok->previous());
auto args = getArguments(tok->previous());
if (n >= args.size())
return {{tok, std::move(errors)}};
const Token* argTok = args[n];
Expand Down Expand Up @@ -1465,7 +1466,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library)
constMember = var->isConst();
}
// TODO: Only check const on lvalues
std::vector<const Token*> args = getArguments(ftok);
auto args = getArguments(ftok);
if (memberFunction && args.empty())
return false;
return constMember && std::all_of(args.begin(), args.end(), [](const Token* tok) {
Expand Down Expand Up @@ -1747,7 +1748,7 @@ const Token * getTokenArgumentFunction(const Token * tok, int& argn)
if (Token::Match(tok, "(|{"))
break;
}
std::vector<const Token*> args = getArguments(tok);
auto args = getArguments(tok);
auto it = std::find(args.begin(), args.end(), argtok);
if (it != args.end())
argn = std::distance(args.begin(), it);
Expand Down Expand Up @@ -2279,13 +2280,13 @@ int numberOfArguments(const Token *start)
return arguments;
}

std::vector<const Token *> getArguments(const Token *ftok)
TokenVector getArguments(const Token *ftok)
{
const Token* tok = ftok;
if (Token::Match(tok, "%name% (|{"))
tok = ftok->next();
if (!Token::Match(tok, "(|{|["))
return std::vector<const Token *> {};
return {};
const Token *startTok = tok->astOperand2();
if (!startTok && tok->next() != tok->link())
startTok = tok->astOperand1();
Expand Down Expand Up @@ -2397,7 +2398,7 @@ bool isConstVarExpression(const Token *tok, const char* skipMatch)
if (Token::Match(tok->previous(), "%name% (")) {
if (Token::simpleMatch(tok->astOperand1(), ".") && !isConstVarExpression(tok->astOperand1(), skipMatch))
return false;
std::vector<const Token *> args = getArguments(tok);
auto args = getArguments(tok);
return std::all_of(args.begin(), args.end(), [&](const Token* t) {
return isConstVarExpression(t, skipMatch);
});
Expand Down Expand Up @@ -2883,7 +2884,7 @@ struct FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const
while (Token::simpleMatch(ftok, ","))
ftok = ftok->astParent();
if (ftok && Token::Match(ftok->previous(), "%name% (")) {
const std::vector<const Token *> args = getArguments(ftok);
const auto args = getArguments(ftok);
int argnr = 0;
while (argnr < args.size() && args[argnr] != parent)
argnr++;
Expand Down Expand Up @@ -3074,7 +3075,7 @@ bool FwdAnalysis::possiblyAliased(const Token *expr, const Token *startToken) co

if (Token::Match(tok, "%name% (") && !Token::Match(tok, "if|while|for")) {
// Is argument passed by reference?
const std::vector<const Token*> args = getArguments(tok);
const auto args = getArguments(tok);
for (int argnr = 0; argnr < args.size(); ++argnr) {
if (!Token::Match(args[argnr], "%name%|.|::"))
continue;
Expand Down
7 changes: 5 additions & 2 deletions lib/astutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <set>
#include <string>
#include <vector>
#include <boost/container/small_vector.hpp>

#include "errortypes.h"
#include "utils.h"
Expand All @@ -36,6 +37,8 @@ class Settings;
class Token;
class Variable;

using TokenVector = boost::container::small_vector<const Token*, 32>;

enum class ChildrenToVisit {
none,
op1,
Expand All @@ -57,7 +60,7 @@ const Token* findExpression(const nonneg int exprid,
const std::function<bool(const Token*)>& pred);
const Token* findExpression(const Token* start, const nonneg int exprid);

std::vector<const Token*> astFlatten(const Token* tok, const char* op);
TokenVector astFlatten(const Token* tok, const char* op);

bool astHasToken(const Token* root, const Token * tok);

Expand Down Expand Up @@ -264,7 +267,7 @@ int numberOfArguments(const Token *start);
/**
* Get arguments (AST)
*/
std::vector<const Token *> getArguments(const Token *ftok);
TokenVector getArguments(const Token *ftok);

int getArgumentPos(const Variable* var, const Function* f);

Expand Down
2 changes: 1 addition & 1 deletion lib/bughuntingchecks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ static void bufferOverflow(const Token *tok, const ExprEngine::Value &value, Exp
if (!functionCallArguments)
return;

const std::vector<const Token *> arguments = getArguments(tok);
const auto arguments = getArguments(tok);
if (functionCallArguments->argValues.size() != arguments.size())
// TODO investigate what to do
return;
Expand Down
10 changes: 5 additions & 5 deletions lib/checkbufferoverrun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ static const ValueFlow::Value *getBufferSizeValue(const Token *tok)
return it == tokenValues.end() ? nullptr : &*it;
}

static int getMinFormatStringOutputLength(const std::vector<const Token*> &parameters, nonneg int formatStringArgNr)
static int getMinFormatStringOutputLength(const TokenVector &parameters, nonneg int formatStringArgNr)
{
if (formatStringArgNr <= 0 || formatStringArgNr > parameters.size())
return 0;
Expand Down Expand Up @@ -558,7 +558,7 @@ ValueFlow::Value CheckBufferOverrun::getBufferSize(const Token *bufTok) const
}
//---------------------------------------------------------------------------

static bool checkBufferSize(const Token *ftok, const Library::ArgumentChecks::MinSize &minsize, const std::vector<const Token *> &args, const MathLib::bigint bufferSize, const Settings *settings)
static bool checkBufferSize(const Token *ftok, const Library::ArgumentChecks::MinSize &minsize, const TokenVector &args, const MathLib::bigint bufferSize, const Settings *settings)
{
const Token * const arg = (minsize.arg > 0 && minsize.arg - 1 < args.size()) ? args[minsize.arg - 1] : nullptr;
const Token * const arg2 = (minsize.arg2 > 0 && minsize.arg2 - 1 < args.size()) ? args[minsize.arg2 - 1] : nullptr;
Expand Down Expand Up @@ -602,7 +602,7 @@ void CheckBufferOverrun::bufferOverflow()
continue;
if (!mSettings->library.hasminsize(tok))
continue;
const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);
for (int argnr = 0; argnr < args.size(); ++argnr) {
if (!args[argnr]->valueType() || args[argnr]->valueType()->pointer == 0)
continue;
Expand Down Expand Up @@ -720,7 +720,7 @@ void CheckBufferOverrun::stringNotZeroTerminated()
for (const Token *tok = scope->bodyStart; tok && tok != scope->bodyEnd; tok = tok->next()) {
if (!Token::simpleMatch(tok, "strncpy ("))
continue;
const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);
if (args.size() != 3)
continue;
const Token *sizeToken = args[2];
Expand Down Expand Up @@ -778,7 +778,7 @@ void CheckBufferOverrun::argumentSize()

// If argument is '%type% a[num]' then check bounds against num
const Function *callfunc = tok->function();
const std::vector<const Token *> callargs = getArguments(tok);
const auto callargs = getArguments(tok);
for (nonneg int paramIndex = 0; paramIndex < callargs.size() && paramIndex < callfunc->argCount(); ++paramIndex) {
const Variable* const argument = callfunc->getArgumentVar(paramIndex);
if (!argument || !argument->nameToken() || !argument->isArray())
Expand Down
6 changes: 3 additions & 3 deletions lib/checkfunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ void CheckFunctions::invalidFunctionUsage()
if (!Token::Match(tok, "%name% ( !!)"))
continue;
const Token * const functionToken = tok;
const std::vector<const Token *> arguments = getArguments(tok);
const auto arguments = getArguments(tok);
for (int argnr = 1; argnr <= arguments.size(); ++argnr) {
const Token * const argtok = arguments[argnr-1];

Expand Down Expand Up @@ -465,7 +465,7 @@ void CheckFunctions::memsetZeroBytes()
for (const Scope *scope : symbolDatabase->functionScopes) {
for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) {
if (Token::Match(tok, "memset|wmemset (") && (numberOfArguments(tok)==3)) {
const std::vector<const Token *> &arguments = getArguments(tok);
const auto &arguments = getArguments(tok);
if (WRONG_DATA(arguments.size() != 3U, tok))
continue;
const Token* lastParamTok = arguments[2];
Expand Down Expand Up @@ -506,7 +506,7 @@ void CheckFunctions::memsetInvalid2ndParam()
if (!Token::simpleMatch(tok, "memset ("))
continue;

const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);
if (args.size() != 3)
continue;

Expand Down
2 changes: 1 addition & 1 deletion lib/checkleakautovar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
if (tok3->str() == "(" && Token::Match(tok3->astOperand1(), "UNLIKELY|LIKELY")) {
return ChildrenToVisit::op2;
} else if (tok3->str() == "(" && Token::Match(tok3->previous(), "%name%")) {
const std::vector<const Token *> params = getArguments(tok3->previous());
const auto params = getArguments(tok3->previous());
for (const Token *par : params) {
if (!par->isComparisonOp())
continue;
Expand Down
2 changes: 1 addition & 1 deletion lib/checkmemoryleak.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1010,7 +1010,7 @@ void CheckMemoryLeakNoVar::checkForUnreleasedInputArgument(const Scope *scope)
if (!CheckMemoryLeakInFunction::test_white_list(functionName, mSettings, mTokenizer->isCPP()))
continue;

const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);
for (const Token* arg : args) {
if (arg->isOp())
continue;
Expand Down
4 changes: 2 additions & 2 deletions lib/checknullpointer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
if (Token::Match(&tok, "%name% ( )") || !tok.tokAt(2))
return;

const std::vector<const Token *> args = getArguments(&tok);
const auto args = getArguments(&tok);

if (library || tok.function() != nullptr) {
for (int argnr = 1; argnr <= args.size(); ++argnr) {
Expand Down Expand Up @@ -368,7 +368,7 @@ void CheckNullPointer::nullConstantDereference()
nullPointerError(tok);

else if (Token::Match(tok->previous(), "::|. %name% (")) {
const std::vector<const Token *> &args = getArguments(tok);
const auto &args = getArguments(tok);
for (int argnr = 0; argnr < args.size(); ++argnr) {
const Token *argtok = args[argnr];
if (!argtok->hasKnownIntValue())
Expand Down
2 changes: 1 addition & 1 deletion lib/checkother.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3490,7 +3490,7 @@ void CheckOther::checkOverlappingWrite()
const Library::NonOverlappingData *nonOverlappingData = mSettings->library.getNonOverlappingData(tok);
if (!nonOverlappingData)
continue;
const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);
if (nonOverlappingData->ptr1Arg <= 0 || nonOverlappingData->ptr1Arg > args.size())
continue;
if (nonOverlappingData->ptr2Arg <= 0 || nonOverlappingData->ptr2Arg > args.size())
Expand Down
8 changes: 4 additions & 4 deletions lib/checkstl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -718,7 +718,7 @@ void CheckStl::mismatchingContainers()
continue;
const Token * const ftok = tok;

const std::vector<const Token *> args = getArguments(ftok);
const auto args = getArguments(ftok);
if (args.size() < 2)
continue;

Expand Down Expand Up @@ -772,7 +772,7 @@ void CheckStl::mismatchingContainerIterator()
if (!Token::Match(tok, "%var% . %name% ( !!)"))
continue;
const Token * const ftok = tok->tokAt(2);
const std::vector<const Token *> args = getArguments(ftok);
const auto args = getArguments(ftok);

const Library::Container * c = tok->valueType()->container;
Library::Container::Action action = c->getAction(tok->strAt(2));
Expand Down Expand Up @@ -894,7 +894,7 @@ struct InvalidContainerAnalyzer {
return false;
return true;
});
std::vector<const Token*> args = getArguments(tok);
auto args = getArguments(tok);
for (Info::Reference& r : result) {
r.errorPath.push_front(epi);
const Variable* var = r.tok->variable();
Expand Down Expand Up @@ -2682,7 +2682,7 @@ void CheckStl::knownEmptyContainer()
continue;
knownEmptyContainerError(contTok, "");
} else {
const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);
if (args.empty())
continue;

Expand Down
6 changes: 3 additions & 3 deletions lib/checkstring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -362,8 +362,8 @@ void CheckString::overlappingStrcmp()
continue;
if (!Token::Match(ne0->previous(), "strcmp|wcscmp ("))
continue;
const std::vector<const Token *> args1 = getArguments(eq0->previous());
const std::vector<const Token *> args2 = getArguments(ne0->previous());
const auto args1 = getArguments(eq0->previous());
const auto args2 = getArguments(ne0->previous());
if (args1.size() != 2 || args2.size() != 2)
continue;
if (args1[1]->isLiteral() &&
Expand Down Expand Up @@ -402,7 +402,7 @@ void CheckString::sprintfOverlappingData()
if (!Token::Match(tok, "sprintf|snprintf|swprintf ("))
continue;

const std::vector<const Token *> args = getArguments(tok);
const auto args = getArguments(tok);

const int formatString = Token::simpleMatch(tok, "sprintf") ? 1 : 2;
for (unsigned int argnr = formatString + 1; argnr < args.size(); ++argnr) {
Expand Down
2 changes: 1 addition & 1 deletion lib/ctu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer)
continue;
if (!tok->astOperand1()->function())
continue;
const std::vector<const Token *> args(getArguments(tok->previous()));
const auto args(getArguments(tok->previous()));
for (int argnr = 0; argnr < args.size(); ++argnr) {
const Token *argtok = args[argnr];
if (!argtok)
Expand Down
2 changes: 1 addition & 1 deletion lib/exprengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2046,7 +2046,7 @@ static ExprEngine::ValuePtr executeFunctionCall(const Token *tok, Data &data)
}
}

const std::vector<const Token *> &argTokens = getArguments(tok);
const auto &argTokens = getArguments(tok);
std::vector<ExprEngine::ValuePtr> argValues;
for (const Token *argtok : argTokens) {
auto val = hasBody ? executeExpression1(argtok, data) : executeExpression(argtok, data);
Expand Down
2 changes: 1 addition & 1 deletion lib/symboldatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4961,7 +4961,7 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst) const
{
const bool isCall = Token::Match(tok->next(), "(|{");

const std::vector<const Token *> arguments = getArguments(tok);
const auto arguments = getArguments(tok);

std::vector<const Function *> matches;

Expand Down
Loading