Module Name: src
Committed By: rillig
Date: Sun Mar 10 14:42:04 UTC 2024
Modified Files:
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: clean up check for overflow in integer constants
To generate a diff of this commit:
cvs rdiff -u -r1.619 -r1.620 src/usr.bin/xlint/lint1/tree.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.619 src/usr.bin/xlint/lint1/tree.c:1.620
--- src/usr.bin/xlint/lint1/tree.c:1.619 Sun Mar 10 14:32:30 2024
+++ src/usr.bin/xlint/lint1/tree.c Sun Mar 10 14:42:04 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.619 2024/03/10 14:32:30 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.620 2024/03/10 14:42:04 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.619 2024/03/10 14:32:30 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.620 2024/03/10 14:42:04 rillig Exp $");
#endif
#include <float.h>
@@ -795,30 +795,26 @@ fold_unsigned_integer(op_t op, uint64_t
case COMPL:
return ~l;
case UPLUS:
- return l;
+ return +l;
case UMINUS:
return -l;
- case MULT:;
- uint64_t mult_result = l * r;
- if (mult_result != (mult_result & max_value))
- *overflow = true;
- else if (l != 0 && mult_result / l != r)
- *overflow = true;
- return mult_result;
+ case MULT:
+ *overflow = r > 0 && l > max_value / r;
+ return l * r;
case DIV:
if (r == 0) {
/* division by 0 */
error(139);
return max_value;
- } else
- return l / r;
+ }
+ return l / r;
case MOD:
if (r == 0) {
/* modulus by 0 */
error(140);
return 0;
- } else
- return l % r;
+ }
+ return l % r;
case PLUS:
*overflow = l > max_value - r;
return l + r;
@@ -827,6 +823,7 @@ fold_unsigned_integer(op_t op, uint64_t
return l - r;
case SHL:
/* TODO: warn about out-of-bounds 'sr'. */
+ /* TODO: warn about overflow. */
return l << (r & 63);
case SHR:
/* TODO: warn about out-of-bounds 'sr'. */
@@ -851,8 +848,8 @@ fold_unsigned_integer(op_t op, uint64_t
return l | r;
default:
lint_assert(/*CONSTCOND*/false);
+ /* NOTREACHED */
}
- /* NOTREACHED */
}
static int64_t
@@ -863,7 +860,7 @@ fold_signed_integer(op_t op, int64_t l,
case COMPL:
return ~l;
case UPLUS:
- return l;
+ return +l;
case UMINUS:
*overflow = l == min_value;
return *overflow ? l : -l;
@@ -876,12 +873,7 @@ fold_signed_integer(op_t op, int64_t l,
*overflow = true;
return (int64_t)(al * ar);
}
- uint64_t mult_result = l * r;
- uint64_t hi = (uint64_t)max_value + 1;
- // FIXME: Overflow can also happen in other bits.
- if ((mult_result & hi) != ((l & hi) ^ (r & hi)))
- *overflow = true;
- return (int64_t)mult_result;
+ return l * r;
case DIV:
if (r == 0) {
/* division by 0 */
@@ -926,9 +918,10 @@ fold_signed_integer(op_t op, int64_t l,
return l - r;
case SHL:
/* TODO: warn about out-of-bounds 'sr'. */
- /* TODO: warn about overflow in signed '<<'. */
+ /* TODO: warn about overflow. */
return l << (r & 63);
case SHR:;
+ /* TODO: warn about out-of-bounds 'sr'. */
uint64_t shr_result = (uint64_t)l >> (r & 63);
if (shr_result & min_value)
shr_result |= min_value;
@@ -953,8 +946,8 @@ fold_signed_integer(op_t op, int64_t l,
return l | r;
default:
lint_assert(/*CONSTCOND*/false);
+ /* NOTREACHED */
}
- /* NOTREACHED */
}
/*