Skip to content

Commit

Permalink
Fix integer addition/subtraction overflow (#1091)
Browse files Browse the repository at this point in the history
  • Loading branch information
conicgames authored Feb 16, 2022
1 parent bb070cc commit b271cef
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
16 changes: 16 additions & 0 deletions Jint.Tests/Runtime/EngineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,22 @@ public void NaNIsNan()
");
}

[Theory]
[InlineData(2147483647, 1, 2147483648)]
[InlineData(-2147483647, -2, -2147483649)]
public void IntegerAdditionShouldNotOverflow(int lhs, int rhs, long result)
{
RunTest($"assert({lhs} + {rhs} == {result})");
}

[Theory]
[InlineData(2147483647, -1, 2147483648)]
[InlineData(-2147483647, 2, -2147483649)]
public void IntegerSubtractionShouldNotOverflow(int lhs, int rhs, long result)
{
RunTest($"assert({lhs} - {rhs} == {result})");
}

[Fact]
public void ToNumberHandlesStringObject()
{
Expand Down
6 changes: 3 additions & 3 deletions Jint/Native/JsNumber.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,17 @@ public JsNumber(int value) : base(InternalTypes.Integer)
_value = value;
}

public JsNumber(uint value) : base(value < int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
public JsNumber(uint value) : base(value <= int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
{
_value = value;
}

public JsNumber(ulong value) : base(value < int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
public JsNumber(ulong value) : base(value <= int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
{
_value = value;
}

public JsNumber(long value) : base(value < int.MaxValue && value > int.MinValue ? InternalTypes.Integer : InternalTypes.Number)
public JsNumber(long value) : base(value <= int.MaxValue && value >= int.MinValue ? InternalTypes.Integer : InternalTypes.Number)
{
_value = value;
}
Expand Down
4 changes: 2 additions & 2 deletions Jint/Runtime/Interpreter/Expressions/JintBinaryExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ protected override ExpressionResult EvaluateInternal(EvaluationContext context)

if (AreIntegerOperands(left, right))
{
return NormalCompletion(JsNumber.Create(left.AsInteger() + right.AsInteger()));
return NormalCompletion(JsNumber.Create((long)left.AsInteger() + right.AsInteger()));
}

var lprim = TypeConverter.ToPrimitive(left);
Expand Down Expand Up @@ -315,7 +315,7 @@ protected override ExpressionResult EvaluateInternal(EvaluationContext context)

if (AreIntegerOperands(left, right))
{
number = JsNumber.Create(left.AsInteger() - right.AsInteger());
number = JsNumber.Create((long)left.AsInteger() - right.AsInteger());
}
else if (AreNonBigIntOperands(left, right))
{
Expand Down

0 comments on commit b271cef

Please sign in to comment.