Fix potential strict aliasing issues

This commit is contained in:
2024-08-14 15:01:34 -07:00
parent b7f9084694
commit 3499626127

View File

@@ -1762,8 +1762,8 @@ void eraseTree(Node *root, WriteContext *tls) {
} }
} }
void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls, void eraseBetween(Node **inTree, Node3 *n, int begin, int end,
ConflictSet::Impl *impl) { WriteContext *tls, ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin; const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin; const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1786,12 +1786,12 @@ void eraseBetween(Node3 *&n, int begin, int end, WriteContext *tls,
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} }
} }
void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls, void eraseBetween(Node **inTree, Node16 *n, int begin, int end,
ConflictSet::Impl *impl) { WriteContext *tls, ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin; const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin; const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1814,18 +1814,18 @@ void eraseBetween(Node16 *&n, int begin, int end, WriteContext *tls,
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} else if (n->numChildren <= Node3::kMaxNodes) { } else if (n->numChildren <= Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen); auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} }
} }
void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls, void eraseBetween(Node **inTree, Node48 *n, int begin, int end,
ConflictSet::Impl *impl) { WriteContext *tls, ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin; const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin; const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1858,24 +1858,24 @@ void eraseBetween(Node48 *&n, int begin, int end, WriteContext *tls,
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} else if (n->numChildren <= Node3::kMaxNodes) { } else if (n->numChildren <= Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen); auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} else if (n->numChildren <= Node16::kMaxNodes) { } else if (n->numChildren <= Node16::kMaxNodes) {
auto *newNode = tls->allocate<Node16>(n->partialKeyLen); auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} }
} }
void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls, void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
ConflictSet::Impl *impl) { WriteContext *tls, ConflictSet::Impl *impl) {
const unsigned shiftUpperBound = end - begin; const unsigned shiftUpperBound = end - begin;
const unsigned shiftAmount = begin; const unsigned shiftAmount = begin;
auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; };
@@ -1896,25 +1896,25 @@ void eraseBetween(Node256 *&n, int begin, int end, WriteContext *tls,
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} else if (n->numChildren <= Node3::kMaxNodes) { } else if (n->numChildren <= Node3::kMaxNodes) {
auto *newNode = tls->allocate<Node3>(n->partialKeyLen); auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} else if (n->numChildren <= Node16::kMaxNodes) { } else if (n->numChildren <= Node16::kMaxNodes) {
auto *newNode = tls->allocate<Node16>(n->partialKeyLen); auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} else if (n->numChildren <= Node48::kMaxNodes) { } else if (n->numChildren <= Node48::kMaxNodes) {
auto *newNode = tls->allocate<Node48>(n->partialKeyLen); auto *newNode = tls->allocate<Node48>(n->partialKeyLen);
newNode->copyChildrenAndKeyFrom(*n); newNode->copyChildrenAndKeyFrom(*n);
getInTree(n, impl) = newNode; getInTree(n, impl) = newNode;
tls->release(n); tls->release(n);
(Node *&)n = newNode; *inTree = newNode;
} }
} }
@@ -1930,16 +1930,16 @@ void eraseBetween(Node *&n, int begin, int end, WriteContext *tls,
case Type_Node0: case Type_Node0:
break; break;
case Type_Node3: case Type_Node3:
eraseBetween((Node3 *&)n, begin, end, tls, impl); eraseBetween(&n, (Node3 *)n, begin, end, tls, impl);
break; break;
case Type_Node16: case Type_Node16:
eraseBetween((Node16 *&)n, begin, end, tls, impl); eraseBetween(&n, (Node16 *)n, begin, end, tls, impl);
break; break;
case Type_Node48: case Type_Node48:
eraseBetween((Node48 *&)n, begin, end, tls, impl); eraseBetween(&n, (Node48 *)n, begin, end, tls, impl);
break; break;
case Type_Node256: case Type_Node256:
eraseBetween((Node256 *&)n, begin, end, tls, impl); eraseBetween(&n, (Node256 *)n, begin, end, tls, impl);
break; break;
default: // GCOVR_EXCL_LINE default: // GCOVR_EXCL_LINE
__builtin_unreachable(); // GCOVR_EXCL_LINE __builtin_unreachable(); // GCOVR_EXCL_LINE