As in the termination category of the
SV-COMP, AProVE
analyzes termination of the main()
function of a C
program. To this end, AProVE uses the
Clang compiler to translate the
C program into a program in the intermediate representation of
LLVM (without compiler
optimizations as these are not sound for termination proving, i.e., the
compiler may remove non-terminating code if this code does not contribute
to the return value of a function). To compile C programs to
LLVM programs, we use the following command:
clang program.c -S -emit-llvm -o program.llvm
This LLVM program is then analyzed for memory safety and
termination. So in contrast to several other termination tools, AProVE
only considers a program as "terminating" if it can also prove its memory
safety.
__VERIFIER_assert
with one argument as assertions
which need to hold for the program to be correct. So if we cannot prove
that whenever an assertion is called, its argument evaluates to 1
(true), we abort the analysis and return MAYBE. Otherwise, our proof of
memory safety also implies satisfaction of all assertions at their
respective program positions.
struct
) yet.
Moreover, the handling of arrays is
restricted to programs where arrays are compiled to pointers in
LLVM. This means that statements like
int* array = alloca(4*sizeof(int))
are supported, but
statements like int array[4]
are not, because these
statements are compiled to an LLVM-specific array data type.
switch
indirectbr
invoke
unwind
va_arg