/* VERIFY_OPTS: --symbolic --sequential */ /* TAGS: sym c */ /* CC_OPTS: */ extern void __VERIFIER_error() __attribute__ ((__noreturn__)); /* * Recursive implementation multiplication by repeated addition * Check that this multiplication is commutative * * Author: Jan Leike * Date: 2013-07-17 * */ // V: small.5 CC_OPT: -DNUM=5 // V: big.100 CC_OPT: -DNUM=100 TAGS: big // V: big.1000 CC_OPT: -DNUM=1000 TAGS: big // V: big.46340 CC_OPT: -DNUM=46340 TAGS: big extern int __VERIFIER_nondet_int(void); // Multiplies two integers n and m int mult(int n, int m) { if (m < 0) { return mult(n, -m); } if (m == 0) { return 0; } return n + mult(n, m - 1); } int main() { int m = __VERIFIER_nondet_int(); if (m < 0 || m > NUM) { return 0; } int n = __VERIFIER_nondet_int(); if (n < 0 || n > NUM) { return 0; } int res1 = mult(m, n); int res2 = mult(n, m); if (res1 != res2 && m > 0 && n > 0) { ERROR: __VERIFIER_error(); } else { return 0; } }