Merge #10760: Avoid dereference-of-casted-pointer

0aadc11fd Avoid dereference-of-casted-pointer (Pieter Wuille)

Pull request description:

  And prefer a static_cast to the intended reference type.

Tree-SHA512: e83b20023a4dca6029b46f7040a8a6fd54e1b42112ec0c87c3c3b567ed641de97a9e2335b57a2efb075491f641e5b977bc226a474276bea0c3c3c71d8d6ac54d
This commit is contained in:
Pieter Wuille 2017-07-15 12:06:13 -07:00
commit 10b22e3141
No known key found for this signature in database
GPG Key ID: A636E97631F767E0
8 changed files with 26 additions and 18 deletions

View File

@ -10,7 +10,7 @@
#include "memusage.h" #include "memusage.h"
static inline size_t RecursiveDynamicUsage(const CScript& script) { static inline size_t RecursiveDynamicUsage(const CScript& script) {
return memusage::DynamicUsage(*static_cast<const CScriptBase*>(&script)); return memusage::DynamicUsage(script);
} }
static inline size_t RecursiveDynamicUsage(const COutPoint& out) { static inline size_t RecursiveDynamicUsage(const COutPoint& out) {

View File

@ -106,7 +106,7 @@ public:
template <typename Stream, typename Operation> template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action) { inline void SerializationOp(Stream& s, Operation ser_action) {
READWRITE(prevout); READWRITE(prevout);
READWRITE(*(CScriptBase*)(&scriptSig)); READWRITE(scriptSig);
READWRITE(nSequence); READWRITE(nSequence);
} }
@ -146,7 +146,7 @@ public:
template <typename Stream, typename Operation> template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action) { inline void SerializationOp(Stream& s, Operation ser_action) {
READWRITE(nValue); READWRITE(nValue);
READWRITE(*(CScriptBase*)(&scriptPubKey)); READWRITE(scriptPubKey);
} }
void SetNull() void SetNull()

View File

@ -798,7 +798,7 @@ static void ApplyStats(CCoinsStats &stats, CHashWriter& ss, const uint256& hash,
stats.nTransactions++; stats.nTransactions++;
for (const auto output : outputs) { for (const auto output : outputs) {
ss << VARINT(output.first + 1); ss << VARINT(output.first + 1);
ss << *(const CScriptBase*)(&output.second.out.scriptPubKey); ss << output.second.out.scriptPubKey;
ss << VARINT(output.second.out.nValue); ss << VARINT(output.second.out.nValue);
stats.nTransactionOutputs++; stats.nTransactionOutputs++;
stats.nTotalAmount += output.second.out.nValue; stats.nTotalAmount += output.second.out.nValue;

View File

@ -1099,7 +1099,7 @@ public:
// Serialize the script // Serialize the script
if (nInput != nIn) if (nInput != nIn)
// Blank out other inputs' signatures // Blank out other inputs' signatures
::Serialize(s, CScriptBase()); ::Serialize(s, CScript());
else else
SerializeScriptCode(s); SerializeScriptCode(s);
// Serialize the nSequence // Serialize the nSequence
@ -1207,7 +1207,7 @@ uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsig
// The prevout may already be contained in hashPrevout, and the nSequence // The prevout may already be contained in hashPrevout, and the nSequence
// may already be contain in hashSequence. // may already be contain in hashSequence.
ss << txTo.vin[nIn].prevout; ss << txTo.vin[nIn].prevout;
ss << static_cast<const CScriptBase&>(scriptCode); ss << scriptCode;
ss << amount; ss << amount;
ss << txTo.vin[nIn].nSequence; ss << txTo.vin[nIn].nSequence;
// Outputs (none/one/all, depending on flags) // Outputs (none/one/all, depending on flags)

View File

@ -8,6 +8,7 @@
#include "crypto/common.h" #include "crypto/common.h"
#include "prevector.h" #include "prevector.h"
#include "serialize.h"
#include <assert.h> #include <assert.h>
#include <climits> #include <climits>
@ -404,6 +405,13 @@ public:
CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) : CScriptBase(pbegin, pend) { } CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) : CScriptBase(pbegin, pend) { }
CScript(const unsigned char* pbegin, const unsigned char* pend) : CScriptBase(pbegin, pend) { } CScript(const unsigned char* pbegin, const unsigned char* pend) : CScriptBase(pbegin, pend) { }
ADD_SERIALIZE_METHODS;
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action) {
READWRITE(static_cast<CScriptBase&>(*this));
}
CScript& operator+=(const CScript& b) CScript& operator+=(const CScript& b)
{ {
insert(end(), b.begin(), b.end()); insert(end(), b.begin(), b.end());

View File

@ -95,7 +95,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
uint256 in2 = InsecureRand256(); uint256 in2 = InsecureRand256();
BOOST_CHECK(dbw.Write(key2, in2)); BOOST_CHECK(dbw.Write(key2, in2));
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator()); std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
// Be sure to seek past the obfuscation key (if it exists) // Be sure to seek past the obfuscation key (if it exists)
it->Seek(key); it->Seek(key);
@ -210,7 +210,7 @@ BOOST_AUTO_TEST_CASE(iterator_ordering)
BOOST_CHECK(dbw.Write(key, value)); BOOST_CHECK(dbw.Write(key, value));
} }
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator()); std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
for (int c=0; c<2; ++c) { for (int c=0; c<2; ++c) {
int seek_start; int seek_start;
if (c == 0) if (c == 0)
@ -286,7 +286,7 @@ BOOST_AUTO_TEST_CASE(iterator_string_ordering)
} }
} }
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator()); std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
for (int c=0; c<2; ++c) { for (int c=0; c<2; ++c) {
int seek_start; int seek_start;
if (c == 0) if (c == 0)

View File

@ -172,7 +172,7 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
CCoinsViewCursor *CCoinsViewDB::Cursor() const CCoinsViewCursor *CCoinsViewDB::Cursor() const
{ {
CCoinsViewDBCursor *i = new CCoinsViewDBCursor(const_cast<CDBWrapper*>(&db)->NewIterator(), GetBestBlock()); CCoinsViewDBCursor *i = new CCoinsViewDBCursor(const_cast<CDBWrapper&>(db).NewIterator(), GetBestBlock());
/* It seems that there are no "const iterators" for LevelDB. Since we /* It seems that there are no "const iterators" for LevelDB. Since we
only need read operations on it, use a const-cast to get around only need read operations on it, use a const-cast to get around
that restriction. */ that restriction. */

View File

@ -94,23 +94,23 @@ bool CWalletDB::WriteMasterKey(unsigned int nID, const CMasterKey& kMasterKey)
bool CWalletDB::WriteCScript(const uint160& hash, const CScript& redeemScript) bool CWalletDB::WriteCScript(const uint160& hash, const CScript& redeemScript)
{ {
return WriteIC(std::make_pair(std::string("cscript"), hash), *(const CScriptBase*)(&redeemScript), false); return WriteIC(std::make_pair(std::string("cscript"), hash), redeemScript, false);
} }
bool CWalletDB::WriteWatchOnly(const CScript &dest, const CKeyMetadata& keyMeta) bool CWalletDB::WriteWatchOnly(const CScript &dest, const CKeyMetadata& keyMeta)
{ {
if (!WriteIC(std::make_pair(std::string("watchmeta"), *(const CScriptBase*)(&dest)), keyMeta)) { if (!WriteIC(std::make_pair(std::string("watchmeta"), dest), keyMeta)) {
return false; return false;
} }
return WriteIC(std::make_pair(std::string("watchs"), *(const CScriptBase*)(&dest)), '1'); return WriteIC(std::make_pair(std::string("watchs"), dest), '1');
} }
bool CWalletDB::EraseWatchOnly(const CScript &dest) bool CWalletDB::EraseWatchOnly(const CScript &dest)
{ {
if (!EraseIC(std::make_pair(std::string("watchmeta"), *(const CScriptBase*)(&dest)))) { if (!EraseIC(std::make_pair(std::string("watchmeta"), dest))) {
return false; return false;
} }
return EraseIC(std::make_pair(std::string("watchs"), *(const CScriptBase*)(&dest))); return EraseIC(std::make_pair(std::string("watchs"), dest));
} }
bool CWalletDB::WriteBestBlock(const CBlockLocator& locator) bool CWalletDB::WriteBestBlock(const CBlockLocator& locator)
@ -323,7 +323,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
{ {
wss.nWatchKeys++; wss.nWatchKeys++;
CScript script; CScript script;
ssKey >> *(CScriptBase*)(&script); ssKey >> script;
char fYes; char fYes;
ssValue >> fYes; ssValue >> fYes;
if (fYes == '1') if (fYes == '1')
@ -440,7 +440,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
else if (strType == "watchmeta") else if (strType == "watchmeta")
{ {
CScript script; CScript script;
ssKey >> *(CScriptBase*)(&script); ssKey >> script;
keyID = CScriptID(script); keyID = CScriptID(script);
} }
@ -474,7 +474,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
uint160 hash; uint160 hash;
ssKey >> hash; ssKey >> hash;
CScript script; CScript script;
ssValue >> *(CScriptBase*)(&script); ssValue >> script;
if (!pwallet->LoadCScript(script)) if (!pwallet->LoadCScript(script))
{ {
strErr = "Error reading wallet database: LoadCScript failed"; strErr = "Error reading wallet database: LoadCScript failed";