Трюфельный тест: как проверить библиотеку SafeMath для переполнения

Как проверить, устойчива ли функция против переполнения с помощью теста трюфеля?

contract SafeMath{    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

contract TestSafeMath{ 
    function test_add_10_and_max_should_return_err() {
          uint256 max = 2**256 - 1;
          uint256 expected = "revert overflow error";
          Assert.errorsEqual(SafeMathExt.add(10, max), expected, "Addition of 10 and max should revert");
    }
}

TestSafeMath 1) test_add_max_and_10_should_return_err No events were emitted 1 failing

Как я могу пройти этот тест?

3 голоса | спросил Senju 24 Mayam18 2018, 05:48:54

1 ответ


2

Я действительно не знаю, как ваш код может скомпилироваться, это, очевидно, проблема

uint256 expected = "revert overflow error";

, а также метод errorsEqual библиотеки assert ожидает два кода ошибки

В любом случае один из способов обойти это будет пытаться сделать необработанный вызов, чтобы проверить, есть ли статус возврата внутри виртуальной машины. Метод вызова вернет true, если вызов был выполнен правильно, в противном случае - false.

pragma solidity ^0.4.19;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/SafeMath.sol";

contract TestSafeMath {
  SafeMath instance;

  constructor() public {
    instance = SafeMath(DeployedAddresses.SafeMath());
  }

  function testAdd_10_and_max_should_return_err() public {
    uint256 max = 2**256 - 1;
    bool passed = address(instance).call(bytes4(keccak256("add(uint256,uint256)")), 10, max);

    Assert.isFalse(passed, "test should fail");
  }
  function testAdd_10_and_10_should_be_ok() public {
    uint256 value = 10;
    bool passed = address(instance).call(bytes4(keccak256("add(uint256,uint256)")), 10, value);

    Assert.isTrue(passed, "test should not fail");
    Assert.equal(instance.add(10, value), value + 10, "should be 20");
  }
}

Чтобы получить фактическое значение, вам нужно снова вызвать метод, поскольку сырой вызов не даст вам возвращаемого значения (см. второй метод тестирования).

Выход

  TestSafeMath
    ✓ testAdd_10_and_max_should_return_err (53ms)
    ✓ testAdd_10_and_10_should_be_ok (66ms)


  2 passing (987ms)
ответил mirg 24 Maypm18 2018, 17:58:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132