start using symbol database array info for buffer overrun checks

This commit is contained in:
Robert Reif 2011-06-22 22:44:11 -04:00
parent 0c46f44e3d
commit 48e6ea271a
2 changed files with 22 additions and 9 deletions

View File

@ -25,6 +25,7 @@
#include "tokenize.h" #include "tokenize.h"
#include "errorlogger.h" #include "errorlogger.h"
#include "mathlib.h" #include "mathlib.h"
#include "symboldatabase.h"
#include <algorithm> #include <algorithm>
#include <sstream> #include <sstream>
@ -1931,6 +1932,20 @@ CheckBufferOverrun::ArrayInfo::ArrayInfo(const CheckBufferOverrun::ArrayInfo &ai
*this = ai; *this = ai;
} }
CheckBufferOverrun::ArrayInfo::ArrayInfo(const Variable *var, const Tokenizer *tokenizer)
{
_varid = var->varId();
_varname = var->name();
for (size_t i = 0; i < var->dimensions().size(); i++)
_num.push_back(var->dimension(i));
if (var->typeEndToken()->str() == "*")
_element_size = tokenizer->sizeOfType(var->typeEndToken());
else if (var->typeStartToken()->str() == "struct")
_element_size = 100;
else
_element_size = tokenizer->sizeOfType(var->typeEndToken());
}
CheckBufferOverrun::ArrayInfo & CheckBufferOverrun::ArrayInfo::operator=(const CheckBufferOverrun::ArrayInfo &ai) CheckBufferOverrun::ArrayInfo & CheckBufferOverrun::ArrayInfo::operator=(const CheckBufferOverrun::ArrayInfo &ai)
{ {
if (&ai != this) if (&ai != this)
@ -2197,17 +2212,13 @@ private:
void CheckBufferOverrun::executionPaths() void CheckBufferOverrun::executionPaths()
{ {
// Parse all tokens and extract array info.. // Parse all variables and extract array info..
std::map<unsigned int, ArrayInfo> arrayInfo; std::map<unsigned int, ArrayInfo> arrayInfo;
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) for (size_t i = 1; i < _tokenizer->varIdCount(); i++)
{ {
if (Token::Match(tok, "[;{}] %type%")) const Variable *var = _tokenizer->getSymbolDatabase()->getVariableFromVarId(i);
{ if (var && var->isArray())
ArrayInfo ai; arrayInfo[i] = ArrayInfo(var, _tokenizer);
if (!ai.declare(tok->next(), *_tokenizer))
continue;
arrayInfo[ai.varid()] = ai;
}
} }
// Perform checking - check how the arrayInfo arrays are used // Perform checking - check how the arrayInfo arrays are used

View File

@ -32,6 +32,7 @@
class ErrorLogger; class ErrorLogger;
class Token; class Token;
class Tokenizer; class Tokenizer;
class Variable;
/// @addtogroup Checks /// @addtogroup Checks
/// @{ /// @{
@ -127,6 +128,7 @@ public:
public: public:
ArrayInfo(); ArrayInfo();
ArrayInfo(const ArrayInfo &); ArrayInfo(const ArrayInfo &);
ArrayInfo(const Variable *var, const Tokenizer *tokenizer);
ArrayInfo & operator=(const ArrayInfo &ai); ArrayInfo & operator=(const ArrayInfo &ai);
/** /**