From 2938278f00844b7a370b6a888aca833a5369142d Mon Sep 17 00:00:00 2001 From: PKEuS Date: Mon, 27 Mar 2017 17:33:26 +0200 Subject: [PATCH] Refactorization: Store minsizes in vector instead of list which has less overhead --- lib/checkbufferoverrun.cpp | 8 ++++---- lib/library.cpp | 3 ++- lib/library.h | 5 ++--- test/testlibrary.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 882599c88..be3b00264 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -313,7 +313,7 @@ static bool bailoutIfSwitch(const Token *tok, const unsigned int varid) } //--------------------------------------------------------------------------- -static bool checkMinSizes(const std::list &minsizes, const Token * const ftok, const MathLib::bigint arraySize, const Token **charSizeToken, const Settings * const settings) +static bool checkMinSizes(const std::vector &minsizes, const Token * const ftok, const MathLib::bigint arraySize, const Token **charSizeToken, const Settings * const settings) { if (charSizeToken) *charSizeToken = nullptr; @@ -323,7 +323,7 @@ static bool checkMinSizes(const std::list &min // All conditions must be true bool error = true; - for (std::list::const_iterator minsize = minsizes.begin(); minsize != minsizes.end(); ++minsize) { + for (std::vector::const_iterator minsize = minsizes.begin(); minsize != minsizes.end(); ++minsize) { if (!error) return false; error = false; @@ -383,7 +383,7 @@ static bool checkMinSizes(const std::list &min void CheckBufferOverrun::checkFunctionParameter(const Token &ftok, unsigned int paramIndex, const ArrayInfo &arrayInfo, const std::list& callstack) { - const std::list * const minsizes = _settings->library.argminsizes(&ftok, paramIndex); + const std::vector * const minsizes = _settings->library.argminsizes(&ftok, paramIndex); if (minsizes) { MathLib::bigint arraySize = arrayInfo.element_size(); @@ -1704,7 +1704,7 @@ void CheckBufferOverrun::checkStringArgument() const Token *strtoken = argtok->getValueTokenMinStrSize(); if (!strtoken) continue; - const std::list *minsizes = _settings->library.argminsizes(tok, argnr); + const std::vector *minsizes = _settings->library.argminsizes(tok, argnr); if (!minsizes) continue; if (checkMinSizes(*minsizes, tok, Token::getStrSize(strtoken), nullptr, _settings)) diff --git a/lib/library.cpp b/lib/library.cpp index 3c3911889..17dcf0c73 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -623,9 +623,10 @@ Library::Error Library::loadFunction(const tinyxml2::XMLElement * const node, co if (strlen(argattr) != 1 || argattr[0]<'0' || argattr[0]>'9') return Error(BAD_ATTRIBUTE_VALUE, argattr); + ac.minsizes.reserve(type == ArgumentChecks::MinSize::MUL ? 2 : 1); ac.minsizes.push_back(ArgumentChecks::MinSize(type,argattr[0]-'0')); if (type == ArgumentChecks::MinSize::MUL) { - const char *arg2attr = argnode->Attribute("arg2"); + const char *arg2attr = argnode->Attribute("arg2"); if (!arg2attr) return Error(MISSING_ATTRIBUTE, "arg2"); if (strlen(arg2attr) != 1 || arg2attr[0]<'0' || arg2attr[0]>'9') diff --git a/lib/library.h b/lib/library.h index 6e3741302..4a72d277f 100644 --- a/lib/library.h +++ b/lib/library.h @@ -29,7 +29,6 @@ #include #include #include -#include #include namespace tinyxml2 { @@ -255,7 +254,7 @@ public: int arg; int arg2; }; - std::list minsizes; + std::vector minsizes; }; @@ -310,7 +309,7 @@ public: bool hasminsize(const std::string &functionName) const; - const std::list *argminsizes(const Token *ftok, int argnr) const { + const std::vector *argminsizes(const Token *ftok, int argnr) const { const ArgumentChecks *arg = getarg(ftok, argnr); return arg ? &arg->minsizes : nullptr; } diff --git a/test/testlibrary.cpp b/test/testlibrary.cpp index 8db981490..9bc087df9 100644 --- a/test/testlibrary.cpp +++ b/test/testlibrary.cpp @@ -339,7 +339,7 @@ private: tokenList.front()->next()->astOperand1(tokenList.front()); // arg1: type=strlen arg2 - const std::list *minsizes = library.argminsizes(tokenList.front(),1); + const std::vector *minsizes = library.argminsizes(tokenList.front(),1); ASSERT_EQUALS(true, minsizes != nullptr); ASSERT_EQUALS(1U, minsizes ? minsizes->size() : 1U); if (minsizes && minsizes->size() == 1U) {