aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Timber <mieabby@gmail.com>2021-08-17 13:28:38 +1000
committerDavid Timber <mieabby@gmail.com>2021-08-17 13:28:38 +1000
commit7ce01d9113856f94f90f3f6f144f351a69e333c5 (patch)
tree6b3e9dfcd5de109715b147c3c6bfc085bb30a78d /src
parentaf9f23da9f3ce89353cf06878bf8ab49b405e331 (diff)
Bitfield: assume bits out of range are unset
Diffstat (limited to 'src')
-rw-r--r--src/bitfield.c12
-rw-r--r--src/bitfield.h5
-rw-r--r--src/proone-test_bitfield.c64
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));