  We present a proof by induction algorithm, which combines k-induction with
invariants to model check embedded C software with bounded and unbounded loops.
The k-induction algorithm consists of three cases: in the base case, we aim to
find a counterexample with up to k loop unwindings; in the forward condition,
we check whether loops have been fully unrolled and that the safety property P
holds in all states reachable within k unwindings; and in the inductive step,
we check that whenever P holds for k unwindings, it also holds after the next
unwinding of the system. For each step of the k-induction algorithm, we infer
invariants using affine constraints (i.e., polyhedral) to specify pre- and
post-conditions. Experimental results show that our approach can handle a wide
variety of safety properties in typical embedded software applications from
telecommunications, control systems, and medical devices; we demonstrate an
improvement of the induction algorithm effectiveness if compared to other
approaches.
