From 3b439789c67d9c7519a215f001f6b087a6da888a Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Wed, 13 Dec 2017 13:32:00 +0100 Subject: [PATCH] Merge #11558: Minimal code changes to allow msvc compilation fbf327b Minimal code changes to allow msvc compilation. (Aaron Clauson) Pull request description: These changes are required to allow the Bitcoin source to build with Microsoft's C++ compiler (#11562 is also required). I looked around for a better place for the typedef of ssize_t which is in random.h. The best candidate looks like src/compat.h but I figured including that header in random.h is a bigger change than the typedef. Note that the same typedef is in at least two other places including the OpenSSL and Berkeley DB headers so some of the Bitcoin code already picks it up. Tree-SHA512: aa6cc6283015e08ab074641f9abdc116c4dc58574dc90f75e7a5af4cc82946d3052370e5cbe855fb6180c00f8dc66997d3724ff0412e4b7417e51b6602154825 --- src/bench/base58.cpp | 2 +- src/bench/checkqueue.cpp | 2 +- src/chainparams.cpp | 6 +++--- src/compat.h | 10 ++++++++++ src/net_processing.cpp | 2 +- src/random.h | 2 +- src/support/cleanse.cpp | 6 +++++- src/test/checkqueue_tests.cpp | 2 +- 8 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/bench/base58.cpp b/src/bench/base58.cpp index 8f6d07ac166d44..2d9a9f29087e71 100644 --- a/src/bench/base58.cpp +++ b/src/bench/base58.cpp @@ -22,7 +22,7 @@ static void Base58Encode(benchmark::State& state) } }; while (state.KeepRunning()) { - EncodeBase58(buff.begin(), buff.end()); + EncodeBase58(buff.data(), buff.data() + buff.size()); } } diff --git a/src/bench/checkqueue.cpp b/src/bench/checkqueue.cpp index 7e63e820db1e7b..35750aa1b69f2e 100644 --- a/src/bench/checkqueue.cpp +++ b/src/bench/checkqueue.cpp @@ -19,7 +19,7 @@ static const int MIN_CORES = 2; static const size_t BATCHES = 101; static const size_t BATCH_SIZE = 30; static const int PREVECTOR_SIZE = 28; -static const int QUEUE_BATCH_SIZE = 128; +static const unsigned int QUEUE_BATCH_SIZE = 128; static void CCheckQueueSpeed(benchmark::State& state) { struct FakeJobNoWork { diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 18c82fb6c2e741..ed08342dc00ee8 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -377,7 +377,7 @@ class CMainParams : public CChainParams { nMinSporkKeys = 1; fBIP9CheckMasternodesUpgraded = true; - checkpointData = (CCheckpointData) { + checkpointData = { { {1500, uint256S("0x000000aaf0300f59f49bc3e970bad15c11f961fe2347accffff19d96ec9778e3")}, {4991, uint256S("0x000000003b01809551952460744d5dbb8fcbd6cbae3c220267bf7fa43f837367")}, @@ -553,7 +553,7 @@ class CTestNetParams : public CChainParams { nMinSporkKeys = 1; fBIP9CheckMasternodesUpgraded = true; - checkpointData = (CCheckpointData) { + checkpointData = { { {261, uint256S("0x00000c26026d0815a7e2ce4fa270775f61403c040647ff2c3091f99e894a4618")}, {1999, uint256S("0x00000052e538d27fa53693efe6fb6892a0c1d26c0235f599171c48a3cce553b1")}, @@ -820,7 +820,7 @@ class CRegTestParams : public CChainParams { // regtest usually has no masternodes in most tests, so don't check for upgraged MNs fBIP9CheckMasternodesUpgraded = false; - checkpointData = (CCheckpointData) { + checkpointData = { { {0, uint256S("0x000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e")}, } diff --git a/src/compat.h b/src/compat.h index 65b7f81b66b5b9..165f3a96e0aa17 100644 --- a/src/compat.h +++ b/src/compat.h @@ -41,6 +41,7 @@ #include #include #include +#include #else #include #include @@ -81,6 +82,15 @@ typedef unsigned int SOCKET; #else #define MAX_PATH 1024 #endif +#ifdef _MSC_VER +#if !defined(ssize_t) +#ifdef _WIN64 +typedef int64_t ssize_t; +#else +typedef int32_t ssize_t; +#endif +#endif +#endif #if HAVE_DECL_STRNLEN == 0 size_t strnlen( const char *start, size_t max_len); diff --git a/src/net_processing.cpp b/src/net_processing.cpp index ffd922e83a1669..599255f0ab4782 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -64,7 +64,7 @@ std::atomic nTimeBestReceived(0); // Used only to inform the wallet of struct IteratorComparator { template - bool operator()(const I& a, const I& b) + bool operator()(const I& a, const I& b) const { return &(*a) < &(*b); } diff --git a/src/random.h b/src/random.h index e1e0be82a0729b..ff009047a1c4d5 100644 --- a/src/random.h +++ b/src/random.h @@ -138,7 +138,7 @@ class FastRandomContext { * sure that the underlying OS APIs for all platforms support the number. * (many cap out at 256 bytes). */ -static const ssize_t NUM_OS_RANDOM_BYTES = 32; +static const int NUM_OS_RANDOM_BYTES = 32; /** Get 32 bytes of system entropy. Do not use this in application code: use * GetStrongRandBytes instead. diff --git a/src/support/cleanse.cpp b/src/support/cleanse.cpp index 82cdfe707bb2a3..8d3c7369b49504 100644 --- a/src/support/cleanse.cpp +++ b/src/support/cleanse.cpp @@ -7,6 +7,10 @@ #include +#if defined(_MSC_VER) +#include // For SecureZeroMemory. +#endif + /* Compilers have a bad habit of removing "superfluous" memset calls that * are trying to zero memory. For example, when memset()ing a buffer and * then free()ing it, the compiler might decide that the memset is @@ -32,7 +36,7 @@ void memory_cleanse(void *ptr, size_t len) might try to eliminate "superfluous" memsets. If there's an easy way to detect memset_s, it would be better to use that. */ #if defined(_MSC_VER) - __asm; + SecureZeroMemory(ptr, len); #else __asm__ __volatile__("" : : "r"(ptr) : "memory"); #endif diff --git a/src/test/checkqueue_tests.cpp b/src/test/checkqueue_tests.cpp index 4099ba5024049d..bee5675288501c 100644 --- a/src/test/checkqueue_tests.cpp +++ b/src/test/checkqueue_tests.cpp @@ -24,7 +24,7 @@ // otherwise. BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, TestingSetup) -static const int QUEUE_BATCH_SIZE = 128; +static const unsigned int QUEUE_BATCH_SIZE = 128; struct FakeCheck { bool operator()()