Need help with cuter?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

207 Stars 22 Forks GNU General Public License v3.0 694 Commits 30 Opened issues


A concolic testing tool for the Erlang functional programming language.

Services available


Need anything else?

Contributors list

Github Actions Erlang Versions Last Commit


This is the source tree for CutEr, a concolic unit testing tool for Erlang.

CAUTION: This tool is still under heavy development


Copyright 2014-2021 by Aggelos Giantsios, Nikolaos Papaspyrou and Kostis Sagonas.

This program is distributed under the GPL, version 3 or later. Please see the COPYING file for details.


In order to use CutEr, you need the following programs:

  1. Erlang/OTP

Although CutEr may still be working with older Erlang/OTP releases, we only support Erlang/OTP releases 19.x till 22.x. Note that using a pre-built package or binaries will not suffice if the library modules have not been compiled with debug information. In that case, you will need to build and install Erlang/OTP from source.

Download the source code of one of the supported releases of Erlang/OTP or clone the Erlang/OTP github repository:

    git clone

Then follow the instructions in for building and installing Erlang/OTP.

  1. Python 3.x, x >= 6

Download and install the latest Python 3.x distribution.

Also, you need to install the required Python dependencies.

    python3 -m pip install -r requirements.txt

Note that CutEr requires Python 3.6 or higher.

  1. Z3 Theorem Prover

Download the v4.8.8 Z3 release or clone the

tag of Z3 from its git repository with the following command:
    git clone -b z3-4.8.8 --depth 1

For your convenience, we include here a list of commands to build from source and install the above release of Z3:

    cd z3 ; python scripts/
    cd build ; make
    sudo make install

If this sequence of commands does not work for you, follow the instructions in Z3's GitHub repository.

Note that CutEr does not work properly with the v4.8.9 and v4.8.10 releases of Z3 due to this issue, and does not work properly due to the v4.8.7 release of Z3 due to e.g. this issue. It does, however, work well with many previous releases of Z3, for example v4.8.6.

  1. Protocol Buffer Compiler

If you have a Linux or an OSX system then you can skip this step and, after you have downloaded or cloned this repository, you can run the provided
script and follow the instructions.

If you are running on some other OS, download the 3.17.2 version of protoc for your OS and follow the instructions in readme.txt.


  • Download CutEr's sources or clone this repository:

    git clone
    cd cuter
  • [Optional] If you want to run the full test suite of CutEr, you will also need PropEr. You can install it independently or go to CutEr's base directory and run:

    git submodule init && git submodule update
    git submodule foreach make
  • [Optional] If you have not manually downloaded and installed the Protocol Buffer Compiler, run the following script that will fetch it:

  • Configure and compile CutEr. For a default build use:

    ./configure # see Note below
    make depend

[If required] Note that if you have installed protoc using
then you need to specify the path of protoc to the configure script using a command like the following:
    ./configure --with-protoc=$PWD/lib/protoc-3.17.2/bin/protoc
  • [Optional] You can run the unit and functional tests with

    make test
  • [Optional] You can also run Dialyzer with

    make dialyzer
  • Add CutEr's base directory to your Erlang library path by updating the

    environment variable. Just add
    export ERL_LIBS=/full/path/to/cuter:$ERL_LIBS

to your shell startup file (e.g.

for Bash).


Let's say that you have a simple module

that just contains the exported function
. The source file

-spec bar([number()], [number()]) -> number(). bar([], Ys) -> lists:sum(Ys); bar([X|Xs], [Y|Ys]) -> X * Y + bar(Xs, Ys).

For single file tests, such as the above, the simplest way to run CutEr is to use the

script as follows:
./cuter foo bar '[[1], [2]]'

i.e. supply it with three arguments: the module name, the function name, and the list of arguments for the call that will act as a seed for the concolic execution of the unit under test. If there is no

file, the
script will automatically compile the
file and create a .beam file with debug information.

Alternatively, go to the directory of the source file and compile it with debug information:

erlc +debug_info foo.erl

CutEr can then be invoked by calling the

erl -noshell -eval "cuter:run(foo, bar, [[1], [2]])" -s init stop

This will report a list of inputs that lead to runtime errors, for example

foo:bar([0], [])
foo:bar([3,2,1], [0.0,0])

To sum up,

is called as
cuter:run(M, F, As)
  • M
    is the module
  • F
    is the function
  • As
    is the list of arguments of the seed input

There is also a

function that takes these three arguments but also a numeric argument
that denotes the depth of the search (i.e. roughly the number of branches that will be explored). This depth can also be specified as an option of the
./cuter foo bar '[[1], [2]]' -d 42

CutEr provides more API functions that also come with options that control the concolic execution of Erlang programs. These will be explained in a set of forthcoming tutorials. In the meantime, you can find out about them by the command:

./cuter --help

and by browsing the source code of CutEr.

Have fun with the tool!

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.