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() { ...@@ -427,7 +427,7 @@ FOLLY_ALWAYS_INLINE hazptr_array<M>::~hazptr_array() {
if (LIKELY(ptc != nullptr)) { if (LIKELY(ptc != nullptr)) {
auto& tc = *ptc; auto& tc = *ptc;
auto count = tc.count(); 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) { for (size_t i = 0; i < M; ++i) {
tc[count + i].hprec_ = h[i].hazptr_; tc[count + i].hprec_ = h[i].hazptr_;
DEBUG_PRINT(i << " " << &h[i]); DEBUG_PRINT(i << " " << &h[i]);
...@@ -455,6 +455,8 @@ FOLLY_ALWAYS_INLINE hazptr_array<M>& hazptr_array<M>::operator=( ...@@ -455,6 +455,8 @@ FOLLY_ALWAYS_INLINE hazptr_array<M>& hazptr_array<M>::operator=(
h[i] = std::move(other[i]); h[i] = std::move(other[i]);
DEBUG_PRINT(i << " " << &h[i] << " " << &other[i]); DEBUG_PRINT(i << " " << &h[i] << " " << &other[i]);
} }
empty_ = other.empty_;
other.empty_ = true;
return *this; return *this;
} }
......
...@@ -360,7 +360,7 @@ TEST_F(HazptrTest, Array) { ...@@ -360,7 +360,7 @@ TEST_F(HazptrTest, Array) {
// Protect object // Protect object
hptr[9].reset(x); hptr[9].reset(x);
// Empty array // Empty array
hazptr_array<10> h; hazptr_array<10> h(nullptr);
// Move assignment // Move assignment
h = std::move(hptr); h = std::move(hptr);
// Retire object // 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