Merge bitcoin/bitcoin#27929: Added static_assert to check that base_blob is using whole bytes.

5fc4939e17509534eb36727b27ac0afb941e44f7 Added static_assert to check that base_blob is using whole bytes. (Brotcrunsher)

Pull request description:

  Prior to this commit it was possible to create base_blobs with any arbitrary amount of bits, like base_blob<9>. One could assume that this would be a valid way to create a bit field that guarantees to have at least 9 bits. However, in such a case, base_blob would not behave as expected because the WIDTH is rounded down to the closest whole byte (simple integer division by 8). This commit makes sure that this oddity is detected and blocked by the compiler.

ACKs for top commit:
  MarcoFalke:
    lgtm ACK 5fc4939e17509534eb36727b27ac0afb941e44f7
  theStack:
    ACK 5fc4939e17509534eb36727b27ac0afb941e44f7
  stickies-v:
    ACK 5fc4939e17509534eb36727b27ac0afb941e44f7

Tree-SHA512: 6a06760f09d4a9e6f0b9338d4dddd4091f2ac59a843a443d9302959936d72c55f7cccd55a51ec3a5a799921f68be1b87968ef3c9c11d3389cbd369b5045bb50a
This commit is contained in:
fanquake 2023-06-27 12:49:29 +01:00 committed by pasta
parent ece625c754
commit 79a20f96a5
No known key found for this signature in database
GPG Key ID: E2F3D7916E722D38

View File

@ -23,6 +23,7 @@ class base_blob
{ {
protected: protected:
static constexpr int WIDTH = BITS / 8; static constexpr int WIDTH = BITS / 8;
static_assert(BITS % 8 == 0, "base_blob currently only supports whole bytes.");
std::array<uint8_t, WIDTH> m_data; std::array<uint8_t, WIDTH> m_data;
static_assert(WIDTH == sizeof(m_data), "Sanity check"); static_assert(WIDTH == sizeof(m_data), "Sanity check");