Skip to content

Commit f0eeb7d

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

6 files changed

Lines changed: 37 additions & 31 deletions

File tree

lib/forwardanalyzer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
namespace {
4747
struct ForwardTraversal {
4848
enum class Progress : std::uint8_t { Continue, Break, Skip };
49-
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
50-
: analyzer(analyzer), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
49+
ForwardTraversal(ValuePtr<Analyzer> analyzer, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
50+
: analyzer(std::move(analyzer)), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
5151
{}
5252
ValuePtr<Analyzer> analyzer;
5353
const TokenList& tokenList;
@@ -937,24 +937,24 @@ namespace {
937937
};
938938
}
939939

940-
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
940+
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, ValuePtr<Analyzer> a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
941941
{
942942
if (a->invalid())
943943
return Analyzer::Result{Analyzer::Action::None, Analyzer::Terminate::Bail};
944-
ForwardTraversal ft{a, tokenList, errorLogger, settings};
944+
ForwardTraversal ft{std::move(a), tokenList, errorLogger, settings};
945945
if (start)
946946
ft.analyzer->updateState(start);
947947
ft.updateRange(start, end);
948948
return Analyzer::Result{ ft.actions, ft.terminate };
949949
}
950950

951-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
951+
Analyzer::Result valueFlowGenericForward(Token* start, ValuePtr<Analyzer> a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
952952
{
953953
if (Settings::terminated())
954954
throw TerminateException();
955955
if (a->invalid())
956956
return Analyzer::Result{Analyzer::Action::None, Analyzer::Terminate::Bail};
957-
ForwardTraversal ft{a, tokenList, errorLogger, settings};
957+
ForwardTraversal ft{std::move(a), tokenList, errorLogger, settings};
958958
(void)ft.updateRecursive(start);
959959
return Analyzer::Result{ ft.actions, ft.terminate };
960960
}

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& errorLogger,
3534
const Settings& settings);
3635

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

3938
#endif

lib/reverseanalyzer.cpp

Lines changed: 10 additions & 10 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& errorLogger, const Settings& settings)
41-
: analyzer(analyzer), tokenlist(tokenlist), errorLogger(errorLogger), settings(settings)
40+
ReverseTraversal(ValuePtr<Analyzer> analyzer, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
41+
: analyzer(std::move(analyzer)), tokenlist(tokenlist), errorLogger(errorLogger), settings(settings)
4242
{}
4343
ValuePtr<Analyzer> analyzer;
4444
const TokenList& tokenlist;
@@ -254,7 +254,7 @@ 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);
@@ -268,11 +268,11 @@ namespace {
268268
if (a) {
269269
valueFlowGenericForward(nextAfterAstRightmostLeaf(assignTok->astOperand2()),
270270
assignTok->astOperand2()->scope()->bodyEnd,
271-
a,
271+
std::move(a),
272272
tokenlist,
273273
errorLogger,
274274
settings);
275-
valueFlowGenericReverse(assignTok->astOperand1()->previous(), end, a, tokenlist, errorLogger, settings);
275+
valueFlowGenericReverse(assignTok->astOperand1()->previous(), end, std::move(a), tokenlist, errorLogger, settings);
276276
}
277277
}
278278
}
@@ -305,7 +305,7 @@ namespace {
305305
if (inLoop) {
306306
if (Token::findmatch(tok->link(), "goto|break", tok))
307307
break;
308-
valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings);
308+
valueFlowGenericForward(condTok, std::move(analyzer), tokenlist, errorLogger, settings);
309309
}
310310
Token* thenEnd;
311311
const bool hasElse = Token::simpleMatch(tok->link()->tokAt(-2), "} else {");
@@ -334,7 +334,7 @@ namespace {
334334
break;
335335

336336
if (!thenAction.isModified() && !elseAction.isModified())
337-
valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings);
337+
valueFlowGenericForward(condTok, std::move(analyzer), tokenlist, errorLogger, settings);
338338
else if (condAction.isRead())
339339
break;
340340
// If the condition modifies the variable then bail
@@ -353,7 +353,7 @@ namespace {
353353
}
354354
Token* condTok = getCondTokFromEnd(tok->link());
355355
if (condTok) {
356-
Analyzer::Result r = valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings);
356+
Analyzer::Result r = valueFlowGenericForward(condTok, std::move(analyzer), tokenlist, errorLogger, settings);
357357
if (r.action.isModified())
358358
break;
359359
}
@@ -406,10 +406,10 @@ namespace {
406406
};
407407
}
408408

409-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
409+
void valueFlowGenericReverse(Token* start, const Token* end, ValuePtr<Analyzer> a, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
410410
{
411411
if (a->invalid())
412412
return;
413-
ReverseTraversal rt{a, tokenlist, errorLogger, settings};
413+
ReverseTraversal rt{std::move(a), tokenlist, errorLogger, settings};
414414
rt.traverse(start, end);
415415
}

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

3232
#endif

lib/valueflow.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3432,14 +3432,14 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
34323432
condTok2,
34333433
makeConditionValue(1, condTok2, /*assume*/ true, !isBool, settings),
34343434
settings); // don't set '1' for non-boolean expressions
3435-
valueFlowGenericForward(startTok, startTok->link(), a1, tokenlist, errorLogger, settings);
3435+
valueFlowGenericForward(startTok, startTok->link(), std::move(a1), tokenlist, errorLogger, settings);
34363436
}
34373437

34383438
auto a2 = makeOppositeExpressionAnalyzer(true,
34393439
condTok2,
34403440
makeConditionValue(0, condTok2, true, false, settings),
34413441
settings);
3442-
valueFlowGenericForward(startTok, startTok->link(), a2, tokenlist, errorLogger, settings);
3442+
valueFlowGenericForward(startTok, startTok->link(), std::move(a2), tokenlist, errorLogger, settings);
34433443
}
34443444
}
34453445

@@ -3454,15 +3454,15 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
34543454
auto a1 = makeSameExpressionAnalyzer(condTok2,
34553455
makeConditionValue(0, condTok2, false, false, settings),
34563456
settings);
3457-
valueFlowGenericForward(startTok, startTok->link(), a1, tokenlist, errorLogger, settings);
3457+
valueFlowGenericForward(startTok, startTok->link(), std::move(a1), tokenlist, errorLogger, settings);
34583458

34593459
if (is1) {
34603460
auto a2 =
34613461
makeOppositeExpressionAnalyzer(true,
34623462
condTok2,
34633463
makeConditionValue(isOp, condTok2, false, false, settings),
34643464
settings);
3465-
valueFlowGenericForward(startTok, startTok->link(), a2, tokenlist, errorLogger, settings);
3465+
valueFlowGenericForward(startTok, startTok->link(), std::move(a2), tokenlist, errorLogger, settings);
34663466
}
34673467
}
34683468
}
@@ -3480,7 +3480,7 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
34803480
auto a1 = makeSameExpressionAnalyzer(condTok2,
34813481
makeConditionValue(0, condTok2, false, false, settings),
34823482
settings);
3483-
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, a1, tokenlist, errorLogger, settings);
3483+
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, std::move(a1), tokenlist, errorLogger, settings);
34843484

34853485
if (is1) {
34863486
auto a2 = makeOppositeExpressionAnalyzer(true,
@@ -3489,7 +3489,7 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
34893489
settings);
34903490
valueFlowGenericForward(startTok->link()->next(),
34913491
scope2->bodyEnd,
3492-
a2,
3492+
std::move(a2),
34933493
tokenlist,
34943494
errorLogger,
34953495
settings);
@@ -5476,7 +5476,7 @@ static void valueFlowInjectParameter(const TokenList& tokenlist,
54765476
auto a = makeMultiValueFlowAnalyzer(arg, settings);
54775477
valueFlowGenericForward(const_cast<Token*>(functionScope->bodyStart),
54785478
functionScope->bodyEnd,
5479-
a,
5479+
std::move(a),
54805480
tokenlist,
54815481
errorLogger,
54825482
settings);
@@ -6026,7 +6026,7 @@ static void valueFlowUninit(TokenList& tokenlist, ErrorLogger& errorLogger, cons
60266026
}
60276027
auto partialReadsAnalyzer = std::make_shared<PartialReadContainer>();
60286028
auto analyzer = makeMemberExpressionAnalyzer(memVar.nameToken()->str(), tok, uninitValue, partialReadsAnalyzer, settings);
6029-
valueFlowGenericForward(start, tok->scope()->bodyEnd, analyzer, tokenlist, errorLogger, settings);
6029+
valueFlowGenericForward(start, tok->scope()->bodyEnd, std::move(analyzer), tokenlist, errorLogger, settings);
60306030

60316031
for (auto&& p : *partialReadsAnalyzer) {
60326032
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:
@@ -48,6 +51,10 @@ class CPPCHECKLIB ValuePtr {
4851
ValuePtr(const U& value) : mPtr(cloner<U>::apply(&value)), mClone(&cloner<U>::apply)
4952
{}
5053

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

0 commit comments

Comments
 (0)