Static Analyzer for Solidity
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
slither/tests/e2e/detectors/test_detectors.py

1746 lines
43 KiB

4 years ago
import json
import os
from pathlib import Path
4 years ago
import sys
from typing import Type, Optional, List
4 years ago
import pytest
2 years ago
from crytic_compile import CryticCompile, save_to_zip
from crytic_compile.utils.zip import load_from_zip
4 years ago
from slither import Slither
from slither.detectors.abstract_detector import AbstractDetector
from slither.detectors import all_detectors
4 years ago
4 years ago
4 years ago
class Test: # pylint: disable=too-few-public-methods
def __init__(
self,
detector: Type[AbstractDetector],
test_file: str,
solc_ver: str,
additional_files: Optional[List[str]] = None,
):
"""
:param detector:
:param test_file:
:param solc_ver:
:param additional_files: If the test changes additional files, list them here to allow the
test to update the source mapping
"""
4 years ago
self.detector = detector
self.test_file = test_file
self.expected_result = test_file + "." + solc_ver + "." + detector.__name__ + ".json"
self.solc_ver = solc_ver
if additional_files is None:
self.additional_files = []
else:
self.additional_files = additional_files
4 years ago
def set_solc(test_item: Test): # pylint: disable=too-many-lines
4 years ago
# hacky hack hack to pick the solc version we want
env = dict(os.environ)
env["SOLC_VERSION"] = test_item.solc_ver
os.environ.clear()
os.environ.update(env)
def id_test(test_item: Test):
return f"{test_item.detector.__name__}-{test_item.solc_ver}-{test_item.test_file}"
4 years ago
ALL_TEST_OBJECTS = [
Test(
all_detectors.UninitializedFunctionPtrsConstructor,
"uninitialized_function_ptr_constructor.sol",
"0.4.25",
),
Test(
all_detectors.UninitializedFunctionPtrsConstructor,
"uninitialized_function_ptr_constructor.sol",
"0.5.8",
),
Test(
all_detectors.UninitializedFunctionPtrsConstructor,
"uninitialized_function_ptr_constructor.sol",
"0.5.16",
),
Test(
all_detectors.ReentrancyBenign,
"reentrancy-benign.sol",
"0.4.25",
),
Test(
all_detectors.ReentrancyBenign,
"reentrancy-benign.sol",
"0.5.16",
),
Test(
all_detectors.ReentrancyBenign,
"reentrancy-benign.sol",
"0.6.11",
),
Test(
all_detectors.ReentrancyBenign,
"reentrancy-benign.sol",
"0.7.6",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"reentrancy-write.sol",
"0.4.25",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"reentrancy-write.sol",
"0.5.16",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"reentrancy-write.sol",
"0.6.11",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"reentrancy-write.sol",
"0.7.6",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"DAO.sol",
"0.4.25",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"comment.sol",
"0.8.2",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"no-reentrancy-staticcall.sol",
"0.5.16",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"no-reentrancy-staticcall.sol",
"0.6.11",
),
Test(
all_detectors.ReentrancyReadBeforeWritten,
"no-reentrancy-staticcall.sol",
"0.7.6",
),
Test(
all_detectors.BooleanEquality,
"boolean-constant-equality.sol",
"0.4.25",
),
Test(
all_detectors.BooleanEquality,
"boolean-constant-equality.sol",
"0.5.16",
),
Test(
all_detectors.BooleanEquality,
"boolean-constant-equality.sol",
"0.6.11",
),
Test(
all_detectors.BooleanEquality,
"boolean-constant-equality.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.BooleanConstantMisuse,
"boolean-constant-misuse.sol",
"0.4.25",
),
Test(
all_detectors.BooleanConstantMisuse,
"boolean-constant-misuse.sol",
"0.5.16",
),
Test(
all_detectors.BooleanConstantMisuse,
"boolean-constant-misuse.sol",
"0.6.11",
),
Test(
all_detectors.BooleanConstantMisuse,
"boolean-constant-misuse.sol",
"0.7.6",
4 years ago
),
4 years ago
Test(
all_detectors.UncheckedLowLevel,
"unchecked_lowlevel.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.UncheckedLowLevel,
"unchecked_lowlevel.sol",
"0.5.16",
),
4 years ago
Test(
all_detectors.UncheckedLowLevel,
"unchecked_lowlevel.sol",
"0.6.11",
),
Test(
all_detectors.UncheckedLowLevel,
"unchecked_lowlevel.sol",
"0.7.6",
4 years ago
),
Test(
4 years ago
all_detectors.UnindexedERC20EventParameters,
"erc20_indexed.sol",
4 years ago
"0.4.25",
4 years ago
),
Test(
all_detectors.UnindexedERC20EventParameters,
"erc20_indexed.sol",
"0.5.16",
),
Test(
all_detectors.UnindexedERC20EventParameters,
"erc20_indexed.sol",
"0.6.11",
),
Test(
all_detectors.UnindexedERC20EventParameters,
"erc20_indexed.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.IncorrectERC20InterfaceDetection,
"incorrect_erc20_interface.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.IncorrectERC20InterfaceDetection,
"incorrect_erc20_interface.sol",
"0.5.16",
),
Test(
all_detectors.IncorrectERC20InterfaceDetection,
"incorrect_erc20_interface.sol",
"0.6.11",
),
Test(
all_detectors.IncorrectERC20InterfaceDetection,
"incorrect_erc20_interface.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.IncorrectERC721InterfaceDetection,
"incorrect_erc721_interface.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.IncorrectERC721InterfaceDetection,
"incorrect_erc721_interface.sol",
"0.5.16",
),
Test(
all_detectors.IncorrectERC721InterfaceDetection,
"incorrect_erc721_interface.sol",
"0.6.11",
),
Test(
all_detectors.IncorrectERC721InterfaceDetection,
"incorrect_erc721_interface.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.UninitializedStateVarsDetection,
"uninitialized.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.UninitializedStateVarsDetection,
"uninitialized.sol",
"0.5.16",
4 years ago
),
Test(
all_detectors.UninitializedStateVarsDetection,
"uninitialized.sol",
"0.6.11",
),
Test(
all_detectors.UninitializedStateVarsDetection,
"uninitialized.sol",
"0.7.6",
),
Test(all_detectors.Backdoor, "backdoor.sol", "0.4.25"),
Test(all_detectors.Backdoor, "backdoor.sol", "0.5.16"),
Test(all_detectors.Backdoor, "backdoor.sol", "0.6.11"),
Test(all_detectors.Backdoor, "backdoor.sol", "0.7.6"),
Test(all_detectors.Suicidal, "suicidal.sol", "0.4.25"),
Test(all_detectors.Suicidal, "suicidal.sol", "0.5.16"),
Test(all_detectors.Suicidal, "suicidal.sol", "0.6.11"),
Test(all_detectors.Suicidal, "suicidal.sol", "0.7.6"),
Test(
all_detectors.ConstantPragma,
"pragma.0.4.25.sol",
"0.4.25",
["pragma.0.4.24.sol"],
),
4 years ago
Test(
all_detectors.ConstantPragma,
"pragma.0.5.16.sol",
"0.5.16",
["pragma.0.5.15.sol"],
),
Test(
all_detectors.ConstantPragma,
"pragma.0.6.11.sol",
"0.6.11",
["pragma.0.6.10.sol"],
),
Test(
all_detectors.ConstantPragma,
"pragma.0.7.6.sol",
"0.7.6",
["pragma.0.7.5.sol"],
),
Test(all_detectors.IncorrectSolc, "static.sol", "0.4.25"),
Test(all_detectors.IncorrectSolc, "static.sol", "0.5.14"),
Test(all_detectors.IncorrectSolc, "static.sol", "0.5.16"),
Test(all_detectors.IncorrectSolc, "dynamic_1.sol", "0.5.16"),
Test(all_detectors.IncorrectSolc, "dynamic_2.sol", "0.5.16"),
Test(all_detectors.IncorrectSolc, "static.sol", "0.6.10"),
Test(all_detectors.IncorrectSolc, "static.sol", "0.6.11"),
Test(all_detectors.IncorrectSolc, "dynamic_1.sol", "0.6.11"),
Test(all_detectors.IncorrectSolc, "dynamic_2.sol", "0.6.11"),
Test(all_detectors.IncorrectSolc, "static.sol", "0.7.4"),
Test(all_detectors.IncorrectSolc, "static.sol", "0.7.6"),
Test(all_detectors.IncorrectSolc, "dynamic_1.sol", "0.7.6"),
Test(all_detectors.IncorrectSolc, "dynamic_2.sol", "0.7.6"),
4 years ago
Test(
all_detectors.ReentrancyEth,
"reentrancy.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.ReentrancyEth,
"reentrancy_indirect.sol",
"0.4.25",
),
Test(
all_detectors.ReentrancyEth,
"reentrancy.sol",
"0.5.16",
),
Test(
all_detectors.ReentrancyEth,
"reentrancy_indirect.sol",
"0.5.16",
),
Test(
all_detectors.ReentrancyEth,
"reentrancy.sol",
"0.6.11",
),
Test(
all_detectors.ReentrancyEth,
"reentrancy_indirect.sol",
"0.6.11",
),
Test(all_detectors.ReentrancyEth, "reentrancy.sol", "0.7.6"),
Test(
all_detectors.ReentrancyEth,
"reentrancy_indirect.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.ReentrancyEth,
"DAO.sol",
"0.4.25",
),
# Test the nonReentrant filtering
Test(all_detectors.ReentrancyEth, "reentrancy_with_non_reentrant.sol", "0.8.10"),
# Test parse_ignore_comments
Test(all_detectors.ReentrancyEth, "reentrancy_filtered_comments.sol", "0.8.10"),
4 years ago
Test(
all_detectors.UninitializedStorageVars,
"uninitialized_storage_pointer.sol",
"0.4.25",
),
Test(
all_detectors.UninitializedStorageVars,
"uninitialized_storage_pointer.sol",
"0.8.19",
),
Test(all_detectors.TxOrigin, "tx_origin.sol", "0.4.25"),
Test(all_detectors.TxOrigin, "tx_origin.sol", "0.5.16"),
Test(all_detectors.TxOrigin, "tx_origin.sol", "0.6.11"),
Test(all_detectors.TxOrigin, "tx_origin.sol", "0.7.6"),
Test(
all_detectors.UnusedStateVars,
"unused_state.sol",
"0.4.25",
),
Test(
all_detectors.UnusedStateVars,
"unused_state.sol",
"0.5.16",
),
Test(
all_detectors.UnusedStateVars,
"unused_state.sol",
"0.6.11",
),
Test(
all_detectors.UnusedStateVars,
"unused_state.sol",
"0.7.6",
),
Test(all_detectors.LockedEther, "locked_ether.sol", "0.4.25"),
Test(all_detectors.LockedEther, "locked_ether.sol", "0.5.16"),
Test(all_detectors.LockedEther, "locked_ether.sol", "0.6.11"),
Test(all_detectors.LockedEther, "locked_ether.sol", "0.7.6"),
Test(
all_detectors.ArbitrarySendEth,
"arbitrary_send_eth.sol",
4 years ago
"0.4.25",
),
4 years ago
Test(
all_detectors.ArbitrarySendEth,
"arbitrary_send_eth.sol",
"0.5.16",
4 years ago
),
Test(
all_detectors.ArbitrarySendEth,
"arbitrary_send_eth.sol",
"0.6.11",
),
Test(
all_detectors.ArbitrarySendEth,
"arbitrary_send_eth.sol",
"0.7.6",
),
Test(
all_detectors.Assembly,
"inline_assembly_contract.sol",
"0.4.25",
),
Test(
all_detectors.Assembly,
"inline_assembly_library.sol",
"0.4.25",
4 years ago
),
Test(
all_detectors.Assembly,
"inline_assembly_contract.sol",
"0.5.16",
4 years ago
),
Test(
all_detectors.Assembly,
"inline_assembly_library.sol",
"0.5.16",
),
Test(
all_detectors.Assembly,
"inline_assembly_contract.sol",
"0.6.11",
),
Test(
all_detectors.Assembly,
"inline_assembly_library.sol",
"0.6.11",
),
Test(
all_detectors.Assembly,
"inline_assembly_contract.sol",
"0.7.6",
),
Test(
all_detectors.Assembly,
"inline_assembly_library.sol",
"0.7.6",
),
Test(
all_detectors.LowLevelCalls,
"low_level_calls.sol",
"0.4.25",
),
Test(
all_detectors.LowLevelCalls,
"low_level_calls.sol",
"0.5.16",
4 years ago
),
Test(
all_detectors.LowLevelCalls,
"low_level_calls.sol",
"0.6.11",
4 years ago
),
Test(
all_detectors.LowLevelCalls,
"low_level_calls.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.CouldBeConstant,
"const_state_variables.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.CouldBeConstant,
"const_state_variables.sol",
"0.5.16",
),
Test(
all_detectors.CouldBeConstant,
"const_state_variables.sol",
"0.6.11",
),
Test(
all_detectors.CouldBeConstant,
"const_state_variables.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.CouldBeConstant,
"const_state_variables.sol",
"0.8.0",
),
Test(
all_detectors.CouldBeImmutable,
"immut_state_variables.sol",
"0.4.25",
),
Test(
all_detectors.CouldBeImmutable,
"immut_state_variables.sol",
"0.5.16",
),
Test(
all_detectors.CouldBeImmutable,
"immut_state_variables.sol",
"0.6.11",
),
Test(
all_detectors.CouldBeImmutable,
"immut_state_variables.sol",
"0.7.6",
),
Test(
all_detectors.CouldBeImmutable,
"immut_state_variables.sol",
"0.8.0",
),
4 years ago
Test(
all_detectors.ExternalFunction,
"external_function.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.ExternalFunction,
"external_function_2.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.ExternalFunction,
"external_function_3.sol",
"0.4.25",
3 years ago
),
4 years ago
Test(
all_detectors.ExternalFunction,
"external_function.sol",
"0.5.16",
),
Test(
all_detectors.ExternalFunction,
"external_function_2.sol",
"0.5.16",
4 years ago
),
Test(
all_detectors.ExternalFunction,
"external_function_3.sol",
"0.5.16",
3 years ago
),
4 years ago
Test(
all_detectors.ExternalFunction,
"external_function.sol",
"0.6.11",
),
Test(
all_detectors.ExternalFunction,
"external_function_2.sol",
"0.6.11",
),
Test(
all_detectors.ExternalFunction,
"external_function_3.sol",
"0.6.11",
3 years ago
),
Test(
all_detectors.ExternalFunction,
"external_function.sol",
"0.7.6",
),
Test(
all_detectors.ExternalFunction,
"external_function_2.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.ExternalFunction,
"external_function_3.sol",
"0.7.6",
3 years ago
),
4 years ago
Test(
all_detectors.NamingConvention,
"naming_convention.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.NamingConvention,
"naming_convention.sol",
"0.5.16",
),
Test(
all_detectors.NamingConvention,
"naming_convention.sol",
"0.6.11",
),
Test(
all_detectors.NamingConvention,
"naming_convention.sol",
"0.7.6",
4 years ago
),
2 years ago
Test(
all_detectors.NamingConvention,
"no_warning_for_public_constants.sol",
2 years ago
"0.4.25",
),
Test(
all_detectors.NamingConvention,
"no_warning_for_public_constants.sol",
2 years ago
"0.5.16",
),
Test(
all_detectors.NamingConvention,
"no_warning_for_public_constants.sol",
2 years ago
"0.6.11",
),
Test(
all_detectors.NamingConvention,
"no_warning_for_public_constants.sol",
2 years ago
"0.7.6",
),
4 years ago
Test(
all_detectors.ControlledDelegateCall,
"controlled_delegatecall.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.ControlledDelegateCall,
"controlled_delegatecall.sol",
"0.5.16",
),
Test(
all_detectors.ControlledDelegateCall,
"controlled_delegatecall.sol",
"0.6.11",
),
Test(
all_detectors.ControlledDelegateCall,
"controlled_delegatecall.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.UninitializedLocalVars,
"uninitialized_local_variable.sol",
4 years ago
"0.4.25",
),
4 years ago
Test(
all_detectors.UninitializedLocalVars,
"uninitialized_local_variable.sol",
"0.5.16",
),
Test(
all_detectors.UninitializedLocalVars,
"uninitialized_local_variable.sol",
"0.6.11",
),
Test(
all_detectors.UninitializedLocalVars,
"uninitialized_local_variable.sol",
"0.7.6",
4 years ago
),
Test(all_detectors.ConstantFunctionsAsm, "constant.sol", "0.4.25"),
Test(
all_detectors.ConstantFunctionsState,
"constant.sol",
"0.4.25",
),
Test(all_detectors.ConstantFunctionsAsm, "constant.sol", "0.5.16"),
Test(
all_detectors.ConstantFunctionsState,
"constant.sol",
"0.5.16",
),
Test(all_detectors.ConstantFunctionsAsm, "constant.sol", "0.6.11"),
Test(
all_detectors.ConstantFunctionsState,
"constant.sol",
"0.6.11",
),
Test(all_detectors.ConstantFunctionsAsm, "constant.sol", "0.7.6"),
Test(all_detectors.ConstantFunctionsState, "constant.sol", "0.7.6"),
4 years ago
Test(
all_detectors.UnusedReturnValues,
"unused_return.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.UnusedReturnValues,
"unused_return.sol",
"0.5.16",
),
Test(
all_detectors.UnusedReturnValues,
"unused_return.sol",
"0.6.11",
),
Test(
all_detectors.UnusedReturnValues,
"unused_return.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.UncheckedTransfer,
"unused_return_transfers.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.ShadowingAbstractDetection,
"shadowing_abstract.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.ShadowingAbstractDetection,
"shadowing_abstract.sol",
"0.5.16",
),
Test(
all_detectors.ShadowingAbstractDetection,
"shadowing_state_variable.sol",
"0.7.5",
),
Test(
all_detectors.ShadowingAbstractDetection,
"public_gap_variable.sol",
"0.7.5",
),
4 years ago
Test(
all_detectors.StateShadowing,
"shadowing_state_variable.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.StateShadowing,
"shadowing_state_variable.sol",
"0.5.16",
),
Test(
all_detectors.StateShadowing,
"shadowing_state_variable.sol",
"0.6.11",
),
Test(
all_detectors.StateShadowing,
"shadowing_state_variable.sol",
"0.7.5",
),
Test(
all_detectors.StateShadowing,
"public_gap_variable.sol",
"0.7.5",
),
Test(
all_detectors.StateShadowing,
"shadowing_state_variable.sol",
"0.7.6",
),
Test(all_detectors.Timestamp, "timestamp.sol", "0.4.25"),
Test(all_detectors.Timestamp, "timestamp.sol", "0.5.16"),
Test(all_detectors.Timestamp, "timestamp.sol", "0.6.11"),
Test(all_detectors.Timestamp, "timestamp.sol", "0.7.6"),
4 years ago
Test(
all_detectors.MultipleCallsInLoop,
"multiple_calls_in_loop.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.MultipleCallsInLoop,
"multiple_calls_in_loop.sol",
"0.5.16",
),
Test(
all_detectors.MultipleCallsInLoop,
"multiple_calls_in_loop.sol",
"0.6.11",
),
Test(
all_detectors.MultipleCallsInLoop,
"multiple_calls_in_loop.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.BuiltinSymbolShadowing,
"shadowing_builtin_symbols.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.BuiltinSymbolShadowing,
"shadowing_builtin_symbols.sol",
"0.5.16",
),
4 years ago
Test(
all_detectors.LocalShadowing,
"shadowing_local_variable.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.LocalShadowing,
"shadowing_local_variable.sol",
"0.5.16",
),
Test(
all_detectors.LocalShadowing,
"shadowing_local_variable.sol",
"0.6.11",
),
Test(
all_detectors.LocalShadowing,
"shadowing_local_variable.sol",
"0.7.6",
),
4 years ago
Test(
all_detectors.RightToLeftOverride,
"right_to_left_override.sol",
4 years ago
"0.4.25",
),
Test(
all_detectors.RightToLeftOverride,
"right_to_left_override.sol",
"0.5.16",
),
Test(
all_detectors.RightToLeftOverride,
"right_to_left_override.sol",
"0.6.11",
),
Test(
all_detectors.RightToLeftOverride,
"unicode_direction_override.sol",
"0.8.0",
),
Test(all_detectors.VoidConstructor, "void-cst.sol", "0.4.25"),
Test(all_detectors.VoidConstructor, "void-cst.sol", "0.5.16"),
Test(all_detectors.VoidConstructor, "void-cst.sol", "0.6.11"),
Test(all_detectors.VoidConstructor, "void-cst.sol", "0.7.6"),
4 years ago
Test(
all_detectors.UncheckedSend,
"unchecked_send.sol",
"0.4.25",
),
Test(
all_detectors.UncheckedSend,
"unchecked_send.sol",
"0.5.16",
),
Test(
all_detectors.UncheckedSend,
"unchecked_send.sol",
"0.6.11",
),
Test(
all_detectors.UncheckedSend,
"unchecked_send.sol",
"0.7.6",
),
Test(
all_detectors.ReentrancyEvent,
"reentrancy-events.sol",
"0.5.16",
4 years ago
),
Test(
all_detectors.ReentrancyEvent,
"reentrancy-events.sol",
"0.6.11",
),
Test(
all_detectors.ReentrancyEvent,
"reentrancy-events.sol",
"0.7.6",
),
Test(
all_detectors.IncorrectStrictEquality,
"incorrect_equality.sol",
"0.4.25",
),
Test(
all_detectors.IncorrectStrictEquality,
"incorrect_equality.sol",
"0.5.16",
),
Test(
all_detectors.IncorrectStrictEquality,
"incorrect_equality.sol",
"0.6.11",
4 years ago
),
Test(
all_detectors.IncorrectStrictEquality,
"incorrect_equality.sol",
"0.7.6",
),
Test(
all_detectors.TooManyDigits,
"too_many_digits.sol",
"0.4.25",
),
Test(
all_detectors.TooManyDigits,
"too_many_digits.sol",
"0.5.16",
),
Test(
all_detectors.TooManyDigits,
"too_many_digits.sol",
"0.6.11",
),
4 years ago
Test(
all_detectors.TooManyDigits,
"too_many_digits.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.UnprotectedUpgradeable,
"Buggy.sol",
"0.4.25",
4 years ago
),
Test(
all_detectors.UnprotectedUpgradeable,
"Fixed.sol",
"0.4.25",
),
Test(
all_detectors.UnprotectedUpgradeable,
"whitelisted.sol",
"0.4.25",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Buggy.sol",
"0.5.16",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Fixed.sol",
"0.5.16",
),
Test(
all_detectors.UnprotectedUpgradeable,
"whitelisted.sol",
"0.5.16",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Buggy.sol",
"0.6.11",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Fixed.sol",
"0.6.11",
),
Test(
all_detectors.UnprotectedUpgradeable,
"whitelisted.sol",
"0.6.11",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Buggy.sol",
"0.7.6",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Fixed.sol",
"0.7.6",
4 years ago
),
Test(
all_detectors.UnprotectedUpgradeable,
"whitelisted.sol",
"0.7.6",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Buggy.sol",
"0.8.15",
),
Test(
all_detectors.UnprotectedUpgradeable,
"Fixed.sol",
"0.8.15",
),
Test(
all_detectors.UnprotectedUpgradeable,
"whitelisted.sol",
"0.8.15",
),
Test(
all_detectors.ABIEncoderV2Array,
"storage_ABIEncoderV2_array.sol",
"0.4.25",
),
Test(
all_detectors.ABIEncoderV2Array,
"storage_ABIEncoderV2_array.sol",
"0.5.10",
),
Test(
all_detectors.ABIEncoderV2Array,
"storage_ABIEncoderV2_array.sol",
"0.5.9",
),
Test(
all_detectors.ArrayByReference,
"array_by_reference.sol",
"0.4.25",
),
Test(
all_detectors.ArrayByReference,
"array_by_reference.sol",
"0.5.16",
),
Test(
all_detectors.ArrayByReference,
"array_by_reference.sol",
"0.6.11",
),
Test(
all_detectors.ArrayByReference,
"array_by_reference.sol",
"0.7.6",
),
Test(
all_detectors.AssertStateChange,
"assert_state_change.sol",
"0.4.25",
),
Test(
all_detectors.AssertStateChange,
"assert_state_change.sol",
"0.5.16",
),
Test(
all_detectors.AssertStateChange,
"assert_state_change.sol",
"0.6.11",
),
Test(
all_detectors.AssertStateChange,
"assert_state_change.sol",
"0.7.6",
),
Test(
all_detectors.ArrayLengthAssignment,
"array_length_assignment.sol",
"0.4.25",
),
Test(
all_detectors.ArrayLengthAssignment,
"array_length_assignment.sol",
"0.5.16",
),
Test(
all_detectors.CostlyOperationsInLoop,
"multiple_costly_operations_in_loop.sol",
"0.4.25",
),
Test(
all_detectors.CostlyOperationsInLoop,
"multiple_costly_operations_in_loop.sol",
"0.5.16",
),
Test(
all_detectors.CostlyOperationsInLoop,
"multiple_costly_operations_in_loop.sol",
"0.6.11",
),
Test(
all_detectors.CostlyOperationsInLoop,
"multiple_costly_operations_in_loop.sol",
"0.7.6",
),
Test(
all_detectors.FunctionInitializedState,
"function_init_state_variables.sol",
"0.4.25",
),
Test(
all_detectors.FunctionInitializedState,
"function_init_state_variables.sol",
"0.5.16",
),
Test(
all_detectors.FunctionInitializedState,
"function_init_state_variables.sol",
"0.6.11",
),
Test(
all_detectors.FunctionInitializedState,
"function_init_state_variables.sol",
"0.7.6",
),
Test(
all_detectors.MappingDeletionDetection,
"MappingDeletion.sol",
"0.4.25",
),
Test(
all_detectors.MappingDeletionDetection,
"MappingDeletion.sol",
"0.5.16",
),
Test(
all_detectors.MappingDeletionDetection,
"MappingDeletion.sol",
"0.6.11",
),
Test(
all_detectors.MappingDeletionDetection,
"MappingDeletion.sol",
"0.7.6",
),
Test(
all_detectors.PublicMappingNested,
"public_mappings_nested.sol",
"0.4.25",
),
Test(
all_detectors.RedundantStatements,
"redundant_statements.sol",
"0.4.25",
),
Test(
all_detectors.RedundantStatements,
"redundant_statements.sol",
"0.5.16",
),
Test(
all_detectors.RedundantStatements,
"redundant_statements.sol",
"0.6.11",
),
Test(
all_detectors.RedundantStatements,
"redundant_statements.sol",
"0.7.6",
),
Test(
all_detectors.ReusedBaseConstructor,
"reused_base_constructor.sol",
"0.4.21",
),
Test(
all_detectors.ReusedBaseConstructor,
"reused_base_constructor.sol",
"0.4.25",
),
Test(
all_detectors.StorageSignedIntegerArray,
"storage_signed_integer_array.sol",
"0.5.10",
),
Test(
all_detectors.StorageSignedIntegerArray,
"storage_signed_integer_array.sol",
"0.5.16",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented.sol",
"0.4.25",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented.sol",
"0.5.16",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented.sol",
"0.6.11",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented.sol",
"0.7.6",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented_interfaces.sol",
"0.5.16",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented_interfaces.sol",
"0.6.11",
),
Test(
all_detectors.UnimplementedFunctionDetection,
"unimplemented_interfaces.sol",
"0.7.6",
),
Test(all_detectors.BadPRNG, "bad_prng.sol", "0.4.25"),
Test(all_detectors.BadPRNG, "bad_prng.sol", "0.5.16"),
Test(all_detectors.BadPRNG, "bad_prng.sol", "0.6.11"),
Test(all_detectors.BadPRNG, "bad_prng.sol", "0.7.6"),
Test(
all_detectors.MissingEventsAccessControl,
"missing_events_access_control.sol",
"0.4.25",
),
Test(
all_detectors.MissingEventsAccessControl,
"missing_events_access_control.sol",
"0.5.16",
),
Test(
all_detectors.MissingEventsAccessControl,
"missing_events_access_control.sol",
"0.6.11",
),
Test(
all_detectors.MissingEventsAccessControl,
"missing_events_access_control.sol",
"0.7.6",
),
Test(
all_detectors.MissingEventsArithmetic,
"missing_events_arithmetic.sol",
"0.4.25",
),
Test(
all_detectors.MissingEventsArithmetic,
"missing_events_arithmetic.sol",
"0.5.16",
),
Test(
all_detectors.MissingEventsArithmetic,
"missing_events_arithmetic.sol",
"0.6.11",
),
Test(
all_detectors.MissingEventsArithmetic,
"missing_events_arithmetic.sol",
"0.7.6",
),
Test(
all_detectors.ModifierDefaultDetection,
"modifier_default.sol",
"0.4.25",
),
Test(
all_detectors.ModifierDefaultDetection,
"modifier_default.sol",
"0.5.16",
),
Test(
all_detectors.ModifierDefaultDetection,
"modifier_default.sol",
"0.6.11",
),
Test(
all_detectors.ModifierDefaultDetection,
"modifier_default.sol",
"0.7.6",
),
Test(
all_detectors.IncorrectUnaryExpressionDetection,
"invalid_unary_expression.sol",
"0.4.25",
),
Test(
all_detectors.MissingZeroAddressValidation,
"missing_zero_address_validation.sol",
"0.4.25",
),
Test(
all_detectors.MissingZeroAddressValidation,
"missing_zero_address_validation.sol",
"0.5.16",
),
Test(
all_detectors.MissingZeroAddressValidation,
"missing_zero_address_validation.sol",
"0.6.11",
),
Test(
all_detectors.MissingZeroAddressValidation,
"missing_zero_address_validation.sol",
"0.7.6",
),
Test(
all_detectors.PredeclarationUsageLocal,
"predeclaration_usage_local.sol",
"0.4.25",
),
Test(
all_detectors.DeadCode,
"dead-code.sol",
"0.8.0",
),
Test(
all_detectors.WriteAfterWrite,
"write-after-write.sol",
"0.8.0",
),
Test(
all_detectors.ShiftParameterMixup,
"shift_parameter_mixup.sol",
"0.4.25",
),
Test(
all_detectors.ShiftParameterMixup,
"shift_parameter_mixup.sol",
"0.5.16",
),
Test(
all_detectors.ShiftParameterMixup,
"shift_parameter_mixup.sol",
"0.6.11",
),
Test(
all_detectors.ShiftParameterMixup,
"shift_parameter_mixup.sol",
"0.7.6",
),
Test(
all_detectors.MissingInheritance,
"unimplemented_interface.sol",
"0.4.25",
),
Test(
all_detectors.MissingInheritance,
"unimplemented_interface.sol",
"0.5.16",
),
Test(
all_detectors.MissingInheritance,
"unimplemented_interface.sol",
"0.6.11",
),
Test(
all_detectors.MissingInheritance,
"unimplemented_interface.sol",
"0.7.6",
),
2 years ago
# Does not work on the CI. Most likely because of solc 0.4.2?
# Test(
# all_detectors.EnumConversion,
# "enum_conversion.sol",
# "0.4.2",
# ),
Test(
all_detectors.MultipleConstructorSchemes,
"multiple_constructor_schemes.sol",
"0.4.22",
),
Test(
all_detectors.DeprecatedStandards,
"deprecated_calls.sol",
"0.4.25",
),
Test(
all_detectors.DivideBeforeMultiply,
"divide_before_multiply.sol",
"0.4.25",
),
Test(
all_detectors.DivideBeforeMultiply,
"divide_before_multiply.sol",
"0.5.16",
),
Test(
all_detectors.DivideBeforeMultiply,
"divide_before_multiply.sol",
"0.6.11",
),
Test(
all_detectors.DivideBeforeMultiply,
"divide_before_multiply.sol",
"0.7.6",
),
Test(
all_detectors.TypeBasedTautology,
"type_based_tautology.sol",
"0.4.25",
),
Test(
all_detectors.TypeBasedTautology,
"type_based_tautology.sol",
"0.5.16",
),
Test(
all_detectors.TypeBasedTautology,
"type_based_tautology.sol",
"0.6.11",
),
Test(
all_detectors.TypeBasedTautology,
"type_based_tautology.sol",
"0.7.6",
),
Test(
all_detectors.SimilarVarsDetection,
"similar_variables.sol",
"0.4.25",
),
Test(
all_detectors.SimilarVarsDetection,
"similar_variables.sol",
"0.5.16",
),
Test(
all_detectors.SimilarVarsDetection,
"similar_variables.sol",
"0.6.11",
),
Test(
all_detectors.SimilarVarsDetection,
"similar_variables.sol",
"0.7.6",
2 years ago
),
3 years ago
Test(
all_detectors.MsgValueInLoop,
"msg_value_loop.sol",
"0.4.25",
),
Test(
all_detectors.MsgValueInLoop,
"msg_value_loop.sol",
"0.5.16",
),
Test(
all_detectors.MsgValueInLoop,
"msg_value_loop.sol",
"0.6.11",
),
Test(
all_detectors.MsgValueInLoop,
"msg_value_loop.sol",
"0.7.6",
),
Test(
all_detectors.MsgValueInLoop,
"msg_value_loop.sol",
"0.8.0",
3 years ago
),
Test(
all_detectors.DelegatecallInLoop,
"delegatecall_loop.sol",
"0.4.25",
),
Test(
all_detectors.DelegatecallInLoop,
"delegatecall_loop.sol",
"0.5.16",
),
Test(
all_detectors.DelegatecallInLoop,
"delegatecall_loop.sol",
"0.6.11",
),
Test(
all_detectors.DelegatecallInLoop,
"delegatecall_loop.sol",
"0.7.6",
),
Test(
all_detectors.DelegatecallInLoop,
"delegatecall_loop.sol",
"0.8.0",
),
Test(
all_detectors.ProtectedVariables,
"comment.sol",
"0.8.2",
),
Test(
all_detectors.ArbitrarySendErc20NoPermit,
"arbitrary_send_erc20.sol",
"0.4.25",
),
Test(
all_detectors.ArbitrarySendErc20NoPermit,
"arbitrary_send_erc20.sol",
"0.5.16",
),
Test(
all_detectors.ArbitrarySendErc20NoPermit,
"arbitrary_send_erc20.sol",
"0.6.11",
),
Test(
all_detectors.ArbitrarySendErc20NoPermit,
"arbitrary_send_erc20.sol",
"0.7.6",
),
Test(
all_detectors.ArbitrarySendErc20NoPermit,
"arbitrary_send_erc20.sol",
"0.8.0",
),
Test(
all_detectors.ArbitrarySendErc20NoPermit,
"arbitrary_send_erc20_inheritance.sol",
"0.8.0",
),
Test(
all_detectors.ArbitrarySendErc20Permit,
"arbitrary_send_erc20_permit.sol",
"0.4.25",
),
Test(
all_detectors.ArbitrarySendErc20Permit,
"arbitrary_send_erc20_permit.sol",
"0.5.16",
),
Test(
all_detectors.ArbitrarySendErc20Permit,
"arbitrary_send_erc20_permit.sol",
"0.6.11",
),
Test(
all_detectors.ArbitrarySendErc20Permit,
"arbitrary_send_erc20_permit.sol",
"0.7.6",
),
Test(
all_detectors.ArbitrarySendErc20Permit,
"arbitrary_send_erc20_permit.sol",
"0.8.0",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_collision.sol",
"0.4.25",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_collision.sol",
"0.5.16",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_collision.sol",
"0.6.11",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_collision.sol",
"0.7.6",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_collision.sol",
"0.8.0",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_wrong_return_type.sol",
"0.4.25",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_wrong_return_type.sol",
"0.5.16",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_wrong_return_type.sol",
"0.6.11",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_wrong_return_type.sol",
"0.7.6",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_wrong_return_type.sol",
"0.8.0",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_state_var_collision.sol",
"0.4.25",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_state_var_collision.sol",
"0.5.16",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_state_var_collision.sol",
"0.6.11",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_state_var_collision.sol",
"0.7.6",
),
Test(
all_detectors.DomainSeparatorCollision,
"permit_domain_state_var_collision.sol",
"0.8.0",
),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.4.25",
),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.5.16",
),
Test(all_detectors.VarReadUsingThis, "var_read_using_this.sol", "0.6.11"),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.7.6",
),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.8.15",
),
Test(
all_detectors.CyclomaticComplexity,
"HighCyclomaticComplexity.sol",
"0.8.16",
),
Test(
all_detectors.CyclomaticComplexity,
"LowCyclomaticComplexity.sol",
"0.8.16",
),
4 years ago
]
def get_all_tests() -> List[Test]:
# installed_solcs = set(get_installed_solc_versions())
# required_solcs = {test.solc_ver for test in ALL_TEST_OBJECTS}
# missing_solcs = list(required_solcs - installed_solcs)
# if missing_solcs:
# install_solc_versions(missing_solcs)
return ALL_TEST_OBJECTS
ALL_TESTS = get_all_tests()
4 years ago
GENERIC_PATH = "/GENERIC_PATH"
TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data"
4 years ago
2 years ago
# pylint: disable=too-many-locals
4 years ago
@pytest.mark.parametrize("test_item", ALL_TESTS, ids=id_test)
def test_detector(test_item: Test, snapshot):
test_dir_path = Path(
TEST_DATA_DIR,
test_item.detector.ARGUMENT,
test_item.solc_ver,
).as_posix()
test_file_path = Path(test_dir_path, test_item.test_file).as_posix()
zip_artifact_path = Path(f"{test_file_path}-{test_item.solc_ver}.zip").as_posix()
crytic_compile = load_from_zip(zip_artifact_path)[0]
2 years ago
sl = Slither(crytic_compile)
4 years ago
sl.register_detector(test_item.detector)
results = sl.run_detectors()
actual_output = ""
for detector_result in results:
for result in detector_result:
actual_output += result["description"]
actual_output += "\n"
assert snapshot() == actual_output
4 years ago
def _generate_test(test_item: Test, skip_existing=False):
test_dir_path = Path(
TEST_DATA_DIR,
test_item.detector.ARGUMENT,
test_item.solc_ver,
).as_posix()
test_file_path = Path(test_dir_path, test_item.test_file).as_posix()
expected_result_path = Path(test_dir_path, test_item.expected_result).absolute().as_posix()
if skip_existing:
if os.path.isfile(expected_result_path):
return
4 years ago
set_solc(test_item)
sl = Slither(test_file_path)
4 years ago
sl.register_detector(test_item.detector)
results = sl.run_detectors()
results_as_string = json.dumps(results)
Windows CI for Slither (#1137) * workflows: parser: use solc-select from pip The hardcoded, manually-installed version is out of date. This updates the workflow to install directly from pip now that it is available there. * workflows: parser: Run tests also on Windows * workflows: parser: bump solc-select to >=v1.0.0b1 This version introduces Windows support. * workflows: parser: FIXME: install patched crytic-compile * workflows: features: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. * workflows: features: FIXME: install patched crytic-compile * workflows: detectors: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. * workflows: detectors, features, parser: disable fail-fast Disable fail-fast so failures in one platform do not hide failures in the other OS. * tests: detectors: adjust GENERIC_PATH replacement for Windows Backslashes are escaped in the string representation, so we need to double them before replacing. Also change generic path to a constant string to avoid it being converted to "\GENERIC_PATH" in Windows and getting an invalid escape error from the JSON decoder later on. * tests: use lf endings for test code If autocrlf is enabled on Windows, it will rewrite solc code with CRLF file endings and break tests that depend on byte offsets in the code files. * workflows: detectors: FIXME: install patched crytic-compile * workflows: ci: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. Some tests with Linux requirements are excluded. * workflows: ci: FIXME: install patched crytic-compile * workflows: *: update actions/setup-python to v3 v1 does not install Python correctly on Windows. While at it, update all instances to v3. * workflows: ci: add msys2 tools to path * workflows: ci: disable broken Windows workflows * workflows: apply linter fixes * workflows: ci: enable dapp test * tests: dapp: fix test * core: normalize paths on POSIX style * workflows: ci: enable printers tests on Windows
3 years ago
test_file_path = test_file_path.replace("\\", "\\\\")
results_as_string = results_as_string.replace(test_file_path, GENERIC_PATH)
for additional_file in test_item.additional_files:
additional_path = Path(test_dir_path, additional_file).absolute().as_posix()
Windows CI for Slither (#1137) * workflows: parser: use solc-select from pip The hardcoded, manually-installed version is out of date. This updates the workflow to install directly from pip now that it is available there. * workflows: parser: Run tests also on Windows * workflows: parser: bump solc-select to >=v1.0.0b1 This version introduces Windows support. * workflows: parser: FIXME: install patched crytic-compile * workflows: features: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. * workflows: features: FIXME: install patched crytic-compile * workflows: detectors: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. * workflows: detectors, features, parser: disable fail-fast Disable fail-fast so failures in one platform do not hide failures in the other OS. * tests: detectors: adjust GENERIC_PATH replacement for Windows Backslashes are escaped in the string representation, so we need to double them before replacing. Also change generic path to a constant string to avoid it being converted to "\GENERIC_PATH" in Windows and getting an invalid escape error from the JSON decoder later on. * tests: use lf endings for test code If autocrlf is enabled on Windows, it will rewrite solc code with CRLF file endings and break tests that depend on byte offsets in the code files. * workflows: detectors: FIXME: install patched crytic-compile * workflows: ci: enable Windows runs This enables runs on windows-2022 and updates solc-select to support running on Windows. Some tests with Linux requirements are excluded. * workflows: ci: FIXME: install patched crytic-compile * workflows: *: update actions/setup-python to v3 v1 does not install Python correctly on Windows. While at it, update all instances to v3. * workflows: ci: add msys2 tools to path * workflows: ci: disable broken Windows workflows * workflows: apply linter fixes * workflows: ci: enable dapp test * tests: dapp: fix test * core: normalize paths on POSIX style * workflows: ci: enable printers tests on Windows
3 years ago
additional_path = additional_path.replace("\\", "\\\\")
results_as_string = results_as_string.replace(additional_path, GENERIC_PATH)
4 years ago
results = json.loads(results_as_string)
with open(expected_result_path, "w", encoding="utf8") as f:
4 years ago
f.write(json.dumps(results, indent=4))
2 years ago
def _generate_compile(test_item: Test, skip_existing=False):
test_dir_path = Path(
TEST_DATA_DIR,
test_item.detector.ARGUMENT,
test_item.solc_ver,
).as_posix()
test_file_path = Path(test_dir_path, test_item.test_file).as_posix()
zip_artifact_path = Path(f"{test_file_path}-{test_item.solc_ver}.zip").as_posix()
if skip_existing:
if os.path.isfile(zip_artifact_path):
return
set_solc(test_item)
crytic_compile = CryticCompile(test_file_path)
save_to_zip([crytic_compile], zip_artifact_path)
4 years ago
2 years ago
4 years ago
if __name__ == "__main__":
if len(sys.argv) != 2:
print("To generate the json artifacts run\n\tpython tests/test_detectors.py --generate")
4 years ago
elif sys.argv[1] == "--generate":
for next_test in ALL_TESTS:
_generate_test(next_test, skip_existing=True)
elif sys.argv[1] == "--overwrite":
for next_test in ALL_TESTS:
_generate_test(next_test)
elif sys.argv[1] == "--compile":
for next_test in ALL_TESTS:
_generate_compile(next_test, skip_existing=True)