diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 750fd6653e0..65435bb47b9 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -364,11 +364,13 @@ static void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, con if (endTok && findExpressionChanged(vartok, tok->next(), endTok, settings)) return; const bool impossible = (tok->str() == "==" && !then) || (tok->str() == "!=" && then); - const ValueFlow::Value& v = then ? truevalue : falsevalue; - pm.setValue(vartok, impossible ? asImpossible(v) : v); + ValueFlow::Value& v = then ? truevalue : falsevalue; + const auto iv = v.intvalue; + // cppcheck-suppress accessMoved - FP #13628 + pm.setValue(vartok, impossible ? asImpossible(std::move(v)) : v); const Token* containerTok = settings.library.getContainerFromYield(vartok, Library::Container::Yield::SIZE); if (containerTok) - pm.setContainerSizeValue(containerTok, v.intvalue, !impossible); + pm.setContainerSizeValue(containerTok, iv, !impossible); } else if (Token::simpleMatch(tok, "!")) { programMemoryParseCondition(pm, tok->astOperand1(), endTok, settings, !then); } else if (then && Token::simpleMatch(tok, "&&")) { diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index fdf7394aa3a..b7b860066d9 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3006,10 +3006,10 @@ static void valueFlowLifetime(TokenList &tokenlist, ErrorLogger &errorLogger, co if (tok2 && tok2 != op1 && (!tok2->variable() || !tok2->variable()->isArray()) && !(tok2->valueType() && tok2->valueType()->container)) continue; } - for (const ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(tok->astOperand1(), settings)) { + for (ValueFlow::LifetimeToken& lt : ValueFlow::getLifetimeTokens(tok->astOperand1(), settings)) { if (!settings.certainty.isEnabled(Certainty::inconclusive) && lt.inconclusive) continue; - ErrorPath errorPath = lt.errorPath; + ErrorPath& errorPath = lt.errorPath; errorPath.emplace_back(tok, "Address of variable taken here."); ValueFlow::Value value; @@ -3795,16 +3795,15 @@ template static void valueFlowForwardConst(Token* start, const Token* end, const Variable* var, - const ContainerOfValue& values, - const Settings& settings, - int /*unused*/ = 0) + ContainerOfValue values, + const Settings& settings) { if (!precedes(start, end)) throw InternalError(var->nameToken(), "valueFlowForwardConst: start token does not precede the end token."); for (Token* tok = start; tok != end; tok = tok->next()) { if (tok->varId() == var->declarationId()) { - for (const ValueFlow::Value& value : values) - setTokenValue(tok, value, settings); + for (ValueFlow::Value& value : values) + setTokenValue(tok, std::move(value), settings); } else { [&] { // Follow references @@ -3813,7 +3812,7 @@ static void valueFlowForwardConst(Token* start, return ref.token->varId() == var->declarationId(); }); if (it != refs.end()) { - for (ValueFlow::Value value : values) { + for (ValueFlow::Value& value : values) { if (refs.size() > 1) value.setInconclusive(); value.errorPath.insert(value.errorPath.end(), it->errors.cbegin(), it->errors.cend()); @@ -3829,7 +3828,7 @@ static void valueFlowForwardConst(Token* start, continue; if (v.tokvalue->varId() != var->declarationId()) continue; - for (ValueFlow::Value value : values) { + for (ValueFlow::Value& value : values) { if (!v.isKnown() && value.isImpossible()) continue; if (v.intvalue != 0) { @@ -3849,15 +3848,6 @@ static void valueFlowForwardConst(Token* start, } } -static void valueFlowForwardConst(Token* start, - const Token* end, - const Variable* var, - const std::initializer_list& values, - const Settings& settings) -{ - valueFlowForwardConst(start, end, var, values, settings, 0); -} - static ValueFlow::Value::Bound findVarBound(const Variable* var, const Token* start, const Token* end, @@ -3985,7 +3975,7 @@ static void valueFlowForwardAssign(Token* const tok, }); std::list constValues; constValues.splice(constValues.end(), values, it, values.end()); - valueFlowForwardConst(nextExpression, endOfVarScope, expr->variable(), constValues, settings); + valueFlowForwardConst(nextExpression, endOfVarScope, expr->variable(), std::move(constValues), settings); } if (isInitialVarAssign(expr)) { // Check if variable is only incremented or decremented @@ -4001,7 +3991,7 @@ static void valueFlowForwardAssign(Token* const tok, value.bound = b; value.invertRange(); value.setImpossible(); - valueFlowForwardConst(nextExpression, endOfVarScope, expr->variable(), {std::move(value)}, settings); + valueFlowForwardConst(nextExpression, endOfVarScope, expr->variable(), std::list{std::move(value)}, settings); } } } @@ -4209,7 +4199,7 @@ static void valueFlowAfterAssign(TokenList &tokenlist, continue; ids.insert(value.tokvalue->exprId()); } - for (ValueFlow::Value value : values) { + for (ValueFlow::Value& value : values) { if (!value.isSymbolicValue()) continue; const Token* expr = value.tokvalue; @@ -5052,7 +5042,7 @@ static void valueFlowInferCondition(TokenList& tokenlist, const Settings& settin for (const ValuePtr& model : iteratorModels) { std::vector result = infer(model, tok->str(), tok->astOperand1()->values(), tok->astOperand2()->values()); - for (ValueFlow::Value value : result) { + for (ValueFlow::Value& value : result) { value.valueType = ValueFlow::Value::ValueType::INT; setTokenValue(tok, std::move(value), settings); } @@ -5815,10 +5805,10 @@ static void valueFlowFunctionReturn(TokenList& tokenlist, ErrorLogger& errorLogg bool hasKnownValue = false; - for (const ValueFlow::Value& v : getCommonValuesFromTokens(returns)) { - setFunctionReturnValue(function, tok, v, settings, false); + for (ValueFlow::Value& v : getCommonValuesFromTokens(returns)) { if (v.isKnown()) hasKnownValue = true; + setFunctionReturnValue(function, tok, std::move(v), settings, false); } if (hasKnownValue) @@ -5844,10 +5834,10 @@ static void valueFlowFunctionReturn(TokenList& tokenlist, ErrorLogger& errorLogg if (programMemory.empty() && !arguments.empty()) continue; std::vector values = execute(function->functionScope, programMemory, settings); - for (const ValueFlow::Value& v : values) { + for (ValueFlow::Value& v : values) { if (v.isUninitValue()) continue; - setFunctionReturnValue(function, tok, v, settings); + setFunctionReturnValue(function, tok, std::move(v), settings); } } } @@ -6579,7 +6569,7 @@ static void valueFlowContainerSetTokValue(const TokenList& tokenlist, ErrorLogge value.setKnown(); Token* start = initList->link() ? initList->link() : initList->next(); if (tok->variable() && tok->variable()->isConst()) { - valueFlowForwardConst(start, tok->variable()->scope()->bodyEnd, tok->variable(), {std::move(value)}, settings); + valueFlowForwardConst(start, tok->variable()->scope()->bodyEnd, tok->variable(), std::list{std::move(value)}, settings); } else { valueFlowForward(start, tok, std::move(value), tokenlist, errorLogger, settings); } @@ -6663,8 +6653,8 @@ static void valueFlowContainerSize(const TokenList& tokenlist, continue; } - for (const ValueFlow::Value& value : values) { - valueFlowForward(nameToken->next(), var->nameToken(), value, tokenlist, errorLogger, settings); + for (ValueFlow::Value& value : values) { + valueFlowForward(nameToken->next(), var->nameToken(), std::move(value), tokenlist, errorLogger, settings); } } @@ -6710,8 +6700,8 @@ static void valueFlowContainerSize(const TokenList& tokenlist, const Token* constructorArgs = tok; values = getContainerSizeFromConstructor(constructorArgs, tok->valueType(), settings, true); } - for (const ValueFlow::Value& value : values) - setTokenValue(tok, value, settings); + for (ValueFlow::Value& value : values) + setTokenValue(tok, std::move(value), settings); } else if (Token::Match(tok->previous(), ",|(") && (Token::Match(tok, "{|%str%") || settings.library.detectContainer(tok))) { if (Token* argTok = tok->previous()->astOperand2()) { @@ -6748,8 +6738,8 @@ static void valueFlowContainerSize(const TokenList& tokenlist, Token* rhs = tok->tokAt(2)->astOperand2(); std::vector values = getInitListSize(rhs, containerTok->valueType(), settings); valueFlowContainerSetTokValue(tokenlist, errorLogger, settings, containerTok, rhs); - for (const ValueFlow::Value& value : values) - valueFlowForward(containerTok->next(), containerTok, value, tokenlist, errorLogger, settings); + for (ValueFlow::Value& value : values) + valueFlowForward(containerTok->next(), containerTok, std::move(value), tokenlist, errorLogger, settings); } } else if (Token::Match(tok, ". %name% (") && tok->astOperand1() && tok->astOperand1()->valueType() && tok->astOperand1()->valueType()->container) { @@ -7014,8 +7004,8 @@ static void valueFlowSafeFunctions(const TokenList& tokenlist, const SymbolDatab argValues.back().valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE; argValues.back().errorPath.emplace_back(arg.nameToken(), "Assuming " + arg.name() + " size is 1000000"); argValues.back().safe = true; - for (const ValueFlow::Value &value : argValues) - valueFlowForward(const_cast(functionScope->bodyStart), arg.nameToken(), value, tokenlist, errorLogger, settings); + for (ValueFlow::Value &value : argValues) + valueFlowForward(const_cast(functionScope->bodyStart), arg.nameToken(), std::move(value), tokenlist, errorLogger, settings); continue; } diff --git a/lib/vf_settokenvalue.cpp b/lib/vf_settokenvalue.cpp index b2647bf46ec..19643f3629b 100644 --- a/lib/vf_settokenvalue.cpp +++ b/lib/vf_settokenvalue.cpp @@ -258,8 +258,9 @@ namespace ValueFlow } if (Token::simpleMatch(parent, "=") && astIsRHS(tok)) { - setTokenValue(parent, value, settings); - if (!value.isUninitValue()) + const bool isUninit = value.isUninitValue(); + setTokenValue(parent, std::move(value), settings); + if (!isUninit) return; }