valueflow.cpp: avoid some copies related to `ErrorPath` (#4160)

This commit is contained in:
Oliver Stöneberg 2022-07-20 10:57:49 +02:00 committed by GitHub
parent ebe8dc2cf3
commit 4316884123
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 11 deletions

View File

@ -2583,11 +2583,11 @@ struct ValueFlowAnalyzer : Analyzer {
tok->astParent()->astOperand2()->getKnownValue(ValueFlow::Value::ValueType::INT); tok->astParent()->astOperand2()->getKnownValue(ValueFlow::Value::ValueType::INT);
assert(rhsValue); assert(rhsValue);
if (evalAssignment(*value, getAssign(tok->astParent(), d), *rhsValue)) { if (evalAssignment(*value, getAssign(tok->astParent(), d), *rhsValue)) {
const std::string info("Compound assignment '" + tok->astParent()->str() + "', assigned value is " + std::string info("Compound assignment '" + tok->astParent()->str() + "', assigned value is " +
value->infoString()); value->infoString());
if (tok->astParent()->str() == "=") if (tok->astParent()->str() == "=")
value->errorPath.clear(); value->errorPath.clear();
value->errorPath.emplace_back(tok, info); value->errorPath.emplace_back(tok, std::move(info));
} else { } else {
assert(false && "Writable value cannot be evaluated"); assert(false && "Writable value cannot be evaluated");
// TODO: Don't set to zero // TODO: Don't set to zero
@ -2595,12 +2595,11 @@ struct ValueFlowAnalyzer : Analyzer {
} }
} else if (tok->astParent()->tokType() == Token::eIncDecOp) { } else if (tok->astParent()->tokType() == Token::eIncDecOp) {
bool inc = tok->astParent()->str() == "++"; bool inc = tok->astParent()->str() == "++";
std::string opName(inc ? "incremented" : "decremented"); const std::string opName(inc ? "incremented" : "decremented");
if (d == Direction::Reverse) if (d == Direction::Reverse)
inc = !inc; inc = !inc;
value->intvalue += (inc ? 1 : -1); value->intvalue += (inc ? 1 : -1);
const std::string info(tok->str() + " is " + opName + "', new value is " + value->infoString()); value->errorPath.emplace_back(tok, tok->str() + " is " + opName + "', new value is " + value->infoString());
value->errorPath.emplace_back(tok, info);
} }
} }
@ -3985,6 +3984,7 @@ struct LifetimeStore {
const Token *tok2 = v.tokvalue; const Token *tok2 = v.tokvalue;
ErrorPath er = v.errorPath; ErrorPath er = v.errorPath;
const Variable *var = getLifetimeVariable(tok2, er); const Variable *var = getLifetimeVariable(tok2, er);
// TODO: the inserted data is never used
er.insert(er.end(), errorPath.begin(), errorPath.end()); er.insert(er.end(), errorPath.begin(), errorPath.end());
if (!var) if (!var)
continue; continue;
@ -4532,7 +4532,7 @@ static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase*, ErrorLogger
else if (c == LifetimeCapture::ByValue) else if (c == LifetimeCapture::ByValue)
value.lifetimeScope = ValueFlow::Value::LifetimeScope::ThisValue; value.lifetimeScope = ValueFlow::Value::LifetimeScope::ThisValue;
value.tokvalue = tok2; value.tokvalue = tok2;
value.errorPath.push_back({tok2, "Lambda captures the 'this' variable here."}); value.errorPath.emplace_back(tok2, "Lambda captures the 'this' variable here.");
value.lifetimeKind = ValueFlow::Value::LifetimeKind::Lambda; value.lifetimeKind = ValueFlow::Value::LifetimeKind::Lambda;
capturedThis = true; capturedThis = true;
// Don't add the value a second time // Don't add the value a second time
@ -7000,8 +7000,7 @@ static void valueFlowSwitchVariable(TokenList *tokenlist, SymbolDatabase* symbol
std::list<ValueFlow::Value> values; std::list<ValueFlow::Value> values;
values.emplace_back(MathLib::toLongNumber(tok->next()->str())); values.emplace_back(MathLib::toLongNumber(tok->next()->str()));
values.back().condition = tok; values.back().condition = tok;
const std::string info("case " + tok->next()->str() + ": " + vartok->str() + " is " + tok->next()->str() + " here."); values.back().errorPath.emplace_back(tok, "case " + tok->next()->str() + ": " + vartok->str() + " is " + tok->next()->str() + " here.");
values.back().errorPath.emplace_back(tok, info);
bool known = false; bool known = false;
if ((Token::simpleMatch(tok->previous(), "{") || Token::simpleMatch(tok->tokAt(-2), "break ;")) && !Token::Match(tok->tokAt(3), ";| case")) if ((Token::simpleMatch(tok->previous(), "{") || Token::simpleMatch(tok->tokAt(-2), "break ;")) && !Token::Match(tok->tokAt(3), ";| case"))
known = true; known = true;
@ -7012,8 +7011,7 @@ static void valueFlowSwitchVariable(TokenList *tokenlist, SymbolDatabase* symbol
tok = tok->next(); tok = tok->next();
values.emplace_back(MathLib::toLongNumber(tok->next()->str())); values.emplace_back(MathLib::toLongNumber(tok->next()->str()));
values.back().condition = tok; values.back().condition = tok;
const std::string info2("case " + tok->next()->str() + ": " + vartok->str() + " is " + tok->next()->str() + " here."); values.back().errorPath.emplace_back(tok, "case " + tok->next()->str() + ": " + vartok->str() + " is " + tok->next()->str() + " here.");
values.back().errorPath.emplace_back(tok, info2);
} }
for (std::list<ValueFlow::Value>::const_iterator val = values.begin(); val != values.end(); ++val) { for (std::list<ValueFlow::Value>::const_iterator val = values.begin(); val != values.end(); ++val) {
valueFlowReverse(tokenlist, valueFlowReverse(tokenlist,