#1149 [WIP] Static code analysis in integration build (lint cppcheck)

Closed Adam R catenocrypt
Coverage Reach
src/interface/TWEthereumAbiFunction.cpp src/interface/TWStoredKey.cpp src/interface/TWBitcoinScript.cpp src/interface/TWAnyAddress.cpp src/interface/TWHash.cpp src/interface/TWData.cpp src/interface/TWPrivateKey.cpp src/interface/TWEthereumAbiValue.cpp src/interface/TWHDWallet.cpp src/interface/TWPublicKey.cpp src/interface/TWCoinType.cpp src/interface/TWBitcoinAddress.cpp src/interface/TWAnySigner.cpp src/interface/TWString+Hex.cpp src/interface/TWString.cpp src/interface/TWSegwitAddress.cpp src/interface/TWEthereumAbi.cpp src/interface/TWBase58.cpp src/interface/TWAES.cpp src/interface/TWGroestlcoinAddress.cpp src/interface/TWAccount.cpp src/interface/TWFIOAccount.cpp src/interface/TWNEARAccount.cpp src/interface/TWHDVersion.cpp src/interface/TWBitcoin.cpp src/Ethereum/ABI/ParamFactory.cpp src/Ethereum/ABI/ParamNumber.h src/Ethereum/ABI/Parameters.cpp src/Ethereum/ABI/Bytes.cpp src/Ethereum/ABI/ValueEncoder.cpp src/Ethereum/ABI/Bytes.h src/Ethereum/ABI/Array.cpp src/Ethereum/ABI/ParamNumber.cpp src/Ethereum/ABI/Function.cpp src/Ethereum/ABI/Function.h src/Ethereum/ABI/Parameters.h src/Ethereum/ABI/ParamAddress.h src/Ethereum/ABI/Array.h src/Ethereum/ABI/ValueDecoder.cpp src/Ethereum/ABI/ParamBase.h src/Ethereum/ABI/ValueEncoder.h src/Ethereum/RLP.cpp src/Ethereum/Signer.cpp src/Ethereum/ContractCall.cpp src/Ethereum/RLP.h src/Ethereum/AddressChecksum.cpp src/Ethereum/Address.cpp src/Ethereum/Entry.cpp src/Ethereum/Transaction.h src/Ethereum/Entry.h src/Ethereum/Address.h src/Ethereum/Signer.h src/Bitcoin/Script.cpp src/Bitcoin/TransactionSigner.cpp src/Bitcoin/Transaction.cpp src/Bitcoin/TransactionBuilder.cpp src/Bitcoin/UnspentSelector.cpp src/Bitcoin/SegwitAddress.cpp src/Bitcoin/CashAddress.cpp src/Bitcoin/Signer.cpp src/Bitcoin/Entry.cpp src/Bitcoin/TransactionPlan.h src/Bitcoin/FeeCalculator.cpp src/Bitcoin/Script.h src/Bitcoin/TransactionBuilder.h src/Bitcoin/TransactionInput.cpp src/Bitcoin/TransactionSigner.h src/Bitcoin/Transaction.h src/Bitcoin/SegwitAddress.h src/Bitcoin/SigHashType.h src/Bitcoin/UnspentSelector.h src/Bitcoin/OutPoint.h src/Bitcoin/Address.h src/Bitcoin/TransactionInput.h src/Bitcoin/OutPoint.cpp src/Bitcoin/TransactionOutput.cpp src/Bitcoin/CashAddress.h src/Bitcoin/Entry.h src/Bitcoin/FeeCalculator.h src/Bitcoin/OpCodes.h src/Bitcoin/TransactionOutput.h src/FIO/TransactionBuilder.cpp src/FIO/Encryption.cpp src/FIO/Action.cpp src/FIO/Address.cpp src/FIO/Action.h src/FIO/NewFundsRequest.cpp src/FIO/Actor.cpp src/FIO/Signer.cpp src/FIO/Transaction.cpp src/FIO/Entry.cpp src/FIO/Transaction.h src/FIO/Entry.h src/FIO/NewFundsRequest.h src/FIO/Address.h src/FIO/TransactionBuilder.h src/Harmony/Signer.cpp src/Harmony/Staking.h src/Harmony/Transaction.h src/Harmony/Address.h src/Harmony/Entry.cpp src/Harmony/Entry.h src/Harmony/Address.cpp src/Harmony/Signer.h src/Ontology/ParamsBuilder.cpp src/Ontology/Address.cpp src/Ontology/OngTxBuilder.cpp src/Ontology/Signer.cpp src/Ontology/Transaction.cpp src/Ontology/Ong.cpp src/Ontology/OntTxBuilder.cpp src/Ontology/Ont.cpp src/Ontology/SigData.cpp src/Ontology/Transaction.h src/Ontology/Entry.cpp src/Ontology/SigData.h src/Ontology/ParamsBuilder.h src/Ontology/Ong.h src/Ontology/Ont.h src/Ontology/Asset.h src/Ontology/Entry.h src/Ontology/Signer.h src/EOS/Transaction.cpp src/EOS/Asset.cpp src/EOS/Address.cpp src/EOS/Signer.cpp src/EOS/Action.cpp src/EOS/Name.cpp src/EOS/Serialization.h src/EOS/PackedTransaction.cpp src/EOS/Prefixes.h src/EOS/Entry.cpp src/EOS/Action.h src/EOS/Transaction.h src/EOS/Signer.h src/EOS/PackedTransaction.h src/EOS/Name.h src/EOS/Address.h src/EOS/Entry.h src/EOS/Asset.h src/TON/Cell.cpp src/TON/Address.cpp src/TON/Signer.cpp src/TON/Contract.cpp src/TON/Cell.h src/TON/Address.h src/TON/Entry.cpp src/TON/Entry.h src/NEO/Signer.cpp src/NEO/Transaction.cpp src/NEO/ReadData.cpp src/NEO/TransactionAttribute.h src/NEO/Address.cpp src/NEO/Serializable.h src/NEO/TransactionOutput.h src/NEO/CoinReference.h src/NEO/Witness.h src/NEO/Script.cpp src/NEO/MinerTransaction.h src/NEO/Entry.cpp src/NEO/ReadData.h src/NEO/Transaction.h src/NEO/Address.h src/NEO/ISerializable.h src/NEO/Entry.h src/NEO/Signer.h src/Tron/Signer.cpp src/Tron/Serialization.cpp src/Tron/Address.cpp src/Tron/Entry.cpp src/Tron/Entry.h src/Tron/Address.h src/Decred/Signer.cpp src/Decred/Transaction.cpp src/Decred/Address.cpp src/Decred/TransactionBuilder.h src/Decred/Transaction.h src/Decred/TransactionInput.cpp src/Decred/Entry.cpp src/Decred/Signer.h src/Decred/OutPoint.h src/Decred/TransactionOutput.cpp src/Decred/TransactionOutput.h src/Decred/OutPoint.cpp src/Decred/TransactionInput.h src/Decred/Entry.h src/Keystore/StoredKey.cpp src/Keystore/EncryptionParameters.cpp src/Keystore/ScryptParameters.cpp src/Keystore/Account.cpp src/Keystore/PBKDF2Parameters.cpp src/Keystore/AESParameters.cpp src/Keystore/Account.h src/Keystore/EncryptionParameters.h src/Keystore/StoredKey.h src/Keystore/ScryptParameters.h src/Keystore/AESParameters.h src/Keystore/PBKDF2Parameters.h src/Solana/Transaction.h src/Solana/Signer.cpp src/Solana/Transaction.cpp src/Solana/Address.cpp src/Solana/Entry.cpp src/Solana/Address.h src/Solana/Entry.h src/Binance/Signer.cpp src/Binance/Serialization.cpp src/Binance/Address.cpp src/Binance/Entry.cpp src/Binance/Address.h src/Binance/Entry.h src/Binance/Signer.h src/Cbor.cpp src/Cardano/AddressV3.cpp src/Cardano/AddressV2.cpp src/Cardano/Entry.cpp src/Cardano/AddressV3.h src/Cardano/Entry.h src/Cardano/AddressV2.h src/Filecoin/Address.cpp src/Filecoin/Transaction.cpp src/Filecoin/Signer.cpp src/Filecoin/Address.h src/Filecoin/Transaction.h src/Filecoin/Entry.cpp src/Filecoin/Entry.h src/Waves/Transaction.cpp src/Waves/Address.cpp src/Waves/Signer.cpp src/Waves/Entry.cpp src/Waves/BinaryCoding.h src/Waves/Transaction.h src/Waves/Entry.h src/Polkadot/Extrinsic.cpp src/Polkadot/ScaleCodec.h src/Polkadot/Extrinsic.h src/Polkadot/Signer.cpp src/Polkadot/Entry.cpp src/Polkadot/Address.h src/Polkadot/Entry.h src/Tezos/Forging.cpp src/Tezos/Signer.cpp src/Tezos/Address.cpp src/Tezos/OperationList.cpp src/Tezos/BinaryCoding.cpp src/Tezos/Entry.cpp src/Tezos/Entry.h src/Tezos/OperationList.h src/Tezos/Address.h src/HDWallet.cpp src/Zcash/Transaction.cpp src/Zcash/Signer.cpp src/Zcash/TransactionBuilder.h src/Zcash/Transaction.h src/Zcash/Entry.cpp src/Zcash/TAddress.h src/Zcash/Entry.h src/NULS/Signer.cpp src/NULS/BinaryCoding.h src/NULS/Address.cpp src/NULS/Entry.cpp src/NULS/Entry.h src/NULS/Signer.h src/Coin.cpp src/Ripple/Transaction.cpp src/Ripple/XAddress.cpp src/Ripple/Signer.cpp src/Ripple/BinaryCoding.h src/Ripple/Transaction.h src/Ripple/Address.cpp src/Ripple/Entry.cpp src/Ripple/Entry.h src/PrivateKey.cpp src/Algorand/BinaryCoding.h src/Algorand/Transaction.cpp src/Algorand/Address.cpp src/Algorand/Signer.cpp src/Algorand/Transaction.h src/Algorand/Entry.cpp src/Algorand/Entry.h src/Cosmos/Serialization.cpp src/Cosmos/Signer.cpp src/Cosmos/Entry.cpp src/Cosmos/Address.h src/Cosmos/Entry.h src/Nano/Signer.cpp src/Nano/Address.cpp src/Nano/Entry.cpp src/Nano/Entry.h src/Nano/Signer.h src/Nebulas/Transaction.cpp src/Nebulas/Signer.cpp src/Nebulas/Address.cpp src/Nebulas/Transaction.h src/Nebulas/Entry.cpp src/Nebulas/Entry.h src/Nebulas/Signer.h src/Nimiq/Address.cpp src/Nimiq/Transaction.cpp src/Nimiq/Signer.cpp src/Nimiq/Entry.cpp src/Nimiq/Signer.h src/Nimiq/Transaction.h src/Nimiq/Entry.h src/Nimiq/Address.h src/IoTeX/Staking.cpp src/IoTeX/Signer.cpp src/IoTeX/Address.h src/IoTeX/Entry.cpp src/IoTeX/Signer.h src/IoTeX/Entry.h src/IoTeX/Address.cpp src/Theta/Transaction.cpp src/Theta/Signer.cpp src/Theta/Entry.cpp src/Theta/Transaction.h src/Theta/Coins.h src/Theta/Signer.h src/Theta/Entry.h src/Stellar/Signer.cpp src/Stellar/Address.cpp src/Stellar/Entry.cpp src/Stellar/Entry.h src/Stellar/Signer.h src/Aeternity/Signer.cpp src/Aeternity/Transaction.cpp src/Aeternity/Address.cpp src/Aeternity/Transaction.h src/Aeternity/Entry.cpp src/Aeternity/Identifiers.h src/Aeternity/Entry.h src/Aeternity/Address.h src/NEAR/Serialization.cpp src/NEAR/Address.cpp src/NEAR/Signer.cpp src/NEAR/Entry.cpp src/NEAR/Account.cpp src/NEAR/Entry.h src/BinaryCoding.cpp src/PublicKey.cpp src/Icon/Signer.cpp src/Icon/Address.cpp src/Icon/Entry.cpp src/Icon/Entry.h src/Icon/Signer.h src/Zilliqa/Signer.cpp src/Zilliqa/AddressChecksum.cpp src/Zilliqa/Address.h src/Zilliqa/Entry.cpp src/Zilliqa/Entry.h src/Zilliqa/Address.cpp src/Aion/Signer.cpp src/Aion/Address.cpp src/Aion/Transaction.cpp src/Aion/Transaction.h src/Aion/RLP.h src/Aion/Entry.cpp src/Aion/Address.h src/Aion/Entry.h src/Base58.cpp src/XXHash64.h src/Bech32.cpp src/Hash.cpp src/Elrond/Serialization.cpp src/Elrond/Signer.cpp src/Elrond/Entry.cpp src/Elrond/Address.h src/Elrond/Address.cpp src/Elrond/Entry.h src/VeChain/Transaction.cpp src/VeChain/Signer.cpp src/VeChain/Entry.cpp src/VeChain/Clause.h src/VeChain/Transaction.h src/VeChain/Entry.h src/Groestlcoin/Address.cpp src/Groestlcoin/Signer.cpp src/Groestlcoin/Entry.cpp src/Groestlcoin/Transaction.h src/Groestlcoin/Address.h src/Groestlcoin/Entry.h src/DerivationPath.h src/Wanchain/Signer.cpp src/Wanchain/Entry.cpp src/Wanchain/Address.cpp src/Wanchain/Entry.h src/Wanchain/Signer.h src/Wanchain/Address.h src/Bech32Address.cpp src/Encrypt.cpp src/Hash.h src/uint256.h src/SS58Address.h src/Base58Address.h src/Base64.cpp src/BinaryCoding.h src/DerivationPath.cpp src/Result.h src/HexCoding.h src/Base32.h src/CoinEntry.h src/Crc.cpp src/Cbor.h src/Bech32.h src/Data.h src/Base58.h src/Kusama/Entry.cpp src/Kusama/Address.h src/Kusama/Entry.h src/Bech32Address.h src/PublicKey.h src/PrivateKey.h src/Data.cpp src/HDWallet.h src/Coin.h walletconsole/lib/CommandExecutor.cpp walletconsole/lib/Keys.cpp walletconsole/lib/Util.cpp walletconsole/lib/Address.cpp walletconsole/lib/Coins.cpp walletconsole/lib/Buffer.cpp walletconsole/lib/WalletConsole.cpp walletconsole/lib/Buffer.h walletconsole/lib/TonCoin.h walletconsole/lib/Coins.h walletconsole/lib/WalletConsole.h walletconsole/lib/Keys.h walletconsole/lib/Util.h walletconsole/lib/CommandExecutor.h walletconsole/lib/Address.h

No flags found

Use flags to group coverage reports by test type, project and/or folders.
Then setup custom commit statuses and notifications for each flag.

e.g., #unittest #integration

#production #enterprise

#frontend #backend

Learn more about Codecov Flags here.

Showing 10 of 139 files from the diff.
Other files ignored by Codecov
swift/Podfile has changed.
swift/project.yml has changed.
coins.json has changed.
docs/coins.md has changed.
CMakeLists.txt has changed.
tools/ios-release has changed.

@@ -40,6 +40,8 @@
Loading
40 40
    bool dumpMnemonic(string& res);
41 41
    /// Dump default derivation path of coin
42 42
    bool dumpDP(const string& coinid, string& res);
43 +
    /// Dump XPUB of current mnemonic
44 +
    bool dumpXpub(const string& coinid, string& res);
43 45
    /// Derive a private key from the mnemonic with derivation path
44 46
    bool priDP(const string& coinid, const string& dp, string& res);
45 47
};

@@ -33,6 +33,8 @@
Loading
33 33
    bool addrDefault(const string& coinid, string& res);
34 34
    /// Derive a new address with the given derivation path
35 35
    bool deriveFromPath(const string& coinid, const string& derivPath, string& res);
36 +
    /// Derive a new address from XPUB and index
37 +
    bool deriveFromXpubIndex(const string& coinid, const string& xpub, const string& accountIndex, string& res);
36 38
};
37 39
38 40
} // namespace TW::WalletConsole

@@ -11,6 +11,7 @@
Loading
11 11
#include "PrivateKey.h"
12 12
#include "HexCoding.h"
13 13
#include "HDWallet.h"
14 +
#include "Coin.h"
14 15
15 16
#include <iostream>
16 17
#include <vector>
@@ -134,6 +135,19 @@
Loading
134 135
    return true;
135 136
}
136 137
138 +
bool Keys::dumpXpub(const string& coinid, string& res) {
139 +
    assert(_currentMnemonic.length() > 0); // a mnemonic is always set
140 +
    Coin coin;
141 +
    if (!_coins.findCoin(coinid, coin)) { return false; }
142 +
    TWCoinType ctype = (TWCoinType)coin.c;
143 +
    TWPurpose purpose = TW::purpose(ctype);
144 +
    TWHDVersion xpubVersion = TW::xpubVersion(ctype);
145 +
    HDWallet wallet(_currentMnemonic, "");
146 +
    string xpub = wallet.getExtendedPublicKey(purpose, ctype, xpubVersion);
147 +
    res = xpub;
148 +
    return true;
149 +
}
150 +
137 151
bool Keys::priDP(const string& coinid, const string& dp, string& res) {
138 152
    // coin
139 153
    Coin coin;

@@ -96,4 +96,22 @@
Loading
96 96
    return true;
97 97
}
98 98
99 +
bool Address::deriveFromXpubIndex(const string& coinid, const string& xpub, const string& accountIndex, string& res) {
100 +
    Coin coin;
101 +
    if (!_coins.findCoin(coinid, coin)) { return false; }
102 +
    TWCoinType ctype = (TWCoinType)coin.c;
103 +
104 +
    int index = std::stoi(accountIndex);
105 +
106 +
    // Derivation path: use default, but only elements 4&5 (change&address) are used
107 +
    DerivationPath dp(coin.derivPath);
108 +
    dp.setChange(0);
109 +
    dp.setAddress(index);
110 +
111 +
    const auto publicKey = HDWallet::getPublicKeyFromExtended(xpub, ctype, dp);
112 +
    if (!publicKey) { return false; }
113 +
    res = TW::deriveAddress(ctype, publicKey.value());
114 +
    return true;
115 +
}
116 +
99 117
} // namespace TW::WalletConsole

@@ -157,9 +157,10 @@
Loading
157 157
158 158
    // These public key type are not applicable.  Handled above, as node.curve->params is null
159 159
    assert(curve != TWCurveED25519 && curve != TWCurveED25519Blake2bNano && curve != TWCurveED25519Extended && curve != TWCurveCurve25519);
160 -
    if (curve == TWCurveSECP256k1) {
160 +
    TWPublicKeyType keyType = TW::publicKeyType(coin);
161 +
    if (curve == TWCurveSECP256k1 && keyType == TWPublicKeyTypeSECP256k1) {
161 162
        return PublicKey(Data(node.public_key, node.public_key + 33), TWPublicKeyTypeSECP256k1);
162 -
    } else if (curve == TWCurveNIST256p1) {
163 +
    } else if (curve == TWCurveNIST256p1 && keyType == TWPublicKeyTypeNIST256p1) {
163 164
        return PublicKey(Data(node.public_key, node.public_key + 33), TWPublicKeyTypeNIST256p1);
164 165
    }
165 166
    return {};

Click to load this diff.
Loading diff...

Click to load this diff.
Loading diff...

Click to load this diff.
Loading diff...

Click to load this diff.
Loading diff...

Click to load this diff.
Loading diff...

Everything is accounted for!

No changes detected that need to be reviewed.
What changes does Codecov check for?
Lines, not adjusted in diff, that have changed coverage data.
Files that introduced coverage data that had none before.
Files that have missing coverage data that once were tracked.
Files Coverage
src +<.01% 95.26%
walletconsole/lib 0.29% 95.09%
Project Totals (430 files) 95.25%
Loading