diff options
author | Abseil Team <absl-team@google.com> | 2022-01-04 07:59:44 -0800 |
---|---|---|
committer | Andy Getz <durandal@google.com> | 2022-01-04 12:38:14 -0500 |
commit | c498947f8cf6dd4eb7bf4d589ca0f3816fd77d36 (patch) | |
tree | bf07c0c5fea56795732d90adc456cbb43a3e5a1f /absl/random | |
parent | 04610889a913d29037205ca72e9d7fd7acc925fe (diff) |
Export of internal Abseil changes
--
620668e56950d7cfc39db2cd321adf265199ad77 by Abseil Team <absl-team@google.com>:
absl::random compiles (at least for some cases) with -Wconversion -Wsign-compare
PiperOrigin-RevId: 419595521
--
746651e5fbcab6080d25c4eef8617fc289a448f6 by Abseil Team <absl-team@google.com>:
Annotate FlagImpl storage buffer
Flag type can contain legit uninitialized bits, e.g. padding.
When the code calls bit_cast as int64_t, it will contain those bits as well.
Then when we pass the int into the store it's UB for C++ and will be
reported by the new msan.
PiperOrigin-RevId: 418666492
GitOrigin-RevId: 620668e56950d7cfc39db2cd321adf265199ad77
Change-Id: Idd1190f5c98a0a13c4019f3d92cec0313822084c
Diffstat (limited to 'absl/random')
-rw-r--r-- | absl/random/bernoulli_distribution.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/absl/random/bernoulli_distribution.h b/absl/random/bernoulli_distribution.h index 25bd0d5c..d81b6ae6 100644 --- a/absl/random/bernoulli_distribution.h +++ b/absl/random/bernoulli_distribution.h @@ -138,16 +138,16 @@ bool bernoulli_distribution::Generate(double p, // 64 bits. // // Second, `c` is constructed by first casting explicitly to a signed - // integer and then converting implicitly to an unsigned integer of the same + // integer and then casting explicitly to an unsigned integer of the same // size. This is done because the hardware conversion instructions produce // signed integers from double; if taken as a uint64_t the conversion would // be wrong for doubles greater than 2^63 (not relevant in this use-case). // If converted directly to an unsigned integer, the compiler would end up // emitting code to handle such large values that are not relevant due to // the known bounds on `c`. To avoid these extra instructions this - // implementation converts first to the signed type and then use the - // implicit conversion to unsigned (which is a no-op). - const uint64_t c = static_cast<int64_t>(p * kP32); + // implementation converts first to the signed type and then convert to + // unsigned (which is a no-op). + const uint64_t c = static_cast<uint64_t>(static_cast<int64_t>(p * kP32)); const uint32_t v = fast_u32(g); // FAST PATH: this path fails with probability 1/2^32. Note that simply // returning v <= c would approximate P very well (up to an absolute error |