set symbol database array variable dimensions specified by a variable to the maximum size that variable can hold
This commit is contained in:
parent
65ecbfd4ff
commit
4656eba34c
|
@ -31,6 +31,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <climits>
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
@ -801,6 +802,79 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set all unknown array dimensions that are set by a variable to the maximum size of that variable type */
|
||||||
|
for (size_t i = 1; i <= _tokenizer->varIdCount(); i++)
|
||||||
|
{
|
||||||
|
// check each array variable
|
||||||
|
if (_variableList[i] && _variableList[i]->isArray())
|
||||||
|
{
|
||||||
|
// check each array dimension
|
||||||
|
for (size_t j = 0; j < _variableList[i]->dimensions().size(); j++)
|
||||||
|
{
|
||||||
|
// check for a single token dimension that is a variable
|
||||||
|
if ((_variableList[i]->dimensions()[j].start == _variableList[i]->dimensions()[j].end) &&
|
||||||
|
_variableList[i]->dimensions()[j].start->varId())
|
||||||
|
{
|
||||||
|
Dimension &dimension = const_cast<Dimension &>(_variableList[i]->dimensions()[j]);
|
||||||
|
|
||||||
|
// get maximum size from type
|
||||||
|
// find where this type is defined
|
||||||
|
const Variable *var = getVariableFromVarId(dimension.start->varId());
|
||||||
|
|
||||||
|
// make sure it is in the database
|
||||||
|
if (!var)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// get type token
|
||||||
|
const Token *index_type = var->typeEndToken();
|
||||||
|
|
||||||
|
if (index_type->str() == "char")
|
||||||
|
{
|
||||||
|
if (index_type->isUnsigned())
|
||||||
|
dimension.num = UCHAR_MAX + 1;
|
||||||
|
else if (index_type->isSigned())
|
||||||
|
dimension.num = SCHAR_MAX + 1;
|
||||||
|
else
|
||||||
|
dimension.num = CHAR_MAX + 1;
|
||||||
|
}
|
||||||
|
else if (index_type->str() == "short")
|
||||||
|
{
|
||||||
|
if (index_type->isUnsigned())
|
||||||
|
dimension.num = USHRT_MAX + 1;
|
||||||
|
else
|
||||||
|
dimension.num = SHRT_MAX + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// checkScope assumes size is signed int so we limit the following sizes to INT_MAX
|
||||||
|
else if (index_type->str() == "int")
|
||||||
|
{
|
||||||
|
if (index_type->isUnsigned())
|
||||||
|
dimension.num = UINT_MAX + 1ULL;
|
||||||
|
else
|
||||||
|
dimension.num = INT_MAX + 1ULL;
|
||||||
|
}
|
||||||
|
else if (index_type->str() == "long")
|
||||||
|
{
|
||||||
|
if (index_type->isUnsigned())
|
||||||
|
{
|
||||||
|
if (index_type->isLong())
|
||||||
|
dimension.num = ULLONG_MAX; // should be ULLONG_MAX + 1ULL;
|
||||||
|
else
|
||||||
|
dimension.num = ULONG_MAX + 1ULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (index_type->isLong())
|
||||||
|
dimension.num = LLONG_MAX; // should be LLONG_MAX + 1LL;
|
||||||
|
else
|
||||||
|
dimension.num = LONG_MAX + 1LL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SymbolDatabase::isFunction(const Token *tok, const Token **funcStart, const Token **argStart) const
|
bool SymbolDatabase::isFunction(const Token *tok, const Token **funcStart, const Token **argStart) const
|
||||||
|
|
Loading…
Reference in New Issue