[libcxx] r346779 - Fix UB in string.bench.cpp.

Eric Fiselier eric at efcs.ca
Tue Nov 13 11:16:19 PST 2018


Author: ericwf
Date: Tue Nov 13 11:16:19 2018
New Revision: 346779

URL: http://llvm.org/viewvc/llvm-project?rev=346779&view=rev
Log:
Fix UB in string.bench.cpp.

The usage of aligned_storage failed to pass the alignment it wanted,
which caused it to have a larger size and alignment that the
std::string's it was intended to store.

This patch manually specifies the alignment, as well as cleaning up
type alias bugs.

Modified:
    libcxx/trunk/benchmarks/string.bench.cpp

Modified: libcxx/trunk/benchmarks/string.bench.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/benchmarks/string.bench.cpp?rev=346779&r1=346778&r2=346779&view=diff
==============================================================================
--- libcxx/trunk/benchmarks/string.bench.cpp (original)
+++ libcxx/trunk/benchmarks/string.bench.cpp Tue Nov 13 11:16:19 2018
@@ -195,21 +195,21 @@ template <class Length>
 struct StringMove {
   static void run(benchmark::State& state) {
     // Keep two object locations and move construct back and forth.
-    std::aligned_storage<sizeof(std::string)>::type Storage[2];
+    std::aligned_storage<sizeof(std::string), alignof(std::string)>::type Storage[2];
     using S = std::string;
-    S* Data = reinterpret_cast<S*>(Storage);
     size_t I = 0;
-    new (static_cast<void*>(Data)) std::string(makeString(Length()));
+    S *newS = new (static_cast<void*>(Storage)) std::string(makeString(Length()));
     for (auto _ : state) {
       // Switch locations.
       I ^= 1;
       benchmark::DoNotOptimize(Storage);
       // Move construct into the new location,
-      new (static_cast<void*>(Storage + I)) S(std::move(Data[I ^ 1]));
+      S *tmpS = new (static_cast<void*>(Storage + I)) S(std::move(*newS));
       // then destroy the old one.
-      Data[I ^ 1].~S();
+      newS->~S();
+      newS = tmpS;
     }
-    Data[I].~S();
+    newS->~S();
   }
 
   static std::string name() { return "BM_StringMove" + Length::name(); }




More information about the libcxx-commits mailing list