// S : tags sym c $TAGS // S : expect --result valid // S : cc -o test.bc $CC_OPT $file // S : verify --symbolic --solver $solver --sequential $V_OPT test.bc // N : V : CC_OPT : V_OPT : TAGS : RESULT // V : small.10 : -DNUM=10 : : : valid // V : big.1073741823 : -DNUM=1073741823 : : big : valid // V : small.1000 : -DNUM=1000 : : big : valid // V : small.100 : -DNUM=100 : : big : valid extern void __VERIFIER_error() __attribute__ ((__noreturn__)); /* * Recursive implementation integer addition. * * Author: Matthias Heizmann * Date: 2013-07-13 * */ extern int __VERIFIER_nondet_int(void); int addition(int m, int n) { if (n == 0) { return m; } else if (n > 0) { return addition(m+1, n-1); } else { return addition(m-1, n+1); } } int main() { int m = __VERIFIER_nondet_int(); if (m < 0 || m > NUM) { // additional branch to avoid undefined behavior // (because of signed integer overflow) return 0; } int n = __VERIFIER_nondet_int(); if (n < 0 || n > NUM) { // additional branch to avoid undefined behavior // (because of signed integer overflow) return 0; } int result = addition(m,n); if (result == m + n) { return 0; } else { ERROR: __VERIFIER_error(); } }