Merge pull request #26 from edward-san/div_by_zero

- Fixed the 'division by zero' crash in the constant expression parsing.
This commit is contained in:
coelckers 2015-09-05 23:20:04 +02:00
commit ae5f03691a
3 changed files with 12 additions and 4 deletions

View file

@ -104,6 +104,7 @@ static struct
{ ERR_MISSING_COLON, "Missing colon." },
{ ERR_BAD_EXPR, "Syntax error in expression." },
{ ERR_BAD_CONST_EXPR, "Syntax error in constant expression." },
{ ERR_DIV_BY_ZERO_IN_CONST_EXPR, "Division by zero in constant expression." },
{ ERR_NO_DIRECT_VER, "Internal function has no direct version." },
{ ERR_ILLEGAL_EXPR_IDENT, "%s : Illegal identifier in expression." },
{ ERR_EXPR_FUNC_NO_RET_VAL, "Function call in expression has no return value." },

View file

@ -69,6 +69,7 @@ typedef enum
ERR_MISSING_COLON,
ERR_BAD_EXPR,
ERR_BAD_CONST_EXPR,
ERR_DIV_BY_ZERO_IN_CONST_EXPR,
ERR_NO_DIRECT_VER,
ERR_ILLEGAL_EXPR_IDENT,
ERR_EXPR_FUNC_NO_RET_VAL,

14
parse.c
View file

@ -3807,12 +3807,18 @@ static void SendExprCommand(pcd_t pcd)
PushExStk(PopExStk()*PopExStk());
break;
case PCD_DIVIDE:
operand2 = PopExStk();
PushExStk(PopExStk()/operand2);
break;
case PCD_MODULUS:
operand2 = PopExStk();
PushExStk(PopExStk()%operand2);
operand1 = PopExStk();
if (operand2 != 0)
{
PushExStk(pcd == PCD_DIVIDE ? operand1/operand2 : operand1%operand2);
}
else
{
ERR_Error(ERR_DIV_BY_ZERO_IN_CONST_EXPR, YES);
PushExStk(operand1);
}
break;
case PCD_EQ:
PushExStk(PopExStk() == PopExStk());