Skip to content

Commit a0d3c2c

Browse files
authored
Handle for loop conditions in afterCondition (#3561)
1 parent 112363c commit a0d3c2c

6 files changed

Lines changed: 247 additions & 152 deletions

File tree

lib/astutils.cpp

100755100644
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,38 @@ static T* getCondTokFromEndImpl(T* endBlock)
595595
return nullptr;
596596
}
597597

598+
template<class T, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
599+
static T* getInitTokImpl(T* tok)
600+
{
601+
if (!tok)
602+
return nullptr;
603+
if (Token::Match(tok, "%name% ("))
604+
return getInitTokImpl(tok->next());
605+
if (tok->str() != "(")
606+
return nullptr;
607+
if (!Token::simpleMatch(tok->astOperand2(), ";"))
608+
return nullptr;
609+
if (Token::simpleMatch(tok->astOperand2()->astOperand1(), ";"))
610+
return nullptr;
611+
return tok->astOperand2()->astOperand1();
612+
}
613+
614+
template<class T, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
615+
static T* getStepTokImpl(T* tok)
616+
{
617+
if (!tok)
618+
return nullptr;
619+
if (Token::Match(tok, "%name% ("))
620+
return getStepTokImpl(tok->next());
621+
if (tok->str() != "(")
622+
return nullptr;
623+
if (!Token::simpleMatch(tok->astOperand2(), ";"))
624+
return nullptr;
625+
if (!Token::simpleMatch(tok->astOperand2()->astOperand2(), ";"))
626+
return nullptr;
627+
return tok->astOperand2()->astOperand2()->astOperand2();
628+
}
629+
598630
Token* getCondTok(Token* tok)
599631
{
600632
return getCondTokImpl(tok);
@@ -613,6 +645,20 @@ const Token* getCondTokFromEnd(const Token* endBlock)
613645
return getCondTokFromEndImpl(endBlock);
614646
}
615647

648+
Token* getInitTok(Token* tok) {
649+
return getInitTokImpl(tok);
650+
}
651+
const Token* getInitTok(const Token* tok) {
652+
return getInitTokImpl(tok);
653+
}
654+
655+
Token* getStepTok(Token* tok) {
656+
return getStepTokImpl(tok);
657+
}
658+
const Token* getStepTok(const Token* tok) {
659+
return getStepTokImpl(tok);
660+
}
661+
616662
const Token *findNextTokenFromBreak(const Token *breakToken)
617663
{
618664
const Scope *scope = breakToken->scope();

lib/astutils.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,12 @@ bool astIsRHS(const Token* tok);
126126
Token* getCondTok(Token* tok);
127127
const Token* getCondTok(const Token* tok);
128128

129+
Token* getInitTok(Token* tok);
130+
const Token* getInitTok(const Token* tok);
131+
132+
Token* getStepTok(Token* tok);
133+
const Token* getStepTok(const Token* tok);
134+
129135
Token* getCondTokFromEnd(Token* endBlock);
130136
const Token* getCondTokFromEnd(const Token* endBlock);
131137

lib/forwardanalyzer.cpp

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -784,34 +784,6 @@ struct ForwardTraversal {
784784
return parent && (parent->str() == ":" || parent->astOperand2() == tok);
785785
}
786786

787-
static Token* getInitTok(Token* tok) {
788-
if (!tok)
789-
return nullptr;
790-
if (Token::Match(tok, "%name% ("))
791-
return getInitTok(tok->next());
792-
if (tok->str() != "(")
793-
return nullptr;
794-
if (!Token::simpleMatch(tok->astOperand2(), ";"))
795-
return nullptr;
796-
if (Token::simpleMatch(tok->astOperand2()->astOperand1(), ";"))
797-
return nullptr;
798-
return tok->astOperand2()->astOperand1();
799-
}
800-
801-
static Token* getStepTok(Token* tok) {
802-
if (!tok)
803-
return nullptr;
804-
if (Token::Match(tok, "%name% ("))
805-
return getStepTok(tok->next());
806-
if (tok->str() != "(")
807-
return nullptr;
808-
if (!Token::simpleMatch(tok->astOperand2(), ";"))
809-
return nullptr;
810-
if (!Token::simpleMatch(tok->astOperand2()->astOperand2(), ";"))
811-
return nullptr;
812-
return tok->astOperand2()->astOperand2()->astOperand2();
813-
}
814-
815787
static Token* getStepTokFromEnd(Token* tok) {
816788
if (!Token::simpleMatch(tok, "}"))
817789
return nullptr;

lib/programmemory.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -692,8 +692,9 @@ static ValueFlow::Value execute(const Token* expr, ProgramMemory& pm)
692692
void execute(const Token* expr, ProgramMemory* const programMemory, MathLib::bigint* result, bool* error)
693693
{
694694
ValueFlow::Value v = execute(expr, *programMemory);
695-
if (!v.isIntValue() || v.isImpossible())
696-
*error = true;
697-
else
695+
if (!v.isIntValue() || v.isImpossible()) {
696+
if (error)
697+
*error = true;
698+
} else if (result)
698699
*result = v.intvalue;
699700
}

0 commit comments

Comments
 (0)