Fix infinite for(;;) loop

This commit is contained in:
drmortalwombat 2021-10-16 10:49:11 +02:00
parent 545b9a6aba
commit c2886e2532
2 changed files with 23 additions and 3 deletions

View File

@ -1856,6 +1856,18 @@ void InterCodeBasicBlock::CollectEntries(void)
}
}
static bool IsInfiniteLoop(const InterCodeBasicBlock* block)
{
const InterCodeBasicBlock* nblock = block;
while (nblock->mTrueJump && !nblock->mFalseJump)
{
nblock = nblock->mTrueJump;
if (nblock == block)
return true;
}
return false;
}
void InterCodeBasicBlock::GenerateTraces(void)
{
int i;
@ -1884,7 +1896,7 @@ void InterCodeBasicBlock::GenerateTraces(void)
if (mFalseJump)
mFalseJump->mNumEntries++;
}
else if (mTrueJump && !mFalseJump && ((mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead)
else if (mTrueJump && !mFalseJump && ((mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump))
{
mTrueJump->mNumEntries--;

View File

@ -1721,16 +1721,24 @@ Expression* Parser::ParseStatement(void)
exp = new Expression(mScanner->mLocation, EX_FOR);
exp->mLeft = new Expression(mScanner->mLocation, EX_SEQUENCE);
exp->mLeft->mLeft = new Expression(mScanner->mLocation, EX_SEQUENCE);
exp->mLeft->mRight = ParseExpression();
// Assignment
if (mScanner->mToken != TK_SEMICOLON)
exp->mLeft->mRight = ParseExpression();
if (mScanner->mToken == TK_SEMICOLON)
mScanner->NextToken();
else
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "';' expected");
exp->mLeft->mLeft->mLeft = ParseExpression();
// Condition
if (mScanner->mToken != TK_SEMICOLON)
exp->mLeft->mLeft->mLeft = ParseExpression();
if (mScanner->mToken == TK_SEMICOLON)
mScanner->NextToken();
else
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "';' expected");
// Iteration
if (mScanner->mToken != TK_CLOSE_PARENTHESIS)
exp->mLeft->mLeft->mRight = ParseExpression();
if (mScanner->mToken == TK_CLOSE_PARENTHESIS)