| 1239 | } |
| 1240 | |
| 1241 | static 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 | |
| 1283 | static Analyzer::Result valueFlowForward(Token* startToken, |
| 1284 | const Token* endToken, |
no test coverage detected