Skip to content

Commit d135695

Browse files
committed
ValueFlow: avoid unnecessary ValuePtr and Value copies [skip ci]
1 parent 0eb54ba commit d135695

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
@@ -47,8 +47,8 @@
4747
namespace {
4848
struct ForwardTraversal {
4949
enum class Progress : std::uint8_t { Continue, Break, Skip };
50-
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
51-
: analyzer(analyzer), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
50+
ForwardTraversal(ValuePtr<Analyzer> analyzer, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
51+
: analyzer(std::move(analyzer)), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
5252
{}
5353
ValuePtr<Analyzer> analyzer;
5454
const TokenList& tokenList;
@@ -900,24 +900,24 @@ namespace {
900900
};
901901
}
902902

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

914-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
914+
Analyzer::Result valueFlowGenericForward(Token* start, ValuePtr<Analyzer> a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
915915
{
916916
if (Settings::terminated())
917917
throw TerminateException();
918918
if (a->invalid())
919919
return Analyzer::Result{Analyzer::Action::None, Analyzer::Terminate::Bail};
920-
ForwardTraversal ft{a, tokenList, errorLogger, settings};
920+
ForwardTraversal ft{std::move(a), tokenList, errorLogger, settings};
921921
(void)ft.updateRecursive(start);
922922
return Analyzer::Result{ ft.actions, ft.terminate };
923923
}

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;
@@ -251,7 +251,7 @@ namespace {
251251
if (a) {
252252
valueFlowGenericForward(nextAfterAstRightmostLeaf(assignTok->astOperand2()),
253253
assignTok->astOperand2()->scope()->bodyEnd,
254-
a,
254+
std::move(a),
255255
tokenlist,
256256
errorLogger,
257257
settings);
@@ -265,11 +265,11 @@ namespace {
265265
if (a) {
266266
valueFlowGenericForward(nextAfterAstRightmostLeaf(assignTok->astOperand2()),
267267
assignTok->astOperand2()->scope()->bodyEnd,
268-
a,
268+
std::move(a),
269269
tokenlist,
270270
errorLogger,
271271
settings);
272-
valueFlowGenericReverse(assignTok->astOperand1()->previous(), end, a, tokenlist, errorLogger, settings);
272+
valueFlowGenericReverse(assignTok->astOperand1()->previous(), end, std::move(a), tokenlist, errorLogger, settings);
273273
}
274274
}
275275
}
@@ -302,7 +302,7 @@ namespace {
302302
break;
303303
if (condAction.isModified())
304304
break;
305-
valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings);
305+
valueFlowGenericForward(condTok, std::move(analyzer), tokenlist, errorLogger, settings);
306306
}
307307
Token* thenEnd;
308308
const bool hasElse = Token::simpleMatch(tok->link()->tokAt(-2), "} else {");
@@ -331,7 +331,7 @@ namespace {
331331
break;
332332

333333
if (!thenAction.isModified() && !elseAction.isModified())
334-
valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings);
334+
valueFlowGenericForward(condTok, std::move(analyzer), tokenlist, errorLogger, settings);
335335
else if (condAction.isRead())
336336
break;
337337
// If the condition modifies the variable then bail
@@ -350,7 +350,7 @@ namespace {
350350
}
351351
Token* condTok = getCondTokFromEnd(tok->link());
352352
if (condTok) {
353-
Analyzer::Result r = valueFlowGenericForward(condTok, analyzer, tokenlist, errorLogger, settings);
353+
Analyzer::Result r = valueFlowGenericForward(condTok, std::move(analyzer), tokenlist, errorLogger, settings);
354354
if (r.action.isModified())
355355
break;
356356
}
@@ -403,10 +403,10 @@ namespace {
403403
};
404404
}
405405

406-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
406+
void valueFlowGenericReverse(Token* start, const Token* end, ValuePtr<Analyzer> a, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
407407
{
408408
if (a->invalid())
409409
return;
410-
ReverseTraversal rt{a, tokenlist, errorLogger, settings};
410+
ReverseTraversal rt{std::move(a), tokenlist, errorLogger, settings};
411411
rt.traverse(start, end);
412412
}

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
@@ -3362,14 +3362,14 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
33623362
condTok2,
33633363
makeConditionValue(1, condTok2, /*assume*/ true, !isBool, settings),
33643364
settings); // don't set '1' for non-boolean expressions
3365-
valueFlowGenericForward(startTok, startTok->link(), a1, tokenlist, errorLogger, settings);
3365+
valueFlowGenericForward(startTok, startTok->link(), std::move(a1), tokenlist, errorLogger, settings);
33663366
}
33673367

33683368
auto a2 = makeOppositeExpressionAnalyzer(true,
33693369
condTok2,
33703370
makeConditionValue(0, condTok2, true, false, settings),
33713371
settings);
3372-
valueFlowGenericForward(startTok, startTok->link(), a2, tokenlist, errorLogger, settings);
3372+
valueFlowGenericForward(startTok, startTok->link(), std::move(a2), tokenlist, errorLogger, settings);
33733373
}
33743374
}
33753375

@@ -3384,15 +3384,15 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
33843384
auto a1 = makeSameExpressionAnalyzer(condTok2,
33853385
makeConditionValue(0, condTok2, false, false, settings),
33863386
settings);
3387-
valueFlowGenericForward(startTok, startTok->link(), a1, tokenlist, errorLogger, settings);
3387+
valueFlowGenericForward(startTok, startTok->link(), std::move(a1), tokenlist, errorLogger, settings);
33883388

33893389
if (is1) {
33903390
auto a2 =
33913391
makeOppositeExpressionAnalyzer(true,
33923392
condTok2,
33933393
makeConditionValue(isOp, condTok2, false, false, settings),
33943394
settings);
3395-
valueFlowGenericForward(startTok, startTok->link(), a2, tokenlist, errorLogger, settings);
3395+
valueFlowGenericForward(startTok, startTok->link(), std::move(a2), tokenlist, errorLogger, settings);
33963396
}
33973397
}
33983398
}
@@ -3410,7 +3410,7 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
34103410
auto a1 = makeSameExpressionAnalyzer(condTok2,
34113411
makeConditionValue(0, condTok2, false, false, settings),
34123412
settings);
3413-
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, a1, tokenlist, errorLogger, settings);
3413+
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, std::move(a1), tokenlist, errorLogger, settings);
34143414

34153415
if (is1) {
34163416
auto a2 = makeOppositeExpressionAnalyzer(true,
@@ -3419,7 +3419,7 @@ static void valueFlowConditionExpressions(const TokenList& tokenlist,
34193419
settings);
34203420
valueFlowGenericForward(startTok->link()->next(),
34213421
scope2->bodyEnd,
3422-
a2,
3422+
std::move(a2),
34233423
tokenlist,
34243424
errorLogger,
34253425
settings);
@@ -5404,7 +5404,7 @@ static void valueFlowInjectParameter(const TokenList& tokenlist,
54045404
auto a = makeMultiValueFlowAnalyzer(arg, settings);
54055405
valueFlowGenericForward(const_cast<Token*>(functionScope->bodyStart),
54065406
functionScope->bodyEnd,
5407-
a,
5407+
std::move(a),
54085408
tokenlist,
54095409
errorLogger,
54105410
settings);
@@ -5932,7 +5932,7 @@ static void valueFlowUninit(TokenList& tokenlist, ErrorLogger& errorLogger, cons
59325932
}
59335933
auto partialReadsAnalyzer = std::make_shared<PartialReadContainer>();
59345934
auto analyzer = makeMemberExpressionAnalyzer(memVar.nameToken()->str(), tok, uninitValue, partialReadsAnalyzer, settings);
5935-
valueFlowGenericForward(start, tok->scope()->bodyEnd, analyzer, tokenlist, errorLogger, settings);
5935+
valueFlowGenericForward(start, tok->scope()->bodyEnd, std::move(analyzer), tokenlist, errorLogger, settings);
59365936

59375937
for (auto&& p : *partialReadsAnalyzer) {
59385938
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)