Merge pull request #747 from 0xProject/fix/sol-cov-bugs
Fix some bugs in sol-cov
This commit is contained in:
@@ -75,6 +75,7 @@ export class RevertTraceSubprovider extends TraceCollectionSubprovider {
|
||||
}
|
||||
const bytecodeHex = stripHexPrefix(bytecode);
|
||||
const sourceMap = isContractCreation ? contractData.sourceMap : contractData.sourceMapRuntime;
|
||||
|
||||
const pcToSourceRange = parseSourceMap(
|
||||
contractData.sourceCodes,
|
||||
sourceMap,
|
||||
@@ -88,16 +89,19 @@ export class RevertTraceSubprovider extends TraceCollectionSubprovider {
|
||||
// actually happens in assembly). In that case, we want to keep
|
||||
// searching backwards by decrementing the pc until we find a
|
||||
// mapped source range.
|
||||
while (_.isUndefined(sourceRange)) {
|
||||
while (_.isUndefined(sourceRange) && pc > 0) {
|
||||
sourceRange = pcToSourceRange[pc];
|
||||
pc -= 1;
|
||||
if (pc <= 0) {
|
||||
this._logger.warn(
|
||||
`could not find matching sourceRange for structLog: ${evmCallStackEntry.structLog}`,
|
||||
);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (_.isUndefined(sourceRange)) {
|
||||
this._logger.warn(
|
||||
`could not find matching sourceRange for structLog: ${JSON.stringify(
|
||||
_.omit(evmCallStackEntry.structLog, 'stack'),
|
||||
)}`,
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
const fileIndex = contractData.sources.indexOf(sourceRange.fileName);
|
||||
const sourceSnippet = getSourceRangeSnippet(sourceRange, contractData.sourceCodes[fileIndex]);
|
||||
if (sourceSnippet !== null) {
|
||||
|
||||
@@ -5,6 +5,10 @@ import * as _ from 'lodash';
|
||||
|
||||
import { ContractData, LineColumn, SingleFileSourceRange } from './types';
|
||||
|
||||
// This is the minimum length of valid contract bytecode. The Solidity compiler
|
||||
// metadata is 86 bytes. If you add the '0x' prefix, we get 88.
|
||||
const MIN_CONTRACT_BYTECODE_LENGTH = 88;
|
||||
|
||||
export const utils = {
|
||||
compareLineColumn(lhs: LineColumn, rhs: LineColumn): number {
|
||||
return lhs.line !== rhs.line ? lhs.line - rhs.line : lhs.column - rhs.column;
|
||||
@@ -38,7 +42,15 @@ export const utils = {
|
||||
}
|
||||
const contractData = _.find(contractsData, contractDataCandidate => {
|
||||
const bytecodeRegex = utils.bytecodeToBytecodeRegex(contractDataCandidate.bytecode);
|
||||
// If the bytecode is less than the minimum length, we are probably
|
||||
// dealing with an interface. This isn't what we're looking for.
|
||||
if (bytecodeRegex.length < MIN_CONTRACT_BYTECODE_LENGTH) {
|
||||
return false;
|
||||
}
|
||||
const runtimeBytecodeRegex = utils.bytecodeToBytecodeRegex(contractDataCandidate.runtimeBytecode);
|
||||
if (runtimeBytecodeRegex.length < MIN_CONTRACT_BYTECODE_LENGTH) {
|
||||
return false;
|
||||
}
|
||||
// We use that function to find by bytecode or runtimeBytecode. Those are quasi-random strings so
|
||||
// collisions are practically impossible and it allows us to reuse that code
|
||||
return !_.isNull(bytecode.match(bytecodeRegex)) || !_.isNull(bytecode.match(runtimeBytecodeRegex));
|
||||
|
||||
Reference in New Issue
Block a user