Skip to content

Experimental options in VeriSol

Shuvendu Lahiri edited this page Nov 25, 2019 · 11 revisions

In this page, we describe some of the options that are not exercised by default.

Assuming VeriSol.exe is in your path. Change current directory to Test\regressions folder.

Modeling unknown fallback functions as callbacks

The following example illustrates a specification that is violated in the presence of reentrancy. The /stubModel:callback uses a model of the environment where a fallback function of an unknown dynamic type can call back into any of the public methods of the caller.

VeriSol.exe DAO-demo.sol SimpleDAO /stubModel:callback

Once fixed (comment out the line with // bug and uncomment the line with // fix), the example shows the use of postconditions (using VeriSol.Ensures clause) for recursive methods to perform compositional proofs.

Modular arithmetic

The ERC20 OpenZeppelin implementation optimizes the check for enough balance in _transfer through the use of SafeMath.sol. The following example shows a specification (a contract invariant that uses SumMapping function) that breaks when SafeMath is not used (needs /useModularArithmetic flag.

VeriSol.exe ERC20-demo.sol ERC20 /useModularArithmetic	

Once fixed (comment the line with // bug and uncomment the next line), the contract should verify.

Scalable counterexample finding for AssetTransfer

The following example shows that the default bound on the number of transactions considered for finding a specification violation may not suffice, and the bound may need to be increased by supplying /txBound.

VeriSol.exe A__AssetTransfer_Workbench.sol AssetTransferWrper /txBound:7