Collection of APR tools by SAL (Software Analysis Lab) at Korea University.
You can run kaprese
by following the steps below.
kaprese
requires the following software to be installed:
- Python 3.12 or higher (required)
- Docker 24 or higher (recommended, we did not test it on other versions)
kaprese
can be installed via pip
:
pip install kaprese
You can run saver
engine on flint-1
benchmark as follows:
kaprese benchmark preset c
kaprese engine preset saver
kaprese run -b flint-1 spearmint-1 -e saver
# See the logs. If you want to see more logs set LOV_LEVEL environment variable to INFO, e.g.,
# LOG_LEVEL=info kaprese run -b flint-1 spearmint-1 -e saver
kaprese
provides the following options:
Benchmarks | Repository |
---|---|
benchmark |
command to do something about benchmark |
engine |
command to do something about engine |
run |
command to run APR tools on benchmarks |
eval |
command to evaluate the results |
-h , --help |
command to show help |
kaprese
provides a set of benchmarks and engines.
You can register them by calling kaprese benchmark preset <language>
and kaprese engine preset <engine>
.
The following table shows the list of supported benchmarks and engines.
Benchmarks | Repository |
---|---|
c |
C benchmarks in kupl/starlab-benchmarks |
ocaml |
OCaml benchmarks in kupl/starlab-benchmarks |
Engines | Repository |
---|---|
saver |
kupl/SAVER_public |
cafe |
kupl/LearnML |
All benchmarks and engines are registered to the global registry (by default, registry is located in ~/.kaprese
).
You can add your own benchmarks and engines by registering them with a small python code.
A benchmark is an instance of kaprese.core.benchmark.Benchmark
.
You can initialize a benchmark with the following 4 parameters:
name
: name of the benchmark (must be unique).image
: docker image name, e.g.,ghcr.io/kupl/starlab-benchmarks/c:flint-1
.language_command
or_language
: command to find the language of the benchmark, if you set_language
,language_command
is ignored. the command will be run inside the docker container fromimage
.workdir_command
or_workdir
: command to find the working directory of the benchmark, if you set_workdir
,workdir_command
is ignored. the command will be run inside the docker container fromimage
. Then by callingregister
method ofBenchmark
, you can register the benchmark to the global registry.
For example, the following code defines a benchmark named flint-1
:
from kaprese.core.benchmark import Benchmark
flint_1 = Benchmark(
name="flint-1",
image="ghcr.io/kupl/starlab-benchmarks/c:flint-1",
language_command="cat metadata.json | jq -r .language", # c
workdir_command="cd $(cat metadata.json | jq -r .buggyPath) && pwd", # /workspace/buggy
)
flint_1.register()
An engine is an instance of kaprese.core.engine.Engine
.
You can initialize an engine with the following 6 parameters:
name
: name of the engine (must be unique).supported_languages
: list of supported languages, e.g.,["c", "java"]
.supported_os
: list of supported operating systems, e.g.,["ubuntu:20.04", "debian:12"]
.location
: location to the docker context directory of the engine, e.g.,~/saver
.build_args
: arguments to pass todocker build
command to fillARG
variables in the Dockerfile, e.g.,{"SOME_ARG": "some_value"}
.exec_commands
: list of commands to execute the engine, e.g.,["saver ...", "cp ..."]
, all commands are joined with;
, in other words, all commands are executed and the return code of the last command is returned. Note that, your dockerfile MUST gets the benchmark image as an argument and starts build from it, e.g.,
ARG BENCHMARK_IMAGE
FROM ${BENCHMARK_IMAGE}
...
In the same way, you MUST specify the benchmark image as an argument when you build the engine image, e.g.,
from kaprese.core.engine import Engine
saver = Engine(
"saver",
supported_languages=["c"],
supported_os=["ubuntu:20.04"],
location="https://github.com/kupl/kaprese-engines#main:context/saver/starlab-benchmarks", # location of saver context for preset benchmarks
build_args={"BENCHMARK_IMAGE": "ghcr.io/kupl/starlab-benchmarks/c:flint-1"},
exec_commands= ["saver ...", "cp ..."], # see kaprese/engines/saver.py
)
Then by calling register
method of Engine
, you can register the engine to the global registry.
saver.register()
Any contributions are welcome! You can leave an issue or make a pull request.