MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / valueFlowGlobalStaticVar

Function valueFlowGlobalStaticVar

lib/valueflow.cpp:1241–1281  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1239}
1240
1241static void valueFlowGlobalStaticVar(TokenList& tokenList, const Settings& settings)
1242{
1243 // Get variable values...
1244 std::map<const Variable*, ValueFlow::Value> vars;
1245 for (const Token* tok = tokenList.front(); tok; tok = tok->next()) {
1246 if (!tok->variable())
1247 continue;
1248 // Initialization...
1249 if (tok == tok->variable()->nameToken() && tok->variable()->isStatic() && !tok->variable()->isConst() &&
1250 tok->valueType() && tok->valueType()->isIntegral() && tok->valueType()->pointer == 0 &&
1251 tok->valueType()->constness == 0 && Token::Match(tok, "%name% =") && tok->next()->astOperand2() &&
1252 tok->next()->astOperand2()->hasKnownIntValue()) {
1253 vars[tok->variable()] = *tok->next()->astOperand2()->getKnownValue(ValueFlow::Value::ValueType::INT);
1254 } else {
1255 // If variable is written anywhere in TU then remove it from vars
1256 if (!tok->astParent())
1257 continue;
1258 if (Token::Match(tok->astParent(), "++|--|&") && !tok->astParent()->astOperand2())
1259 vars.erase(tok->variable());
1260 else if (tok->astParent()->isAssignmentOp()) {
1261 if (tok == tok->astParent()->astOperand1())
1262 vars.erase(tok->variable());
1263 else if (tok->isCpp() && Token::Match(tok->astParent()->tokAt(-2), "& %name% ="))
1264 vars.erase(tok->variable());
1265 } else if (isLikelyStreamRead(tok->astParent())) {
1266 vars.erase(tok->variable());
1267 } else if (Token::Match(tok->astParent(), "[(,]"))
1268 vars.erase(tok->variable());
1269 }
1270 }
1271
1272 // Set values..
1273 for (Token* tok = tokenList.front(); tok; tok = tok->next()) {
1274 if (!tok->variable())
1275 continue;
1276 const auto var = utils::as_const(vars).find(tok->variable());
1277 if (var == vars.end())
1278 continue;
1279 setTokenValue(tok, var->second, settings);
1280 }
1281}
1282
1283static Analyzer::Result valueFlowForward(Token* startToken,
1284 const Token* endToken,

Callers 1

setValuesMethod · 0.85

Calls 15

isLikelyStreamReadFunction · 0.85
setTokenValueFunction · 0.85
frontMethod · 0.80
nextMethod · 0.80
variableMethod · 0.80
isConstMethod · 0.80
isIntegralMethod · 0.80
astOperand2Method · 0.80
getKnownValueMethod · 0.80
astParentMethod · 0.80
isAssignmentOpMethod · 0.80
astOperand1Method · 0.80

Tested by

no test coverage detected