Skip to content

Commit

Permalink
Parser: fix spurious unsigned overflows
Browse files Browse the repository at this point in the history
  • Loading branch information
spiral-ladder authored Dec 3, 2023
1 parent a0555b0 commit a11ab45
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/aro/Parser.zig
Original file line number Diff line number Diff line change
Expand Up @@ -6445,9 +6445,11 @@ fn addExpr(p: *Parser) Error!Result {
const lhs_ty = lhs.ty;
if (try lhs.adjustTypes(minus.?, &rhs, p, if (plus != null) .add else .sub)) {
if (plus != null) {
if (try lhs.val.add(lhs.val, rhs.val, lhs.ty, p.comp)) try p.errOverflow(plus.?, lhs);
if (try lhs.val.add(lhs.val, rhs.val, lhs.ty, p.comp) and
lhs.ty.signedness(p.comp) != .unsigned) try p.errOverflow(plus.?, lhs);
} else {
if (try lhs.val.sub(lhs.val, rhs.val, lhs.ty, p.comp)) try p.errOverflow(minus.?, lhs);
if (try lhs.val.sub(lhs.val, rhs.val, lhs.ty, p.comp) and
lhs.ty.signedness(p.comp) != .unsigned) try p.errOverflow(minus.?, lhs);
}
}
if (lhs.ty.specifier != .invalid and lhs_ty.isPtr() and !lhs_ty.isVoidStar() and lhs_ty.elemType().hasIncompleteSize()) {
Expand Down Expand Up @@ -6484,9 +6486,11 @@ fn mulExpr(p: *Parser) Error!Result {

if (try lhs.adjustTypes(percent.?, &rhs, p, if (tag == .mod_expr) .integer else .arithmetic)) {
if (mul != null) {
if (try lhs.val.mul(lhs.val, rhs.val, lhs.ty, p.comp)) try p.errOverflow(mul.?, lhs);
if (try lhs.val.mul(lhs.val, rhs.val, lhs.ty, p.comp) and
lhs.ty.signedness(p.comp) != .unsigned) try p.errOverflow(mul.?, lhs);
} else if (div != null) {
if (try lhs.val.div(lhs.val, rhs.val, lhs.ty, p.comp)) try p.errOverflow(mul.?, lhs);
if (try lhs.val.div(lhs.val, rhs.val, lhs.ty, p.comp) and
lhs.ty.signedness(p.comp) != .unsigned) try p.errOverflow(mul.?, lhs);
} else {
var res = try Value.rem(lhs.val, rhs.val, lhs.ty, p.comp);
if (res.opt_ref == .none) {
Expand Down
6 changes: 6 additions & 0 deletions test/cases/arithmetic overflow.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
_Static_assert(0xFFFFFFFF + 1 == 0, "'");
_Static_assert(1 + 0xFFFFFFFF == 0, "'");
_Static_assert(0 - 0x00000001 == 0xFFFFFFFF, "'");
_Static_assert(0x00000000 - 0x00000001 == 0xFFFFFFFF, "'");
_Static_assert(0x80000000 * 2 == 0, "'");
_Static_assert(2 * 0x80000000 == 0, "'");

0 comments on commit a11ab45

Please sign in to comment.