aboutsummaryrefslogtreecommitdiff
path: root/src/arith_uint256.h
diff options
context:
space:
mode:
authorPavlos Antoniou <[email protected]>2017-06-07 17:21:29 +0000
committerPavlos Antoniou <[email protected]>2017-06-07 17:21:29 +0000
commite5c616888b50ba1c35dd99e5500ef2c4dff5b4f9 (patch)
tree41c26f5d7a875bf9cd072dff559b384ea8df0774 /src/arith_uint256.h
parentMerge #9672: Opt-into-RBF for RPC & bitcoin-tx (diff)
downloaddiscoin-e5c616888b50ba1c35dd99e5500ef2c4dff5b4f9.tar.xz
discoin-e5c616888b50ba1c35dd99e5500ef2c4dff5b4f9.zip
Fix instantiation and array accesses in class base_uint<BITS>
The implementation of base_uint::operator++(int) and base_uint::operator--(int) is now safer. Array pn is accessed via index i after bounds checking has been performed on the index, rather than before. The logic of the while loops has also been made more clear. A compile time assertion has been added in the class constructors to ensure that BITS is a positive multiple of 32.
Diffstat (limited to 'src/arith_uint256.h')
-rw-r--r--src/arith_uint256.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/arith_uint256.h b/src/arith_uint256.h
index 0f6b3d4fb..c7734035d 100644
--- a/src/arith_uint256.h
+++ b/src/arith_uint256.h
@@ -31,12 +31,16 @@ public:
base_uint()
{
+ static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32.");
+
for (int i = 0; i < WIDTH; i++)
pn[i] = 0;
}
base_uint(const base_uint& b)
{
+ static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32.");
+
for (int i = 0; i < WIDTH; i++)
pn[i] = b.pn[i];
}
@@ -50,6 +54,8 @@ public:
base_uint(uint64_t b)
{
+ static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32.");
+
pn[0] = (unsigned int)b;
pn[1] = (unsigned int)(b >> 32);
for (int i = 2; i < WIDTH; i++)
@@ -174,7 +180,7 @@ public:
{
// prefix operator
int i = 0;
- while (++pn[i] == 0 && i < WIDTH-1)
+ while (i < WIDTH && ++pn[i] == 0)
i++;
return *this;
}
@@ -191,7 +197,7 @@ public:
{
// prefix operator
int i = 0;
- while (--pn[i] == (uint32_t)-1 && i < WIDTH-1)
+ while (i < WIDTH && --pn[i] == (uint32_t)-1)
i++;
return *this;
}