[libcxx-commits] [PATCH] D96946: [libcxx][RFC] Unspecified behavior randomization in libcxx

Louis Dionne via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Nov 15 13:43:24 PST 2021


ldionne added inline comments.


================
Comment at: libcxx/include/algorithm:3113
+
+template <class _Dummy>
+class _LIBCPP_TYPE_VIS __random_unspecified_behavior_gen_
----------------
Quuxplusone wrote:
> danlark wrote:
> > ldionne wrote:
> > > Why are we making this a template?
> > Because there is no algorithm.cpp and I decided not to create one because of such feature. It is needed to instantiate `static const void* const __seed_static;` and inline variables are only a C++17 feature, before that it was a common trick to put the static variable definition in header
> > 
> > See
> > 
> > ```
> > template <class _Void>
> > const void* const __random_unspecified_behavior_gen_<_Void>::__seed_static =
> >     &__seed_static;
> > ```
> Seems like it would be way simpler to just do the //other// C++ singleton trick, which is "make the thing a function-local static variable":
> ```
>     _LIBCPP_ALWAYS_INLINE static result_type __seed() {
> #ifdef _LIBCPP_RANDOMIZE_UNSPECIFIED_STABILITY_SEED
>       return _LIBCPP_RANDOMIZE_UNSPECIFIED_STABILITY_SEED;
> #else
>       static char __x;
>       return reinterpret_cast<uintptr_t>(&__x);
> #endif
>     }
> ```
> I see no reason for any of the helper machinery here; it looks like we're just trying to generate a "random seed" from an address, so let's just do that. No global variables, no templates (not even any unnecessary casts!), nice and simple.
Yeah, agreed, IMO that seems cleaner.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96946/new/

https://reviews.llvm.org/D96946



More information about the libcxx-commits mailing list