==================================
Unspecified Behavior Randomization
==================================

Background
==========

Consider the follow snippet which steadily happens in tests:


.. code-block:: cpp

    std::vector<std::pair<int, int>> v(SomeData());
    std::sort(v.begin(), v.end(), [](const auto& lhs, const auto& rhs) {
       return lhs.first < rhs.first;
    });

Under this assumption all elements in the vector whose first elements are equal
do not guarantee any order. Unfortunately, this prevents libcxx introducing
other implementatiosn because tests might silently fail and the users might
heavily depend on the stability of implementations.

Goal
===================

Provide functionality for randomizing the unspecified behavior so that the users
can test and migrate their components and libcxx can introduce new sorting
algorithms and optimizations to the containers.

For example, as of LLVM version 13, libcxx sorting algorithm takes
`O(n^2) worst case <https://llvm.org/PR20837>`_ but according
to the standard its worst case should be `O(n log n)`. This effort helps users
to gradually fix their tests while updating to new faster algorithms.

Design
======

* Introduce new macro ``_LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY`` which should
  be a part of the libcxx config.
* This macro randomizes the unspecified behavior of algorithms and containers.
  For example, for sorting algorithm the input range is shuffled and then
  sorted.
* This macro is off by default because users should enable it only for testing
  purposes and/or migrations if they happen to libcxx.
* This feature is only available for C++11 and further because of
  ``std::shuffle`` availability.
* We may use `ASLR <https://en.wikipedia.org/wiki/Address_space_layout_randomization>`_ or
  static ``std::random_device`` for seeding the random number generator. This
  guarantees the same stability guarantee within a run but not through different
  runs, for example, for tests become flaky and eventually be seen as broken.
  For platforms which do not support ASLR, the seed is fixed during build.
* The users can fix the seed of the random number generator by providing
  ``_LIBCPP_RANDOMIZE_UNSPECIFIED_STABILITY_SEED=seed`` definition.

This comes with some side effects if any of the flags is on:

* Computation penalty, we think users are OK with that if they use this feature.
* Non reproducible results if they don't use the fixed seed.


Impact
------------------

Google has measured couple of thousands of tests to be dependent on the
stability of sorting and selection algorithms. As we also plan on updating
(or least, providing under flag more) sorting algorithms, this effort helps
doing it gradually and sustainably. This is also bad for users to depend on the
unspecified behavior in their tests, this effort helps to turn this flag in
debug mode.

Potential breakages
-------------------

None if the flag is off. If the flag is on, it may lead to some non-reproducible
results, for example, for caching.

Currently supported randomization
---------------------------------

* ``std::sort``, there is no guarantee on the order of equal elements
* ``std::partial_sort``, there is no guarantee on the order of equal elements and
   on the order of the remaining part
* ``std::nth_element``, there is no guarantee on the order from both sides of the
   partition

Patches welcome.
