aboutsummaryrefslogtreecommitdiff
path: root/src/random.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/random.cpp')
-rw-r--r--src/random.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/random.cpp b/src/random.cpp
index 27d8367de4..9c9a35709a 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -114,7 +114,10 @@ static uint64_t GetRdRand() noexcept
// RdRand may very rarely fail. Invoke it up to 10 times in a loop to reduce this risk.
#ifdef __i386__
uint8_t ok;
- uint32_t r1, r2;
+ // Initialize to 0 to silence a compiler warning that r1 or r2 may be used
+ // uninitialized. Even if rdrand fails (!ok) it will set the output to 0,
+ // but there is no way that the compiler could know that.
+ uint32_t r1 = 0, r2 = 0;
for (int i = 0; i < 10; ++i) {
__asm__ volatile (".byte 0x0f, 0xc7, 0xf0; setc %1" : "=a"(r1), "=q"(ok) :: "cc"); // rdrand %eax
if (ok) break;
@@ -126,7 +129,7 @@ static uint64_t GetRdRand() noexcept
return (((uint64_t)r2) << 32) | r1;
#elif defined(__x86_64__) || defined(__amd64__)
uint8_t ok;
- uint64_t r1;
+ uint64_t r1 = 0; // See above why we initialize to 0.
for (int i = 0; i < 10; ++i) {
__asm__ volatile (".byte 0x48, 0x0f, 0xc7, 0xf0; setc %1" : "=a"(r1), "=q"(ok) :: "cc"); // rdrand %rax
if (ok) break;