void abort() { }; /* * Recursive implementation integer addition. * * Author: Matthias Heizmann * Date: 2013-07-13 * */ extern int __VERIFIER_nondet_int(); /*@ requires (1); ensures ((((n < 0) || (\result == ((long long) n + m))) || ((n == 0) && (m == \result)))); @*/ int addition(int m, int n) { if (n == 0) { return m; } if (n > 0) { return addition(m+1, n-1); } if (n < 0) { return addition(m-1, n+1); } } int main() { int m = __VERIFIER_nondet_int(); if (m < 0 || m > 1073741823) { // additional branch to avoid undefined behavior // (because of signed integer overflow) return 0; } int n = __VERIFIER_nondet_int(); if (n < 0 || n > 1073741823) { // 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: {/*@ assert(0); */;abort();} } }