[PATCH 2/6] bitset: possibly widen unsigned indexes

Paul Eggert <[email protected]>
Newsgroups gmane.comp.lib.gnulib.bugs
Message-ID <[email protected]>
* lib/bitset/vector.c (vbitset_empty_p, vbitset_not)
(vbitset_disjoint_p, vbitset_and, vbitset_and_or)
(vbitset_and_or_cmp, vbitset_andn_or, vbitset_andn_or_cmp)
(vbitset_or_and, vbitset_or_and_cmp):
In a for-loop, use an index type related to the upper bound’s type
rather than trusting ‘unsigned’ to be wide enough.
---
 ChangeLog           |  8 ++++++++
 lib/bitset/vector.c | 20 ++++++++++----------
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a5282f0450..462d4953c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2026-06-26  Paul Eggert  <[email protected]>
 
+	bitset: possibly widen unsigned indexes
+	* lib/bitset/vector.c (vbitset_empty_p, vbitset_not)
+	(vbitset_disjoint_p, vbitset_and, vbitset_and_or)
+	(vbitset_and_or_cmp, vbitset_andn_or, vbitset_andn_or_cmp)
+	(vbitset_or_and, vbitset_or_and_cmp):
+	In a for-loop, use an index type related to the upper bound’s type
+	rather than trusting ‘unsigned’ to be wide enough.
+
 	bitrotate: prefer C2y to bitrotate or by-hand
 	Deprecate the bitrotate module; it is superseded by C2y’s
 	stdc_rotate_left and stdc_rotate_right.  In several places, prefer
diff --git a/lib/bitset/vector.c b/lib/bitset/vector.c
index 11c8a411a8..5140ab9b30 100644
--- a/lib/bitset/vector.c
+++ b/lib/bitset/vector.c
@@ -320,7 +320,7 @@ vbitset_empty_p (bitset dst)
 {
   bitset_word *dstp = VBITSET_WORDS (dst);
 
-  for (unsigned i = 0; i < VBITSET_SIZE (dst); i++)
+  for (bitset_windex i = 0; i < VBITSET_SIZE (dst); i++)
     if (dstp[i])
       return false;
   return true;
@@ -357,7 +357,7 @@ vbitset_not (bitset dst, bitset src)
   bitset_windex ssize = VBITSET_SIZE (src);
   bitset_windex dsize = VBITSET_SIZE (dst);
 
-  for (unsigned i = 0; i < ssize; i++)
+  for (bitset_windex i = 0; i < ssize; i++)
     *dstp++ = ~(*srcp++);
 
   vbitset_unused_clear (dst);
@@ -426,7 +426,7 @@ vbitset_disjoint_p (bitset dst, bitset src)
   bitset_windex ssize = VBITSET_SIZE (src);
   bitset_windex dsize = VBITSET_SIZE (dst);
 
-  for (unsigned i = 0; i < min (ssize, dsize); i++)
+  for (bitset_windex i = 0; i < min (ssize, dsize); i++)
     if (*srcp++ & *dstp++)
       return false;
 
@@ -446,7 +446,7 @@ vbitset_and (bitset dst, bitset src1, bitset src2)
   bitset_word *src1p = VBITSET_WORDS (src1);
   bitset_word *src2p = VBITSET_WORDS (src2);
 
-  for (unsigned i = 0; i < min (ssize1, ssize2); i++)
+  for (bitset_windex i = 0; i < min (ssize1, ssize2); i++)
     *dstp++ = *src1p++ & *src2p++;
 
   memset (dstp, 0, sizeof (bitset_word) * (dsize - min (ssize1, ssize2)));
@@ -765,7 +765,7 @@ vbitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
   bitset_word *dstp = VBITSET_WORDS (dst);
   bitset_windex size = VBITSET_SIZE (dst);
 
-  for (unsigned i = 0; i < size; i++)
+  for (bitset_windex i = 0; i < size; i++)
     *dstp++ = (*src1p++ & *src2p++) | *src3p++;
 }
 
@@ -786,7 +786,7 @@ vbitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
   bitset_windex size = VBITSET_SIZE (dst);
 
   bool changed = false;
-  for (unsigned i = 0; i < size; i++, dstp++)
+  for (bitset_windex i = 0; i < size; i++, dstp++)
     {
       bitset_word tmp = (*src1p++ & *src2p++) | *src3p++;
 
@@ -818,7 +818,7 @@ vbitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
   bitset_word *dstp = VBITSET_WORDS (dst);
   bitset_windex size = VBITSET_SIZE (dst);
 
-  for (unsigned i = 0; i < size; i++)
+  for (bitset_windex i = 0; i < size; i++)
     *dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++;
 }
 
@@ -839,7 +839,7 @@ vbitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
   bitset_windex size = VBITSET_SIZE (dst);
 
   bool changed = false;
-  for (unsigned i = 0; i < size; i++, dstp++)
+  for (bitset_windex i = 0; i < size; i++, dstp++)
     {
       bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++;
 
@@ -871,7 +871,7 @@ vbitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
   bitset_word *dstp = VBITSET_WORDS (dst);
   bitset_windex size = VBITSET_SIZE (dst);
 
-  for (unsigned i = 0; i < size; i++)
+  for (bitset_windex i = 0; i < size; i++)
     *dstp++ = (*src1p++ | *src2p++) & *src3p++;
 }
 
@@ -892,7 +892,7 @@ vbitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
   bitset_windex size = VBITSET_SIZE (dst);
 
   bool changed = false;
-  for (unsigned int i = 0; i < size; i++)
+  for (bitset_windex i = 0; i < size; i++)
     {
       bitset_word tmp = (*src1p++ | *src2p++) & *src3p++;
 
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.