Skip to content

Commit c35fc44

Browse files
committed
ValueFlow: avoid unnecessary ValuePtr and Value copies [skip ci]
1 parent aa1659f commit c35fc44

File tree

6 files changed

+34
-28
lines changed

6 files changed

+34
-28
lines changed

lib/forwardanalyzer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ namespace {
4747
struct ForwardTraversal {
4848
enum class Progress { Continue, Break, Skip };
4949
enum class Terminate { None, Bail, Inconclusive };
50-
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
51-
: analyzer(analyzer), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
50+
ForwardTraversal(ValuePtr<Analyzer> analyzer, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
51+
: analyzer(std::move(analyzer)), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
5252
{}
5353
ValuePtr<Analyzer> analyzer;
5454
const TokenList& tokenList;
@@ -904,24 +904,24 @@ namespace {
904904
};
905905
}
906906

907-
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
907+
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, ValuePtr<Analyzer> a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
908908
{
909909
if (a->invalid())
910910
return Analyzer::Result{Analyzer::Action::None, Analyzer::Terminate::Bail};
911-
ForwardTraversal ft{a, tokenList, errorLogger, settings};
911+
ForwardTraversal ft{std::move(a), tokenList, errorLogger, settings};
912912
if (start)
913913
ft.analyzer->updateState(start);
914914
ft.updateRange(start, end);
915915
return Analyzer::Result{ ft.actions, ft.terminate };
916916
}
917917

918-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
918+
Analyzer::Result valueFlowGenericForward(Token* start, ValuePtr<Analyzer> a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
919919
{
920920
if (Settings::terminated())
921921
throw TerminateException();
922922
if (a->invalid())
923923
return Analyzer::Result{Analyzer::Action::None, Analyzer::Terminate::Bail};
924-
ForwardTraversal ft{a, tokenList, errorLogger, settings};
924+
ForwardTraversal ft{std::move(a), tokenList, errorLogger, settings};
925925
ft.updateRecursive(start);
926926
return Analyzer::Result{ ft.actions, ft.terminate };
927927
}

lib/forwardanalyzer.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,19 @@
2020
#define forwardanalyzerH
2121

2222
#include "analyzer.h"
23+
#include "valueptr.h"
2324

2425
class ErrorLogger;
2526
class Settings;
2627
class Token;
2728
class TokenList;
28-
template<class T> class ValuePtr;
2929

3030
Analyzer::Result valueFlowGenericForward(Token* start,
31-
const Token* end,
32-
const ValuePtr<Analyzer>& a,
31+
const Token* end,ValuePtr<Analyzer> a,
3332
const TokenList& tokenList,
3433
ErrorLogger* const errorLogger,
3534
const Settings& settings);
3635

37-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings);
36+
Analyzer::Result valueFlowGenericForward(Token* start, ValuePtr<Analyzer> a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings);
3837

3938
#endif

lib/reverseanalyzer.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737

3838
namespace {
3939
struct ReverseTraversal {
40-
ReverseTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings)
41-
: analyzer(analyzer), tokenlist(tokenlist), errorLogger(errorLogger), settings(settings)
40+
ReverseTraversal(ValuePtr<Analyzer> analyzer, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings)
41+
: analyzer(std::move(analyzer)), tokenlist(tokenlist), errorLogger(errorLogger), settings(settings)
4242
{}
4343
ValuePtr<Analyzer> analyzer;
4444
const TokenList& tokenlist;
@@ -240,7 +240,7 @@ namespace {
240240
if (a) {
241241
valueFlowGenericForward(nextAfterAstRightmostLeaf(assignTok->astOperand2()),
242242
assignTok->astOperand2()->scope()->bodyEnd,
243-
a,
243+
std::move(a),
244244
tokenlist,
245245
errorLogger,
246246
settings);
@@ -254,11 +254,11 @@ namespace {
254254
if (a) {
255255
valueFlowGenericForward(nextAfterAstRightmostLeaf(assignTok->astOperand2()),
256256
assignTok->astOperand2()->scope()->bodyEnd,
257-
a,
257+
std::move(a),
258258
tokenlist,
259259
errorLogger,
260260
settings);
261-
valueFlowGenericReverse(assignTok->astOperand1()->previous(), end, a, tokenlist, errorLogger, settings);
261+
valueFlowGenericReverse(assignTok->astOperand1()->previous(), end, std::move(a), tokenlist, errorLogger, settings);
262262
}
263263
}
264264
}
@@ -395,10 +395,10 @@ namespace {
395395
};
396396
}
397397

398-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings)
398+
void valueFlowGenericReverse(Token* start, const Token* end, ValuePtr<Analyzer> a, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings)
399399
{
400400
if (a->invalid())
401401
return;
402-
ReverseTraversal rt{a, tokenlist, errorLogger, settings};
402+
ReverseTraversal rt{std::move(a), tokenlist, errorLogger, settings};
403403
rt.traverse(start, end);
404404
}

lib/reverseanalyzer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
#ifndef reverseanalyzerH
2020
#define reverseanalyzerH
2121

22+
#include "valueptr.h"
23+
2224
struct Analyzer;
2325
class ErrorLogger;
2426
class Settings;
2527
class Token;
2628
class TokenList;
27-
template<class T>
28-
class ValuePtr;
2929

30-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings);
30+
void valueFlowGenericReverse(Token* start, const Token* end, ValuePtr<Analyzer> a, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings);
3131

3232
#endif

lib/valueflow.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5367,11 +5367,11 @@ static void valueFlowConditionExpressions(const TokenList &tokenlist, const Symb
53675367
if (is1) {
53685368
const bool isBool = astIsBool(condTok2) || Token::Match(condTok2, "%comp%|%oror%|&&");
53695369
SameExpressionAnalyzer a1(condTok2, makeConditionValue(1, condTok2, /*assume*/ true, !isBool), tokenlist, settings); // don't set '1' for non-boolean expressions
5370-
valueFlowGenericForward(startTok, startTok->link(), a1, tokenlist, errorLogger, settings);
5370+
valueFlowGenericForward(startTok, startTok->link(), std::move(a1), tokenlist, errorLogger, settings);
53715371
}
53725372

53735373
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(0, condTok2, true), tokenlist, settings);
5374-
valueFlowGenericForward(startTok, startTok->link(), a2, tokenlist, errorLogger, settings);
5374+
valueFlowGenericForward(startTok, startTok->link(), std::move(a2), tokenlist, errorLogger, settings);
53755375
}
53765376
}
53775377

@@ -5382,11 +5382,11 @@ static void valueFlowConditionExpressions(const TokenList &tokenlist, const Symb
53825382
startTok = startTok->link()->tokAt(2);
53835383
for (const Token* condTok2:conds) {
53845384
SameExpressionAnalyzer a1(condTok2, makeConditionValue(0, condTok2, false), tokenlist, settings);
5385-
valueFlowGenericForward(startTok, startTok->link(), a1, tokenlist, errorLogger, settings);
5385+
valueFlowGenericForward(startTok, startTok->link(), <std::move(a1), tokenlist, errorLogger, settings);
53865386

53875387
if (is1) {
53885388
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(1, condTok2, false), tokenlist, settings);
5389-
valueFlowGenericForward(startTok, startTok->link(), a2, tokenlist, errorLogger, settings);
5389+
valueFlowGenericForward(startTok, startTok->link(), std::move(a2), tokenlist, errorLogger, settings);
53905390
}
53915391
}
53925392
}
@@ -5402,11 +5402,11 @@ static void valueFlowConditionExpressions(const TokenList &tokenlist, const Symb
54025402
}
54035403
for (const Token* condTok2:conds) {
54045404
SameExpressionAnalyzer a1(condTok2, makeConditionValue(0, condTok2, false), tokenlist, settings);
5405-
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, a1, tokenlist, errorLogger, settings);
5405+
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, std::move(a1), tokenlist, errorLogger, settings);
54065406

54075407
if (is1) {
54085408
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(1, condTok2, false), tokenlist, settings);
5409-
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, a2, tokenlist, errorLogger, settings);
5409+
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, std::move(a2), tokenlist, errorLogger, settings);
54105410
}
54115411
}
54125412
}
@@ -7552,7 +7552,7 @@ static void valueFlowInjectParameter(TokenList& tokenlist,
75527552
{
75537553
const bool r = productParams(settings, vars, [&](const std::unordered_map<const Variable*, ValueFlow::Value>& arg) {
75547554
MultiValueFlowAnalyzer a(arg, tokenlist, settings);
7555-
valueFlowGenericForward(const_cast<Token*>(functionScope->bodyStart), functionScope->bodyEnd, a, tokenlist, errorLogger, settings);
7555+
valueFlowGenericForward(const_cast<Token*>(functionScope->bodyStart), functionScope->bodyEnd, std::move(a), tokenlist, errorLogger, settings);
75567556
});
75577557
if (!r) {
75587558
std::string fname = "<unknown>";
@@ -8087,7 +8087,7 @@ static void valueFlowUninit(TokenList& tokenlist, ErrorLogger* const errorLogger
80878087
continue;
80888088
}
80898089
MemberExpressionAnalyzer analyzer(memVar.nameToken()->str(), tok, uninitValue, tokenlist, settings);
8090-
valueFlowGenericForward(start, tok->scope()->bodyEnd, analyzer, tokenlist, errorLogger, settings);
8090+
valueFlowGenericForward(start, tok->scope()->bodyEnd, std::move(analyzer), tokenlist, errorLogger, settings);
80918091

80928092
for (auto&& p : *analyzer.partialReads) {
80938093
Token* tok2 = p.first;

lib/valueptr.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class CPPCHECKLIB ValuePtr {
3232
static T* apply(const T* x) {
3333
return new U(*static_cast<const U*>(x));
3434
}
35+
static T* move(T* x) {
36+
return new U(std::move(*static_cast<const U*>(x)));
37+
}
3538
};
3639

3740
public:
@@ -47,6 +50,10 @@ class CPPCHECKLIB ValuePtr {
4750
ValuePtr(const U& value) : mPtr(cloner<U>::apply(&value)), mClone(&cloner<U>::apply)
4851
{}
4952

53+
template<class U>
54+
ValuePtr(U&& value) : mPtr(cloner<U>::move(&value)), mClone(&cloner<U>::apply)
55+
{}
56+
5057
ValuePtr(const ValuePtr& rhs) : mPtr(nullptr), mClone(rhs.mClone) {
5158
if (rhs) {
5259
mPtr.reset(mClone(rhs.get()));

0 commit comments

Comments
 (0)