* Implement const global value flow * Tabs to spaces
This commit is contained in:
parent
e786c6b7d4
commit
bca2dfb3f4
|
@ -1458,6 +1458,39 @@ static void valueFlowOppositeCondition(SymbolDatabase *symboldatabase, const Set
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void valueFlowGlobalConstVar(TokenList* tokenList, const Settings *settings)
|
||||||
|
{
|
||||||
|
// Get variable values...
|
||||||
|
std::map<const Variable*, ValueFlow::Value> vars;
|
||||||
|
for (const Token* tok = tokenList->front(); tok; tok = tok->next()) {
|
||||||
|
if (!tok->variable())
|
||||||
|
continue;
|
||||||
|
// Initialization...
|
||||||
|
if (tok == tok->variable()->nameToken() &&
|
||||||
|
!tok->variable()->isStatic() &&
|
||||||
|
tok->variable()->isConst() &&
|
||||||
|
tok->valueType() &&
|
||||||
|
tok->valueType()->isIntegral() &&
|
||||||
|
tok->valueType()->pointer == 0 &&
|
||||||
|
tok->valueType()->constness == 1 &&
|
||||||
|
Token::Match(tok, "%name% =") &&
|
||||||
|
tok->next()->astOperand2() &&
|
||||||
|
tok->next()->astOperand2()->hasKnownIntValue()) {
|
||||||
|
vars[tok->variable()] = tok->next()->astOperand2()->values().front();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set values..
|
||||||
|
for (Token* tok = tokenList->front(); tok; tok = tok->next()) {
|
||||||
|
if (!tok->variable())
|
||||||
|
continue;
|
||||||
|
std::map<const Variable*, ValueFlow::Value>::const_iterator var = vars.find(tok->variable());
|
||||||
|
if (var == vars.end())
|
||||||
|
continue;
|
||||||
|
setTokenValue(tok, var->second, settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void valueFlowGlobalStaticVar(TokenList *tokenList, const Settings *settings)
|
static void valueFlowGlobalStaticVar(TokenList *tokenList, const Settings *settings)
|
||||||
{
|
{
|
||||||
// Get variable values...
|
// Get variable values...
|
||||||
|
@ -5241,6 +5274,7 @@ void ValueFlow::setValues(TokenList *tokenlist, SymbolDatabase* symboldatabase,
|
||||||
valueFlowNumber(tokenlist);
|
valueFlowNumber(tokenlist);
|
||||||
valueFlowString(tokenlist);
|
valueFlowString(tokenlist);
|
||||||
valueFlowArray(tokenlist);
|
valueFlowArray(tokenlist);
|
||||||
|
valueFlowGlobalConstVar(tokenlist, settings);
|
||||||
valueFlowGlobalStaticVar(tokenlist, settings);
|
valueFlowGlobalStaticVar(tokenlist, settings);
|
||||||
valueFlowPointerAlias(tokenlist);
|
valueFlowPointerAlias(tokenlist);
|
||||||
valueFlowLifetime(tokenlist, symboldatabase, errorLogger, settings);
|
valueFlowLifetime(tokenlist, symboldatabase, errorLogger, settings);
|
||||||
|
|
|
@ -103,6 +103,8 @@ private:
|
||||||
|
|
||||||
TEST_CASE(valueFlowGlobalVar);
|
TEST_CASE(valueFlowGlobalVar);
|
||||||
|
|
||||||
|
TEST_CASE(valueFlowGlobalConstVar);
|
||||||
|
|
||||||
TEST_CASE(valueFlowGlobalStaticVar);
|
TEST_CASE(valueFlowGlobalStaticVar);
|
||||||
|
|
||||||
TEST_CASE(valueFlowInlineAssembly);
|
TEST_CASE(valueFlowInlineAssembly);
|
||||||
|
@ -3165,6 +3167,16 @@ private:
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 5U, 42));
|
ASSERT_EQUALS(false, testValueOfX(code, 5U, 42));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void valueFlowGlobalConstVar() {
|
||||||
|
const char* code;
|
||||||
|
|
||||||
|
code = "const int x = 321;\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" a = x;\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS(true, testValueOfX(code, 3U, 321));
|
||||||
|
}
|
||||||
|
|
||||||
void valueFlowGlobalStaticVar() {
|
void valueFlowGlobalStaticVar() {
|
||||||
const char *code;
|
const char *code;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue