Skip to content

Commit 10b22e3

Browse files
committed
Merge #10760: Avoid dereference-of-casted-pointer
0aadc11 Avoid dereference-of-casted-pointer (Pieter Wuille) Pull request description: And prefer a static_cast to the intended reference type. Tree-SHA512: e83b20023a4dca6029b46f7040a8a6fd54e1b42112ec0c87c3c3b567ed641de97a9e2335b57a2efb075491f641e5b977bc226a474276bea0c3c3c71d8d6ac54d
2 parents afd2fca + 0aadc11 commit 10b22e3

File tree

8 files changed

+26
-18
lines changed

8 files changed

+26
-18
lines changed

src/core_memusage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "memusage.h"
1111

1212
static inline size_t RecursiveDynamicUsage(const CScript& script) {
13-
return memusage::DynamicUsage(*static_cast<const CScriptBase*>(&script));
13+
return memusage::DynamicUsage(script);
1414
}
1515

1616
static inline size_t RecursiveDynamicUsage(const COutPoint& out) {

src/primitives/transaction.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class CTxIn
106106
template <typename Stream, typename Operation>
107107
inline void SerializationOp(Stream& s, Operation ser_action) {
108108
READWRITE(prevout);
109-
READWRITE(*(CScriptBase*)(&scriptSig));
109+
READWRITE(scriptSig);
110110
READWRITE(nSequence);
111111
}
112112

@@ -146,7 +146,7 @@ class CTxOut
146146
template <typename Stream, typename Operation>
147147
inline void SerializationOp(Stream& s, Operation ser_action) {
148148
READWRITE(nValue);
149-
READWRITE(*(CScriptBase*)(&scriptPubKey));
149+
READWRITE(scriptPubKey);
150150
}
151151

152152
void SetNull()

src/rpc/blockchain.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ static void ApplyStats(CCoinsStats &stats, CHashWriter& ss, const uint256& hash,
798798
stats.nTransactions++;
799799
for (const auto output : outputs) {
800800
ss << VARINT(output.first + 1);
801-
ss << *(const CScriptBase*)(&output.second.out.scriptPubKey);
801+
ss << output.second.out.scriptPubKey;
802802
ss << VARINT(output.second.out.nValue);
803803
stats.nTransactionOutputs++;
804804
stats.nTotalAmount += output.second.out.nValue;

src/script/interpreter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,7 @@ class CTransactionSignatureSerializer {
10991099
// Serialize the script
11001100
if (nInput != nIn)
11011101
// Blank out other inputs' signatures
1102-
::Serialize(s, CScriptBase());
1102+
::Serialize(s, CScript());
11031103
else
11041104
SerializeScriptCode(s);
11051105
// Serialize the nSequence
@@ -1207,7 +1207,7 @@ uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsig
12071207
// The prevout may already be contained in hashPrevout, and the nSequence
12081208
// may already be contain in hashSequence.
12091209
ss << txTo.vin[nIn].prevout;
1210-
ss << static_cast<const CScriptBase&>(scriptCode);
1210+
ss << scriptCode;
12111211
ss << amount;
12121212
ss << txTo.vin[nIn].nSequence;
12131213
// Outputs (none/one/all, depending on flags)

src/script/script.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "crypto/common.h"
1010
#include "prevector.h"
11+
#include "serialize.h"
1112

1213
#include <assert.h>
1314
#include <climits>
@@ -404,6 +405,13 @@ class CScript : public CScriptBase
404405
CScript(std::vector<unsigned char>::const_iterator pbegin, std::vector<unsigned char>::const_iterator pend) : CScriptBase(pbegin, pend) { }
405406
CScript(const unsigned char* pbegin, const unsigned char* pend) : CScriptBase(pbegin, pend) { }
406407

408+
ADD_SERIALIZE_METHODS;
409+
410+
template <typename Stream, typename Operation>
411+
inline void SerializationOp(Stream& s, Operation ser_action) {
412+
READWRITE(static_cast<CScriptBase&>(*this));
413+
}
414+
407415
CScript& operator+=(const CScript& b)
408416
{
409417
insert(end(), b.begin(), b.end());

src/test/dbwrapper_tests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
9595
uint256 in2 = InsecureRand256();
9696
BOOST_CHECK(dbw.Write(key2, in2));
9797

98-
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
98+
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
9999

100100
// Be sure to seek past the obfuscation key (if it exists)
101101
it->Seek(key);
@@ -210,7 +210,7 @@ BOOST_AUTO_TEST_CASE(iterator_ordering)
210210
BOOST_CHECK(dbw.Write(key, value));
211211
}
212212

213-
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
213+
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
214214
for (int c=0; c<2; ++c) {
215215
int seek_start;
216216
if (c == 0)
@@ -286,7 +286,7 @@ BOOST_AUTO_TEST_CASE(iterator_string_ordering)
286286
}
287287
}
288288

289-
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper*>(&dbw)->NewIterator());
289+
std::unique_ptr<CDBIterator> it(const_cast<CDBWrapper&>(dbw).NewIterator());
290290
for (int c=0; c<2; ++c) {
291291
int seek_start;
292292
if (c == 0)

src/txdb.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
172172

173173
CCoinsViewCursor *CCoinsViewDB::Cursor() const
174174
{
175-
CCoinsViewDBCursor *i = new CCoinsViewDBCursor(const_cast<CDBWrapper*>(&db)->NewIterator(), GetBestBlock());
175+
CCoinsViewDBCursor *i = new CCoinsViewDBCursor(const_cast<CDBWrapper&>(db).NewIterator(), GetBestBlock());
176176
/* It seems that there are no "const iterators" for LevelDB. Since we
177177
only need read operations on it, use a const-cast to get around
178178
that restriction. */

src/wallet/walletdb.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,23 @@ bool CWalletDB::WriteMasterKey(unsigned int nID, const CMasterKey& kMasterKey)
9494

9595
bool CWalletDB::WriteCScript(const uint160& hash, const CScript& redeemScript)
9696
{
97-
return WriteIC(std::make_pair(std::string("cscript"), hash), *(const CScriptBase*)(&redeemScript), false);
97+
return WriteIC(std::make_pair(std::string("cscript"), hash), redeemScript, false);
9898
}
9999

100100
bool CWalletDB::WriteWatchOnly(const CScript &dest, const CKeyMetadata& keyMeta)
101101
{
102-
if (!WriteIC(std::make_pair(std::string("watchmeta"), *(const CScriptBase*)(&dest)), keyMeta)) {
102+
if (!WriteIC(std::make_pair(std::string("watchmeta"), dest), keyMeta)) {
103103
return false;
104104
}
105-
return WriteIC(std::make_pair(std::string("watchs"), *(const CScriptBase*)(&dest)), '1');
105+
return WriteIC(std::make_pair(std::string("watchs"), dest), '1');
106106
}
107107

108108
bool CWalletDB::EraseWatchOnly(const CScript &dest)
109109
{
110-
if (!EraseIC(std::make_pair(std::string("watchmeta"), *(const CScriptBase*)(&dest)))) {
110+
if (!EraseIC(std::make_pair(std::string("watchmeta"), dest))) {
111111
return false;
112112
}
113-
return EraseIC(std::make_pair(std::string("watchs"), *(const CScriptBase*)(&dest)));
113+
return EraseIC(std::make_pair(std::string("watchs"), dest));
114114
}
115115

116116
bool CWalletDB::WriteBestBlock(const CBlockLocator& locator)
@@ -323,7 +323,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
323323
{
324324
wss.nWatchKeys++;
325325
CScript script;
326-
ssKey >> *(CScriptBase*)(&script);
326+
ssKey >> script;
327327
char fYes;
328328
ssValue >> fYes;
329329
if (fYes == '1')
@@ -440,7 +440,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
440440
else if (strType == "watchmeta")
441441
{
442442
CScript script;
443-
ssKey >> *(CScriptBase*)(&script);
443+
ssKey >> script;
444444
keyID = CScriptID(script);
445445
}
446446

@@ -474,7 +474,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
474474
uint160 hash;
475475
ssKey >> hash;
476476
CScript script;
477-
ssValue >> *(CScriptBase*)(&script);
477+
ssValue >> script;
478478
if (!pwallet->LoadCScript(script))
479479
{
480480
strErr = "Error reading wallet database: LoadCScript failed";

0 commit comments

Comments
 (0)