mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-10-11 12:03:04 +02:00
build: warn on potentially uninitialized reads
Enable -Wconditional-uninitialized to warn on potentially uninitialized reads. Fix the sole such warning in Bitcoin Core in GetRdRand(): r1 would be set to 0 on rdrand failure, so initializing it to 0 is a non-functional change. From "Intel 64 and IA-32 ArchitecturesSoftware Developer's Manual" [1], page 1711: "CF=1 indicates that the data in the destination is valid. Otherwise CF=0 and the data in the destination operand will be returned as zeros for the specified width." [1] https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf
This commit is contained in:
@@ -116,7 +116,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;
|
||||
@@ -128,7 +131,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;
|
||||
|
Reference in New Issue
Block a user