TypeClone - SVF-tools/SVF GitHub Wiki
TypeClone
TypeClone is implemented in SVF under the name FSTBHC.
Setup
There are two parts to the setup:
- Building SVF.
- Obtaining a
ctir
-capable Clang since FSTBHC requires all bitcode to bectir
-annotated.
SVF
$ git clone https://github.com/SVF-tools/SVF
$ cd SVF
$ . build.sh # See the 'Unit tests' section for info on ctir-related options.
SVF is now ready to use from path/to/SVF/Release-build/bin/wpa
.
ctir
-capable Clang
Build ctir
-Clang:
$ git clone https://github.com/mbarbar/ctir
$ cd ctir
$ # Build following instructions provided by the LLVM project:
# https://clang.llvm.org/get_started.html
OR Download pre-built binaries if using Ubuntu or macOS.
Now the newly built or downloaded clang
/clang++
compilers can be used to build ctir
-annotated LLVM bitcode.
Building software to analyse
To build ctir
-annotated code use the -ctir
option.
For example, clang -ctir -S -emit-llvm program.c
will produce LLVM assembly, program.ll
, ready to be analysed by FSTBHC.
WLLVM can also be used without any friction (errors that -ctir
is an unknown option can be safely ignored).
Analysing
To analyse a program with FSTBHC, without considering reuse:
$ wpa -fstbhc program.ll
To analyse a program with FSTBHC, whilst considering reuse:
$ wpa -fstbhc -tbhc-all-reuse program.ll
To only consider reuse at store instructions (and GEP instructions whose purpose is ultimately a store), replace -tbhc-all-reuse
with -tbhc-store-reuse
:
$ wpa -fstbhc -tbhc-store-reuse program.ll
To print the type graph (text only):
$ wpa -fstbhc -print-dchg program.ll
Unit tests
In Test-Suite, FSTBHC unit tests are available in the fstbhc_tests
directory when building on Linux.
To get the build.sh
script to build and run these tests, build with the CTIR
variable set (e.g. $ CTIR=1 . build.sh
).
This will also download ctir
-capable compilers if CTIR_DIR
is not set (binaries only available for Ubuntu and macOS).
If you do not want build.sh
to download ctir
-Clang binaries, set the CTIR_DIR
variable to point to the directory containing ctir
-capable clang
and clang++
binaries (e.g. $ CTIR=1 CTIR_DIR=/path/to/ctir/build/bin/ . build.sh
).