Module Name:    src
Committed By:   rillig
Date:           Tue Mar 11 22:12:35 UTC 2025

Modified Files:
        src/usr.bin/xlint/lint1: tree.c

Log Message:
lint: fix saturated multiplication in integer constraints check

After the change from ui_max_value to si_max_value in tree.c 1.675 from
2025-02-27, it was wrong to divide the maximum value by 2 once more.


To generate a diff of this commit:
cvs rdiff -u -r1.675 -r1.676 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.675 src/usr.bin/xlint/lint1/tree.c:1.676
--- src/usr.bin/xlint/lint1/tree.c:1.675	Thu Feb 27 23:46:30 2025
+++ src/usr.bin/xlint/lint1/tree.c	Tue Mar 11 22:12:35 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.675 2025/02/27 23:46:30 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.676 2025/03/11 22:12:35 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.675 2025/02/27 23:46:30 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.676 2025/03/11 22:12:35 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -152,14 +152,14 @@ si_mult_sat(const type_t *tp, int64_t l,
 	uint64_t al = s64_abs(l);
 	uint64_t ar = s64_abs(r);
 	bool neg = (l >= 0) != (r >= 0);
-	uint64_t max = (uint64_t)si_max_value(tp);
-	uint64_t max_prod = max + (neg ? 1 : 0);
+	int64_t max = si_max_value(tp);
+	uint64_t max_prod = (uint64_t)max + (neg ? 1 : 0);
 	if (al == 0 || ar <= max_prod / al)
 		return l * r;
 	else if (neg)
-		return -1 - (int64_t)(max >> 1);
+		return -1 - max;
 	else
-		return (int64_t)(max >> 1);
+		return max;
 }
 
 static int64_t

Reply via email to