Commit 36b8f9c6 authored by Maged Michael's avatar Maged Michael Committed by Facebook Github Bot

Fixes: prevent compiler reporting UB, hazptr_array move operator, empty array test

Summary:
Three fixes:
(1) The compiler reports UB in line 432 for the case M > HAZPTR_TC_SIZE even though it is executed only if M <= HAZPTR_TC_SIZE. Added a condition M <= HAZPTR_TC_SIZE to help the compiler determine that line 432 is not executed in that case.
(2) Added missing management of empty state in hazptr_array move operator
(3) Added nullptr argument to empty hazptr_array in Array test

Reviewed By: djwatson

Differential Revision: D5951283

fbshipit-source-id: cb8e61421ab06c7733f67bf2d2274d3311260ac4
parent 6f3b7616
......@@ -427,7 +427,7 @@ FOLLY_ALWAYS_INLINE hazptr_array<M>::~hazptr_array() {
if (LIKELY(ptc != nullptr)) {
auto& tc = *ptc;
auto count = tc.count();
if (count + M <= HAZPTR_TC_SIZE) {
if ((M <= HAZPTR_TC_SIZE) && (count + M <= HAZPTR_TC_SIZE)) {
for (size_t i = 0; i < M; ++i) {
tc[count + i].hprec_ = h[i].hazptr_;
DEBUG_PRINT(i << " " << &h[i]);
......@@ -455,6 +455,8 @@ FOLLY_ALWAYS_INLINE hazptr_array<M>& hazptr_array<M>::operator=(
h[i] = std::move(other[i]);
DEBUG_PRINT(i << " " << &h[i] << " " << &other[i]);
}
empty_ = other.empty_;
other.empty_ = true;
return *this;
}
......
......@@ -360,7 +360,7 @@ TEST_F(HazptrTest, Array) {
// Protect object
hptr[9].reset(x);
// Empty array
hazptr_array<10> h;
hazptr_array<10> h(nullptr);
// Move assignment
h = std::move(hptr);
// Retire object
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment