X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6aa452a643c65a8df244013e05d41854531ec762..32f0598d06d317a776da36103449127e7693983d:/lib/bitsetv.c diff --git a/lib/bitsetv.c b/lib/bitsetv.c index ab2ed1ea..ecec0610 100644 --- a/lib/bitsetv.c +++ b/lib/bitsetv.c @@ -30,25 +30,30 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA type TYPE. */ bitset * bitsetv_alloc (n_vecs, n_bits, type) - unsigned int n_vecs; - unsigned int n_bits; - enum bitset_type type; + bitset_bindex n_vecs; + bitset_bindex n_bits; + enum_bitset_type type; { - unsigned int vector_bytes; - unsigned int bytes; + size_t vector_bytes; + size_t bytes; bitset *bsetv; - unsigned int i; + bitset_bindex i; /* Determine number of bytes for each set. */ bytes = bitset_bytes (type, n_bits); + + /* If size calculation overflows, memory is exhausted. */ + if (BITSET_SIZE_MAX / (sizeof (bitset) + bytes) <= n_vecs) + xalloc_die (); /* Allocate vector table at head of bitset array. */ - vector_bytes = (n_vecs + 1) * sizeof (bitset); + vector_bytes = (n_vecs + 1) * sizeof (bitset) + bytes - 1; + vector_bytes -= vector_bytes % bytes; bsetv = (bitset *) xcalloc (1, vector_bytes + bytes * n_vecs); for (i = 0; i < n_vecs; i++) { - bsetv[i] = (bitset) ((char *) bsetv + vector_bytes + i * bytes); + bsetv[i] = (bitset) (void *) ((char *) bsetv + vector_bytes + i * bytes); bitset_init (bsetv[i], n_bits, type); } @@ -63,8 +68,8 @@ bitsetv_alloc (n_vecs, n_bits, type) attribute hints specified by ATTR. */ bitset * bitsetv_create (n_vecs, n_bits, attr) - unsigned int n_vecs; - unsigned int n_bits; + bitset_bindex n_vecs; + bitset_bindex n_bits; unsigned int attr; { enum bitset_type type; @@ -79,7 +84,7 @@ void bitsetv_free (bsetv) bitset *bsetv; { - unsigned int i; + bitset_bindex i; for (i = 0; bsetv[i]; i++) BITSET_FREE_ (bsetv[i]); @@ -90,9 +95,9 @@ bitsetv_free (bsetv) /* Zero a vector of bitsets. */ void bitsetv_zero (bsetv) - struct bitset_struct **bsetv; + bitsetv bsetv; { - unsigned int i; + bitset_bindex i; for (i = 0; bsetv[i]; i++) bitset_zero (bsetv[i]); @@ -104,7 +109,7 @@ void bitsetv_ones (bsetv) bitset *bsetv; { - unsigned int i; + bitset_bindex i; for (i = 0; bsetv[i]; i++) bitset_ones (bsetv[i]); @@ -117,8 +122,8 @@ void bitsetv_transitive_closure (bsetv) bitset *bsetv; { - unsigned int i; - unsigned int j; + bitset_bindex i; + bitset_bindex j; for (i = 0; bsetv[i]; i++) for (j = 0; bsetv[j]; j++) @@ -134,7 +139,7 @@ bitsetv_transitive_closure (bsetv) void bitsetv_reflexive_transitive_closure (bitsetv bsetv) { - int i; + bitset_bindex i; bitsetv_transitive_closure (bsetv); for (i = 0; bsetv[i]; i++) @@ -150,12 +155,12 @@ bitsetv_dump (file, title, subtitle, bsetv) const char *title, *subtitle; bitset *bsetv; { - unsigned int i; + bitset_windex i; fprintf (file, "%s\n", title); for (i = 0; bsetv[i]; i++) { - fprintf (file, "%s %d\n", subtitle, i); + fprintf (file, "%s %lu\n", subtitle, (unsigned long) i); bitset_dump (file, bsetv[i]); } @@ -167,11 +172,11 @@ void debug_bitsetv (bsetv) bitset *bsetv; { - unsigned int i; + bitset_windex i; for (i = 0; bsetv[i]; i++) { - fprintf (stderr, "%d: ", i); + fprintf (stderr, "%lu: ", (unsigned long) i); debug_bitset (bsetv[i]); }