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.
This commit is contained in:
parent
46311e792f
commit
e5c616888b
2 changed files with 10 additions and 2 deletions
|
@ -15,6 +15,8 @@
|
||||||
template <unsigned int BITS>
|
template <unsigned int BITS>
|
||||||
base_uint<BITS>::base_uint(const std::string& str)
|
base_uint<BITS>::base_uint(const std::string& str)
|
||||||
{
|
{
|
||||||
|
static_assert(BITS/32 > 0 && BITS%32 == 0, "Template parameter BITS must be a positive multiple of 32.");
|
||||||
|
|
||||||
SetHex(str);
|
SetHex(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,12 +31,16 @@ public:
|
||||||
|
|
||||||
base_uint()
|
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++)
|
for (int i = 0; i < WIDTH; i++)
|
||||||
pn[i] = 0;
|
pn[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
base_uint(const base_uint& b)
|
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++)
|
for (int i = 0; i < WIDTH; i++)
|
||||||
pn[i] = b.pn[i];
|
pn[i] = b.pn[i];
|
||||||
}
|
}
|
||||||
|
@ -50,6 +54,8 @@ public:
|
||||||
|
|
||||||
base_uint(uint64_t b)
|
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[0] = (unsigned int)b;
|
||||||
pn[1] = (unsigned int)(b >> 32);
|
pn[1] = (unsigned int)(b >> 32);
|
||||||
for (int i = 2; i < WIDTH; i++)
|
for (int i = 2; i < WIDTH; i++)
|
||||||
|
@ -174,7 +180,7 @@ public:
|
||||||
{
|
{
|
||||||
// prefix operator
|
// prefix operator
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (++pn[i] == 0 && i < WIDTH-1)
|
while (i < WIDTH && ++pn[i] == 0)
|
||||||
i++;
|
i++;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -191,7 +197,7 @@ public:
|
||||||
{
|
{
|
||||||
// prefix operator
|
// prefix operator
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (--pn[i] == (uint32_t)-1 && i < WIDTH-1)
|
while (i < WIDTH && --pn[i] == (uint32_t)-1)
|
||||||
i++;
|
i++;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue