diff options
author | David Timber <mieabby@gmail.com> | 2021-08-17 13:28:38 +1000 |
---|---|---|
committer | David Timber <mieabby@gmail.com> | 2021-08-17 13:28:38 +1000 |
commit | 7ce01d9113856f94f90f3f6f144f351a69e333c5 (patch) | |
tree | 6b3e9dfcd5de109715b147c3c6bfc085bb30a78d /src | |
parent | af9f23da9f3ce89353cf06878bf8ab49b405e331 (diff) |
Bitfield: assume bits out of range are unset
Diffstat (limited to 'src')
-rw-r--r-- | src/bitfield.c | 12 | ||||
-rw-r--r-- | src/bitfield.h | 5 | ||||
-rw-r--r-- | src/proone-test_bitfield.c | 64 |
3 files changed, 46 insertions, 35 deletions
diff --git a/src/bitfield.c b/src/bitfield.c index cec0304..9a42926 100644 --- a/src/bitfield.c +++ b/src/bitfield.c @@ -13,11 +13,19 @@ void prne_bf_set (uint8_t *bf, const unsigned int bit, const bool v) { } } -bool prne_bf_test (const uint8_t *bf, const unsigned int bit) { +bool prne_bf_test ( + const uint8_t *bf, + const size_t size, + const unsigned int bit) +{ const unsigned int p = bit / 8; const unsigned int s = bit - p * 8; - return bf[p] & (1 << s); + if (size <= p) { + return false; + } + + return (bf[p] & (1 << s)) != 0; } void prne_bf_foreach ( diff --git a/src/bitfield.h b/src/bitfield.h index 034e439..468f4a6 100644 --- a/src/bitfield.h +++ b/src/bitfield.h @@ -16,7 +16,10 @@ typedef void(*prne_bf_foreach_ft)( void prne_bf_set (uint8_t *bf, const unsigned int bit, const bool v); -bool prne_bf_test (const uint8_t *bf, const unsigned int bit); +bool prne_bf_test ( + const uint8_t *bf, + const size_t size, + const unsigned int bit); void prne_bf_foreach ( void *ctx, const uint8_t *bf, diff --git a/src/proone-test_bitfield.c b/src/proone-test_bitfield.c index 97ae537..8dd56b4 100644 --- a/src/proone-test_bitfield.c +++ b/src/proone-test_bitfield.c @@ -55,22 +55,22 @@ int main (void) { prne_bf_set(bf, 11, true); prne_bf_set(bf, 13, true); prne_bf_set(bf, 15, true); - assert(prne_bf_test(bf, 0) == false); - assert(prne_bf_test(bf, 1) == true); - assert(prne_bf_test(bf, 2) == false); - assert(prne_bf_test(bf, 3) == true); - assert(prne_bf_test(bf, 4) == false); - assert(prne_bf_test(bf, 5) == true); - assert(prne_bf_test(bf, 6) == false); - assert(prne_bf_test(bf, 7) == true); - assert(prne_bf_test(bf, 8) == false); - assert(prne_bf_test(bf, 9) == true); - assert(prne_bf_test(bf, 10) == false); - assert(prne_bf_test(bf, 11) == true); - assert(prne_bf_test(bf, 12) == false); - assert(prne_bf_test(bf, 13) == true); - assert(prne_bf_test(bf, 14) == false); - assert(prne_bf_test(bf, 15) == true); + assert(prne_bf_test(bf, sizeof(bf), 0) == false); + assert(prne_bf_test(bf, sizeof(bf), 1) == true); + assert(prne_bf_test(bf, sizeof(bf), 2) == false); + assert(prne_bf_test(bf, sizeof(bf), 3) == true); + assert(prne_bf_test(bf, sizeof(bf), 4) == false); + assert(prne_bf_test(bf, sizeof(bf), 5) == true); + assert(prne_bf_test(bf, sizeof(bf), 6) == false); + assert(prne_bf_test(bf, sizeof(bf), 7) == true); + assert(prne_bf_test(bf, sizeof(bf), 8) == false); + assert(prne_bf_test(bf, sizeof(bf), 9) == true); + assert(prne_bf_test(bf, sizeof(bf), 10) == false); + assert(prne_bf_test(bf, sizeof(bf), 11) == true); + assert(prne_bf_test(bf, sizeof(bf), 12) == false); + assert(prne_bf_test(bf, sizeof(bf), 13) == true); + assert(prne_bf_test(bf, sizeof(bf), 14) == false); + assert(prne_bf_test(bf, sizeof(bf), 15) == true); assert(bf[0] == 0xAA && bf[1] == 0xAA); prne_bf_set(bf, 1, false); prne_bf_set(bf, 3, false); @@ -80,22 +80,22 @@ int main (void) { prne_bf_set(bf, 11, false); prne_bf_set(bf, 13, false); prne_bf_set(bf, 15, false); - assert(prne_bf_test(bf, 0) == false); - assert(prne_bf_test(bf, 1) == false); - assert(prne_bf_test(bf, 2) == false); - assert(prne_bf_test(bf, 3) == false); - assert(prne_bf_test(bf, 4) == false); - assert(prne_bf_test(bf, 5) == false); - assert(prne_bf_test(bf, 6) == false); - assert(prne_bf_test(bf, 7) == false); - assert(prne_bf_test(bf, 8) == false); - assert(prne_bf_test(bf, 9) == false); - assert(prne_bf_test(bf, 10) == false); - assert(prne_bf_test(bf, 11) == false); - assert(prne_bf_test(bf, 12) == false); - assert(prne_bf_test(bf, 13) == false); - assert(prne_bf_test(bf, 14) == false); - assert(prne_bf_test(bf, 15) == false); + assert(prne_bf_test(bf, sizeof(bf), 0) == false); + assert(prne_bf_test(bf, sizeof(bf), 1) == false); + assert(prne_bf_test(bf, sizeof(bf), 2) == false); + assert(prne_bf_test(bf, sizeof(bf), 3) == false); + assert(prne_bf_test(bf, sizeof(bf), 4) == false); + assert(prne_bf_test(bf, sizeof(bf), 5) == false); + assert(prne_bf_test(bf, sizeof(bf), 6) == false); + assert(prne_bf_test(bf, sizeof(bf), 7) == false); + assert(prne_bf_test(bf, sizeof(bf), 8) == false); + assert(prne_bf_test(bf, sizeof(bf), 9) == false); + assert(prne_bf_test(bf, sizeof(bf), 10) == false); + assert(prne_bf_test(bf, sizeof(bf), 11) == false); + assert(prne_bf_test(bf, sizeof(bf), 12) == false); + assert(prne_bf_test(bf, sizeof(bf), 13) == false); + assert(prne_bf_test(bf, sizeof(bf), 14) == false); + assert(prne_bf_test(bf, sizeof(bf), 15) == false); assert(bf[0] == 0x00 && bf[1] == 0x00); prne_memzero(bf, sizeof(bf)); |