Skip to content

Commit d8fada6

Browse files
committed
Refactoring FwdAnalysis
1 parent 6734571 commit d8fada6

3 files changed

Lines changed: 32 additions & 26 deletions

File tree

lib/astutils.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,21 +1053,8 @@ static bool hasFunctionCall(const Token *tok)
10531053
return hasFunctionCall(tok->astOperand1()) || hasFunctionCall(tok->astOperand2());
10541054
}
10551055

1056-
FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Token *startToken, const Token *endToken)
1056+
FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const Token *startToken, const Token *endToken, const std::set<unsigned int> &exprVarIds, bool local)
10571057
{
1058-
// all variable ids in assign1 LHS.
1059-
std::set<unsigned int> assign1LhsVarIds;
1060-
bool local = true;
1061-
visitAstNodes(assign1->astOperand1(),
1062-
[&](const Token *tok) {
1063-
if (tok->varId() > 0) {
1064-
assign1LhsVarIds.insert(tok->varId());
1065-
if (!Token::simpleMatch(tok->previous(), "."))
1066-
local &= !nonLocal(tok->variable());
1067-
}
1068-
return ChildrenToVisit::op1_and_op2;
1069-
});
1070-
10711058
// Parse the given tokens
10721059
for (const Token *tok = startToken; tok != endToken; tok = tok->next()) {
10731060
if (Token::simpleMatch(tok, "try {")) {
@@ -1101,7 +1088,7 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11011088
return Result(Result::Type::BAILOUT);
11021089
}
11031090

1104-
if (assign1LhsVarIds.find(tok->varId()) != assign1LhsVarIds.end()) {
1091+
if (exprVarIds.find(tok->varId()) != exprVarIds.end()) {
11051092
const Token *parent = tok;
11061093
while (Token::Match(parent->astParent(), ".|::|["))
11071094
parent = parent->astParent();
@@ -1110,10 +1097,10 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11101097
// TODO: this is a quick bailout
11111098
return Result(Result::Type::BAILOUT);
11121099
}
1113-
if (hasOperand(parent->astParent()->astOperand2(), assign1->astOperand1())) {
1100+
if (hasOperand(parent->astParent()->astOperand2(), expr)) {
11141101
return Result(Result::Type::READ);
11151102
}
1116-
const bool reassign = isSameExpression(mCpp, false, assign1->astOperand1(), parent, mLibrary, false, false, nullptr);
1103+
const bool reassign = isSameExpression(mCpp, false, expr, parent, mLibrary, false, false, nullptr);
11171104
if (reassign)
11181105
return Result(Result::Type::WRITE, parent->astParent());
11191106
return Result(Result::Type::READ);
@@ -1124,12 +1111,12 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11241111
}
11251112

11261113
if (Token::Match(tok, ") {")) {
1127-
const Result &result1 = checkRecursive(assign1, tok->tokAt(2), tok->linkAt(1));
1114+
const Result &result1 = checkRecursive(expr, tok->tokAt(2), tok->linkAt(1), exprVarIds, local);
11281115
if (result1.type == Result::Type::READ || result1.type == Result::Type::BAILOUT)
11291116
return result1;
11301117
if (Token::simpleMatch(tok->linkAt(1), "} else {")) {
11311118
const Token *elseStart = tok->linkAt(1)->tokAt(2);
1132-
const Result &result2 = checkRecursive(assign1, elseStart, elseStart->link());
1119+
const Result &result2 = checkRecursive(expr, elseStart, elseStart->link(), exprVarIds, local);
11331120
if (result2.type == Result::Type::READ || result2.type == Result::Type::BAILOUT)
11341121
return result2;
11351122
if (result1.type == Result::Type::WRITE && result2.type == Result::Type::WRITE)
@@ -1144,9 +1131,22 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11441131
return Result(Result::Type::NONE);
11451132
}
11461133

1147-
FwdAnalysis::Result FwdAnalysis::check(const Token *assign1, const Token *startToken, const Token *endToken)
1134+
FwdAnalysis::Result FwdAnalysis::check(const Token *expr, const Token *startToken, const Token *endToken)
11481135
{
1149-
Result result = checkRecursive(assign1, startToken, endToken);
1136+
// all variable ids in expr.
1137+
std::set<unsigned int> exprVarIds;
1138+
bool local = true;
1139+
visitAstNodes(expr,
1140+
[&](const Token *tok) {
1141+
if (tok->varId() > 0) {
1142+
exprVarIds.insert(tok->varId());
1143+
if (!Token::simpleMatch(tok->previous(), "."))
1144+
local &= !nonLocal(tok->variable());
1145+
}
1146+
return ChildrenToVisit::op1_and_op2;
1147+
});
1148+
1149+
Result result = checkRecursive(expr, startToken, endToken, exprVarIds, local);
11501150

11511151
// Break => continue checking in outer scope
11521152
while (result.type == FwdAnalysis::Result::Type::BREAK) {
@@ -1155,7 +1155,7 @@ FwdAnalysis::Result FwdAnalysis::check(const Token *assign1, const Token *startT
11551155
s = s->nestedIn;
11561156
if (s->type != Scope::eSwitch)
11571157
break;
1158-
result = checkRecursive(assign1, s->bodyEnd->next(), endToken);
1158+
result = checkRecursive(expr, s->bodyEnd->next(), endToken, exprVarIds, local);
11591159
}
11601160

11611161
return result;

lib/astutils.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,19 @@ class FwdAnalysis {
172172
const Token *token;
173173
};
174174

175-
/** forward analysis */
176-
struct Result check(const Token *assign1, const Token *startToken, const Token *endToken);
175+
/**
176+
* General purpose forward analysis for "expr". The "expr" can be a tree (x.y[12]) or something like that.
177+
* @param expr Symbolic expression to perform forward analysis for
178+
* @param startToken First token in forward analysis
179+
* @param endToken Last token in forward analysis
180+
* @return A Result struct.
181+
*/
182+
struct Result check(const Token *expr, const Token *startToken, const Token *endToken);
177183

178184
bool hasOperand(const Token *tok, const Token *lhs) const;
179185

180186
private:
181-
struct Result checkRecursive(const Token *assign1, const Token *startToken, const Token *endToken);
187+
struct Result checkRecursive(const Token *expr, const Token *startToken, const Token *endToken, const std::set<unsigned int> &exprVarIds, bool local);
182188

183189
const bool mCpp;
184190
const Library &mLibrary;

lib/checkother.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ void CheckOther::checkRedundantAssignment()
486486
start = tok->findExpressionStartEndTokens().second->next();
487487

488488
// Get next assignment..
489-
FwdAnalysis::Result nextAssign = fwdAnalysis.check(tok, start, scope->bodyEnd);
489+
FwdAnalysis::Result nextAssign = fwdAnalysis.check(tok->astOperand1(), start, scope->bodyEnd);
490490

491491
if (nextAssign.type != FwdAnalysis::Result::Type::WRITE || !nextAssign.token)
492492
continue;

0 commit comments

Comments
 (0)