Fixes: prevent compiler reporting UB, hazptr_array move operator, empty array test
authorMaged Michael <magedmichael@fb.com>
Tue, 3 Oct 2017 14:56:57 +0000 (07:56 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Tue, 3 Oct 2017 15:09:32 +0000 (08:09 -0700)
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

folly/experimental/hazptr/hazptr-impl.h
folly/experimental/hazptr/test/HazptrTest.cpp

index 043d04a..5250a5d 100644 (file)
@@ -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;
 }
 
index 8468ad5..75d4669 100644 (file)
@@ -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