[llvm-bugs] [Bug 51520] New: std::uniform_int_distribution<__int128_t>{INT64_MIN, INT64_MAX} produces out-of-range values
via llvm-bugs
llvm-bugs at lists.llvm.org
Wed Aug 18 03:55:49 PDT 2021
https://bugs.llvm.org/show_bug.cgi?id=51520
Bug ID: 51520
Summary: std::uniform_int_distribution<__int128_t>{INT64_MIN,
INT64_MAX} produces out-of-range values
Product: libc++
Version: 12.0
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: All Bugs
Assignee: unassignedclangbugs at nondot.org
Reporter: moritz.klammler at cetitec.com
CC: llvm-bugs at lists.llvm.org, mclow.lists at gmail.com
The specific std::uniform_int_distribution<__int128_t>{INT64_MIN, INT64_MAX}
produces values that are not in range. Changing any of the parameters -- e.g.
using std::int64_t as type or making either of the limits smaller or larger --
causes the problem to go away. The incorrect values are completely
out-of-range, not marginal off-by-one errors.
I have created the following test program and could reproduce the issue with
every version of libc++ and set of compiler options I've tried; the problem
never occurs with -stdlib=libstdc++ so it seems to me to be a library rather
than a compiler issue.
https://godbolt.org/z/z5WYsKEv6
This is a minimal version (with no output) of the demo linked above to
reproduce the problem:
#include <cstdint>
#include <cstdlib>
#include <random>
int main()
{
auto engine = std::default_random_engine{};
auto distro = std::uniform_int_distribution<__int128_t>{INT64_MIN,
INT64_MAX};
for (auto i = 0; i < 1000; ++i) {
const auto n = distro(engine);
if ((n < distro.min()) || (n > distro.max())) {
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20210818/e021ff8d/attachment.html>
More information about the llvm-bugs
mailing list