contract C {
  address owner;

  modifier check_addr(address _addr) {
    if (_addr != address(0)) {
      _;
    }
  }
  
  function bad0_set_owner(address new_owner) payable public{
    owner = new_owner; // No check before use
  }

  function bad1_send(address payable addr) payable public{
    addr.send(msg.value); // No check before send
    addr.send(msg.value); 
  }

  function bad2_transfer(address payable addr) payable public{
    addr.transfer(msg.value); // No check before transfer
  }

  function bad3_transfer(address payable addr) payable public{
    addr.transfer(msg.value); 
    require(addr != address(0)); // check after transfer just to verify detector heuristic implementation.	
  }

  function bad4_call(address payable addr) payable public{
    addr.call{value:msg.value}(""); // No check before call
  }
    
  function good0_set_owner(address new_owner) payable public{
    if (new_owner != address(0)) { // Check
      owner = new_owner;
    }
  }

  function good1_set_owner() payable public{
    owner = 0x0123456789012345678901234567890123456789; // No tainting
  }

  function good2_send(address payable addr) payable public{
    if (addr != address(0)) {
      addr.send(msg.value); // check before send
    }
  }
  
  function good3_transfer(address payable addr) payable public{
    if (addr != address(0)) {
      addr.transfer(msg.value); // check before transfer
    }
  }

  function good4_transfer(address payable addr) payable public{
    require(addr != address(0));
    addr.transfer(msg.value); // check in above require before transfer
  }

  function good5_transfer(address payable addr) payable public check_addr(addr) { 
    addr.transfer(msg.value); // checked in modifier before transfer
  }

  function good6_msg_sender() payable public {
    owner = msg.sender; // msg.sender does not need to be zero validated
  }

  function good7_transfer_msg_sender() payable public {
    address payable addr = msg.sender;
    addr.transfer(msg.value); // msg.sender does not need to be zero validated
  }
}
