<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Accurate Dead Code Detection in Embedded C Code by Arithmetic Constraint Solving</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Felix Neubauer</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Karsten Scheibler</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Bernd Becker</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ahmed Mahdiy</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Martin Fra¨nzley</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Tino Teigez</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Tom Bienm u¨llerz</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Detlef Fehrerx</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Chair of Computer Architecture, University of Freiburg</institution>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-Unreachable code fragments in software, despite not having a negative impact on the functional behavior, can have a bad effect in other areas, such as code optimization or coverage-based code validation and certification. Especially the latter is important in industrial, safety critical environments, where detecting such dead code is a major goal to adjust the coverage of software tests. In the context of embedded systems we focus on C programs which are reactive, control-oriented, and floating-point dominated. Such programs are either automatically generated from Simulink-plus-Stateflow models or hand-written according to coding guidelines. While there are various techniques e. g. abstract interpretation or Counterexample guided abstraction refinement (CEGAR) - to deal with individual issues of this domain, there is none which can cover all of them. The AVACS transfer project T1 aims at the combination of these techniques in order to provide an accurate and efficient dead code detection. In this paper we present the ideas and goals of the project as well as the current status (including very promising experimental results) and future challenges.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Index Terms—formal specification, formal verification, SMT,
floating-point, dead code detection, CEGAR, abstract
interpretation</p>
    </sec>
    <sec id="sec-2">
      <title>I. INTRODUCTION</title>
      <p>The occurence of dead (i. e. unreachable) code fragments
in sizable software development projects is a regular
phenomenon – it can be created either intentionally (e. g.
defensive programming) or unintentionally (e. g. reusing of code,
modification of program context) in hand-written programs or
as a byproduct of automated code generation. Although dead
code has no negative impact on the functional behavior of the
software, it can have a bad effect e. g. on code optimization
or coverage-based code validation and certification. Especially
the latter is important in industrial, safety critical
environments, where standards (e. g. ISO 26262) for high-integrity
software demand, among other criteria, reaching a certain test
coverage or the absence of dead code. Obviously the presence
of dead code violates the latter demand but also affects the
interpretation of coverage-based criteria negatively. Therefore
it is a major goal to detect dead code from high-integrity
software and thereby be able to adjust the test coverage.</p>
      <p>The classical dead code detection in compilers is not
suitable to meet these demands. Compilers have to be fast
which does not allow complex dead code analysis at
compiletime, but the analysis itself has to be sound, which means that
only really unreachable code may be marked as dead. The
consequence of this tradeoff is a vastly incomplete detection,
where substantial amounts of dead code are not discovered.
In our use cases we also need a sound method to securely
detect dead code, but additionally it has to be highly accurate
with respect to both the amount (enhancing the interpretation
of the test coverage) and localization (approching the demand
of dead code free programs) of the dead code detected.</p>
      <p>In the context of embedded systems our focus lies on
reactive, control-oriented, and floating-point dominated C
programs, in particular those automatically generated from
Simulink-plus-Stateflow models of embedded control
applications or those hand-written according to coding guidelines.
Dead code detection in this domain is quite difficult because
there might be no clear distinction between control and data
in the C code. Considering automatically generated code this
lack of distinction is caused by encoding the major part of
the model’s control flow into the data part of the C code.
Hand-written embedded control software on the other hand
often has a central control loop which defers obligations to a
set of dedicated handlers. Some of these handlers are generic,
offering both a state and data dependent control flow. This
construction also blurs the distinction between control and
data. An additional difficulty is the dependency of the control
flow on complex floating-point computations.</p>
      <p>The development of a method to handle these challenges,
namely:
(1) handling the lack of distinction between control and data
(2) dealing with the dominant impact of (often non-linear)
floating-point computations on the reachability of code
(3) scaling to industrial-size programs
is the main goal of the AVACS1 transfer project T1. This
project is a transregional collaboration between the University
of Freiburg2, the Carl von Ossietzky University of Oldenburg3
and the industrial partners BTC Embedded Systems AG4 in</p>
    </sec>
    <sec id="sec-3">
      <title>1http://www.avacs.org 2http://ira.informatik.uni-freiburg.de 3https://www.uni-oldenburg.de/hs 4https://www.btc-es.de</title>
      <p>Oldenburg and Sick AG5 in Waldkirch.</p>
      <p>
        There are various techniques which are able to deal with
individual issues of the list above. Abstract interpretation (AI)
[
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]–[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] can handle very large programs (3), but lacks exactness
when the data part of the state space can be fractioned
and reshuffled more or less arbitrarily by data operations.
Counterexample guided abstraction refinement (CEGAR) [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]–
[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] is often able to create concise abstractions of the
interplay of control and data (1) but is currently limited to the
analysis of either programs with confined arithmetic
fragments (mostly linear) or of complete hybrid systems with
tiny control skeletons. Regarding the second issue there was
much progress lately in the field of non-linear arithmetic
constraint solving based on conflict-driven clause learning over
arithmetic theories (CDCL(T)) [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. It is now possible to
solve extremely large arithmetic constraint systems including
a complex Boolean structure and linear, polynomial and even
transcendental arithmetic. But there is no support for loops in
the control flow and the method does not scale well enough
for complex programs with a full branching structure.
      </p>
      <p>The transfer project aims at the combination of those
techniques in order to handle all required challenges and to
provide an accurate and efficient dead code detection. This
paper presents the current status of the project, ideas and
possible solutions to unresolved issues and further challenges.</p>
      <p>Structure of the paper: After introducing the goals and
challenges of the AVACS transfer project in the current section,
we describe the model checking-based tool chain for structural
code coverage analysis of BTC Embedded Systems in Section
II. In Section III we speak about the integration of our
SMTsolver iSAT3 as an alternative backend solver into this tool
chain and the experimental results vs. the standard backend
solver. Section IV gives an outlook about future challenges,
before Section V concludes this paper.</p>
    </sec>
    <sec id="sec-4">
      <title>II. MODEL CHECKING-BASED TOOL CHAIN FOR</title>
      <p>STRUCTURAL CODE COVERAGE ANALYSIS</p>
      <p>
        One of the most prominent test criteria for production code
in industrial and in particular safety-critical domains relies on
structural code coverage such as function, statement, branch,
and condition coverage or MC/DC [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. Such coverage is
often measured on a percentage basis by means of program
simulations stimulated by so-called test cases or vectors,
i. e. the number of tested coverage goals relative to the number
of all goals. Intuitively, the higher the code coverage the
higher the test confidence and thus the lower the probability
of undetected software bugs.
      </p>
      <p>In the following, we describe by way of example a typical
tool chain for automatic analysis of code coverage being based
on model checking backend tools.</p>
      <p>
        In Listing 1, a small excerpt of a C code under test is given.
Though – for illustration reasons – the code fragment is rather
simple, it however contains some frequent code constructs
occuring in practice which need to be handled within the tool
5https://www.sick.com
1 #include &lt;math.h&gt;
2
3 typedef struct { double x, y; } point_t;
4
5 double distance(int length, point_t p[]) {
6 double sum = 0;
7 unsigned int i;
8 for (i = 0; i &lt; length-1; i++) {
9 sum += sqrt((p[i].x - p[i+1].x) * (p[i].y - p[i+1].y)
);
10 }
11 return sum;
12 }
13
14 unsigned char step(int length, point_t p_array[]) {
15 double dist_value = distance(length, p_array);
16 unsigned char dist_level_ok;
17 if (dist_value &lt;= 10.0) {
18 dist_level_ok = 0;
19 } else {
20 dist_level_ok = 1;
21 }
22 return dist_level_ok;
23 }
24
25 point_t p_array[
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]; // inputs
26 unsigned char dist_level_ok; // output
27
28 int main(void) {
29 while (1) {
30 // receive inputs: p_array
31 dist_level_ok = step(3, p_array);
32 // transmit outputs: dist_level_ok
33 // wait for next iteration
34 }
35 }
      </p>
      <p>Listing 1. example 1 orig.c
chain. The “main”-function sketches a typical reactive program
with an unbounded feedback loop: first, all input data for the
current iteration or step are received, then the actual function
is executed, and finally the computed outputs are transmitted.
Thereafter the program waits for the next loop iteration.</p>
      <p>In each step, the “step”-function takes an array of three
two-dimensional points (modelled by struct type “point t”
consisting of two variables of scalar type “double”) as input
and returns, whether the level of the aggregated distance of
consecutive points is okay or not.</p>
      <p>Please note that the C code contains several floating-point
computations and, moreover, relies on the function “sqrt” from
the standard C library “math.h”. This actually is representative
as there is an increasing trend of using floating-point
processors and production code in industrial applications.</p>
      <p>With regard to the use of the “math.h” library, we remark
that there are two major ways of dealing with such complex
mathematical functions such as “sqrt” in a model checking
context: first, the production code itself resolves the
problem, namely by reducing such complex functions to basic
operations, or, second, to keep these functions in the code
and apply a model checker that has dedicated support for
such complex functions. Concerning performance, the second
option has a clear benefit over the first one as implementations
of mathematical functions are frequently very complex and
contain several hundreds lines of code. A model checker
with native “math.h” support can exploit dedicated algorithms
which are generally much more efficient. In the following, we
assume a model-checking backend tool that is able to handle
the function “sqrt”.</p>
      <p>In the first step of the tool chain for analyzing code
coverage, we need to annotate the original program with
additional constructs to automatically deal with code coverage
metrics. In our example we concentrate on statement coverage
and – for the sake of simplicity – we just aim at covering
the statements in lines 18 and 20. For the purpose of
observing the reachability of the corresponding lines, two new
variables “LINE X REACHED”, “LINE Y REACHED” are
introduced. Listing 2 shows the neccessary changes for one
possible annotation method.</p>
      <p>[...]
// new observer variables for coverage
unsigned char LINE_X_REACHED = 0;
unsigned char LINE_Y_REACHED = 0;
[...]
if (dist_value &lt;= 10.0) {</p>
      <p>LINE_X_REACHED = 1;
dist_level_ok = 0;
} else {</p>
      <p>LINE_Y_REACHED = 1;
dist_level_ok = 1;</p>
      <p>After this annotation with coverage goals, normally the C
code is translated to an intermediate language called SMI
(which is a C-like programming language). To keep this
example simple, we skip this translation and explain the further
steps on C code also.</p>
      <p>The original code is now instrumented in such a way that
automatic analysis w. r. t. code coverage by a model checker
is rendered possible. In order to reach the input language
of a model checker, e. g. a declarative, logical description
as in a SAT or SMT solver, the instrumented code needs to
be transformed into a syntactically simpler form. Two usual
transformation steps are the following:
function calls are resolved
complex structural data types are flattened</p>
      <p>Usually, a model checker is called separately per proof
obligation, in our context per coverage goal. To further
optimize the code in that respect, a cone-of-influence reduction
is performed, i. e. all code fragments that do not directly
or indirectly influence the state of the corresponding goal
expression are removed. Listing 3 shows the result of the two
transformation steps mentioned above as well as an example
for the cone of the goal “variable LINE X REACHED
becomes 1”.</p>
      <p>Depending on the capabilities and requirements of the
concrete model checker, further transformations might be applied,
such as:
loop unwinding (naive or optimized; see Listing 4 for the
optimized variant)
static single assignment form, cf. Listing 5</p>
      <p>The resulting code in static single assignment form can
then be translated in a rather simple way into a corresponding
SMT formula (k) with loop iteration depth k such that the
following property holds:</p>
      <p>Property 1: The goal “variable LINE X REACHED
becomes 1” is covered within k steps (meaning that the statement
in line 18 of the original code is reached) if and only if the
SMT formula (k) is satisfiable.</p>
      <p>One very important feature of the above approach is that a
satisfying assignment of (k) corresponds to a test case of the
original program that proves coverage of the corresponding
goal. We remark that construction of such a test case is a
layered approach starting from the satisfying assignment of
the lowermost SMT layer up to the original C code layer.</p>
      <p>If it turns out that the SMT formula (k) is unsatisfiable
then the corresponding coverage goal is unreachable within k
iterations. This may be a hint for dead code.</p>
      <p>BTC Embedded Systems solves the SMT formula (k)
with the BMC solver CBMC in the backend using k-induction
to perform unreachability proofs. In the following section
we will use the interval constraint solver iSAT36 with Craig
interpolation as backend solver and compare it to CBMC. The
iSAT algorithm was developed in AVACS project H1/2.</p>
    </sec>
    <sec id="sec-5">
      <title>III. ISAT3 AS BACKEND SMT-SOLVER</title>
      <p>While SAT solving aims at finding solutions for
propositional formulas (or proving the absence thereof), SMT aims at
solving boolean combinations of so-called theory atoms. Such
atoms may for example contain linear arithmetic over the reals
or constraints involving floating-point arithmetic.</p>
      <p>In eager SMT the Boolean structure as well as all theory
atoms are translated into one big propositional formula. A SAT
solver is then called once in order to determine whether there
is a solution or not. This approach is also called bit-blasting.
While it is in general not applicable to all theories, it is up to
now the most prominent approach for SMT solvers addressing
floating-point arithmetic – e.g. Z37, Mathsat8 and CBMC9 rely
on this technique.</p>
      <p>When doing SMT lazily, the formula is split into a set of
theory atoms and a Boolean skeleton which abstracts the
truthvalues of the theory atoms with Boolean literals. The Boolean
skeleton is processed by a SAT-solver in order to search for
a satisfying assignment. If such an assignment is found, a
separate theory solver is used to check whether the theory
atoms are consistent under the truth values determined by
6https://projects.informatik.uni-freiburg.de/projects/isat3
7https://github.com/Z3Prover/z3/
8http://mathsat.fbk.eu/
9http://www.cprover.org/cbmc/
the SAT-solver. In case of an inconsistency, the theory solver
identifies an infeasible subset of the theory atoms which is
then encoded into a clause and added to the Boolean skeleton.
Thus, in lazy SMT the SAT solver is called multiple times
and operates together with a theory solver in order to refine
the Boolean skeleton incrementally. Therefore, this scheme is
also abbreviated as DPLL(T) or CDCL(T) – with T being the
theory used within the atoms.</p>
      <p>
        In contrast to CDCL(T), the iSAT algorithm [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]
does not have such a separation between the SAT and the
theory part. Instead, interval constraint propagation (ICP, see
e. g. [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]) is tightly integrated into the CDCL framework in
order to reason about the theory atoms directly – yielding
a unified lattice-based view in the meantime also known as
abstract conflict-driven clause learning (ACDCL) [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ].
      </p>
      <p>
        In this paper we build on the third implementation of
the iSAT algorithm which is called iSAT3 [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]. The
search process in iSAT is similar to CDCL: it consists of
alternating propagation and decision phases interspersed with
the resolution of conflicts – but additionally, the first two
phases are extended with ICP and interval splits. Similar
to CDCL-based SAT solvers which operate on a conjuctive
normal form (CNF), iSAT operates on a CNF as well – but
enriched with so-called primitive constraints (PCs) which are
the result of a Tseitin-like transformation of the original theory
atoms. This transformation ensures that each PC contains
only one arithmetic operation – which helps to keep the ICP
contractors for each PC-type simple.
      </p>
      <p>
        Thus, ICP contractors are responsible for performing the
arithmetic reasoning. Adding support for new operations
essentially requires adding further ICP contractors. Recently,
we adapted iSAT3 in order to support accurate reasoning
for floating-point arithmetic [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. Somewhat earlier, another
ICP-based decision procedure for floating-point arithmetic was
proposed in [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. But in contrast to [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], our approach also
contains support for bitwise integer operations – as C programs
usually contain a mix of floating-point arithmetic, integer
arithmetic and bitwise integer operations. This allows iSAT3 to
be used as the first non-bit-blasting SMT solver for automatic
dead-code detection in floating-point dominated embedded C
programs. Thus, we did a prototypical integration of iSAT3
into the tool chain explained in Section II.
      </p>
      <p>Supporting the floating-point domain also affects the
completeness of the ICP-based decision procedure. While ICP
reasoning is in general incomplete on real arithmetics, it gains
completeness in the finite floating-point domain.</p>
      <p>
        In the following we give a summary of the experiments
performed in [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. We relied on a set of benchmarks which
originate from TargetLink10-generated production C code
(compiled from Simulink-Stateflow models) containing
floatingpoint arithmetic and integer arithmetic as well as casts between
these two domains. Each single benchmark represents a goal
defined by a structural code coverage metrics like MC/DC. The
industrial-strength embedded test-vector generation toolBTC
10http://www.dspace.com/en/pub/home/products/sw/pcgs/targetli.cfm
EmbeddedTester R preprocesses and translates the original C
code (which is annotated with coverage goals) into the
intermediate SMI language as explained in Section II.
      </p>
      <p>
        In our measurements, we used the version of SMI-CBMC
which is part of BTC EmbeddedTester R 3.4 (July 2014).
SMICBMC supports incremental BMC [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] and relies on CBMC
4.811 as its backend. But due to technical reasons the current
version of SMI-CBMC does not support incremental solving
in combination with k-induction.
      </p>
      <p>Similar to SMI-CBMC, SMI-iSAT3 operates on SMI files
as well. It is a prototypical implementation which runs in
a Cygwin environment and uses a bunch of wrapper scripts
in order to (1) translate the given SMI file into the iSAT3
input language, and to (2) validate every satisfying assignment
found by iSAT3 by an SMI simulator. All experiments were
performed on an Intel Core i7-2600 with 3.4 GHz and 8 GB
RAM under Windows 7 (64 bit). We set a time limit of 60
seconds per benchmark. Setting a memory limit within the
Cygwin environment did not work properly. Therefore, we
omitted such a limit.</p>
      <p>0</p>
      <p>The benchmarks are encoded as BMC problems. For both
solvers we allowed up to 51 BMC unwindings per benchmark.
The results are shown in Figure 1. The diagram depicts the
number of solved benchmarks together with the run time
needed per benchmark. In the table, the columns S+U, SAT,
U51 and U1 show the number of solved instances (SAT:
satisfiable; U51: unsatisfiable until depth 51; U1: unsatisfiable
for all depths proved with k-induction or Craig interpolation;
S+U: SAT + U51 + U1). The column TO shows the number
of aborted benchmarks due to a timeout.</p>
      <p>In order to detect unreachability (e. g. dead-code), CBMC
uses k-induction, while iSAT3 uses Craig interpolation. Both
solvers perform equally well when counting the number of
solved satisfiable instances. The picture changes when looking
11http://www.cprover.org/svn/cbmc/releases/cbmc-4.8-incremental/
SMI-CBMC
SMI-iSAT3
60s
40s
e
m
i</p>
      <p>T
20s
0s
at the number of solved U1 instances – which are of special
interest in the context of dead-code detection. Here,
SMIiSAT3 proves for 831 instances that the code fragment of
interest is unreachable, which is an improvement of 30%
compared to the 631 instances found by SMI-CBMC.
Similarly, the number of solved U51 instances is higher in
SMIiSAT3: 172 compared to 44. Furthermore, when looking at the
accumulated number of solved instances, SMI-iSAT3 solves
331 instances more than SMI-CBMC.</p>
      <p>Due to the prototypical Cygwin-based integration,
SMIiSAT3 has some sort of initial runtime-offset (as revealed by
the diagram in Figure 1). Despite this penalty SMI-iSAT3
outperforms SMI-CBMC in terms of runtime. E. g. when
considering the instances which were solved within 3 seconds
then SMI-CBMC solved 5305 such instances, while
SMIiSAT3 finished 6960.</p>
    </sec>
    <sec id="sec-6">
      <title>IV. FUTURE CHALLENGES While our current method is already able to cover one part of the goals of the transfer project, there are still open challenges to be solved.</title>
      <p>A. Counterexample Guided Abstraction Refinement</p>
      <p>
        CEGAR [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] is found to be useful in model checking while
verifying large problems since its abstraction maps complex
system models with infinite states to simpler ones (e. g. finite
Kripke structures); thus it circumvents the state-space
explosion problem. In our proposed approach, CEGAR starts from
a simple initial abstract model representing the control flow
of the original program which will be continuously refined
based on model checking the abstraction and analysing the
counterexamples generated by the model checker. In each
refinement step, either an erroneous counterexample will be
eliminated by attaching – to the abstract model – sufficient
predicates obtained from the stepwise interpolants as proposed
in lazy abstraction technique [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], or a real counterexample
is found. This continuous refinement is feasible despite
nonpolynomial arithmetic as the floating-point numbers are from
a large but finite domain.
      </p>
      <p>
        Craig interpolation (CI) thus is our workhorse for
abstraction refinement in the CEGAR loop. In conjunction with
CEGAR, in software verification with lazy abstraction
technique [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], stepwise interpolants are used to extract
meaningful predicates from infeasible error paths, where the resultant
interpolants are used to refine the abstract model. This ensures
that the interpolants at the different control locations achieve
the goal of providing a precision that eliminates the infeasible
error path from further explorations.
      </p>
      <p>
        CEGAR has been applied successfully in the context of
programs [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], real time systems [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ] and hybrid systems [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ].
Moreover, CI-based CEGAR is standard in the domain of
software model-checking, but current approaches are confined
only to linear arithmetics or polynomials. However, what sets
our method aside is that it applies Craig interpolation to
learn concise reasons for a counterexample being spurious
despite its rich, non-polynomial arithmetic domain as we
use iSAT as a backend solver where the latter handles the
non-polynomiality by integrating CDCL(T) with ICP in one
framework as aforementioned.
      </p>
      <sec id="sec-6-1">
        <title>B. Handling of Interrupts</title>
        <p>As the transfer project aims at covering analysis of
handwritten embedded C code also, the ability to deal with the
implicit transfer of control flow mediated by external interrupts
is of importance, as interrupt handlers are a traditional means
of ensuring reactivity to asynchronous events. The specific
problem here is that in contrast to the control flow mediated by
explicit control structures, interrupts can divert the control flow
at any time. Analyzing such code by means of symbolic path
enumeration in SMT-based bounded model checking would be
prohibitively expensive due to the enormous branching width
of the computation tree induced by unconstrained interrupts.
To handle this problem, we are setting out to combine a
number of techniques, the two most prominent of which are
described in the following.</p>
        <p>Semantics-preserving restriction of interrupt points: As
interrupt handlers in embedded software tend to share only a
small set of global variables with the main program, extensive
assignment sinking or lifting is possible between statements
in the main program and the interrupt routine. This implies
that formally possible interrupt points can be eliminated from
the analysis, as the execution sequences are confluent with
those obtained from somewhat earlier or later interrupts. The
analysis can thus w. l. o. g. confine control flow to interrupts
happening at a limited subset of the factually possible interrupt
points, e. g. just before the main program reads variables
affected by the interrupt handler. This reduction reduces
branching in the execution tree and helps SMT-based analysis.</p>
        <p>Computation of summaries for interrupt routines: In order
to accelerate analysis of the possible effect of interrupts on
the main program’s control flow (and thus, code reachability),
we will take advantage of summaries for interrupt routines
obtained using abstract interpretation and inter-procedural
analysis. Abstract interpretation here is based on exploiting
iSAT’s floating-point and integer domains as abstract domains
and iSAT’s corresponding contractors as abstract transformers
when analyzing straight-line code. Inter-procedural (or
interinterrupt-handler) analysis is then achieved by mutually using
abstract interpretation on the individual interrupt handlers to
compute safe approximations of the possible return values
based on (over-approximate) knowledge of the possible entry
values and on the main program to compute safe
approximations of the possible entry values to interrupt handlers based on
(over-approximate) knowledge of the possible return values.</p>
        <p>The summaries thus obtained will later be exploited in
the exact SMT-based analysis, where they can prune the
search space tremendously before unfolding detailed statement
sequences across interrupts.</p>
      </sec>
      <sec id="sec-6-2">
        <title>C. Solver Improvements</title>
        <p>Currently iSAT3 only supports floating-point reasoning for
the basic arithmetic operations (Addition, Subtraction,
Multiplication and Division). In the industrial context the support
of more complex arithmetic operations such as exp, sin, cos,
sqrt is mandatory and should be included in the current solver.
Implementing these operations in iSAT3 might also have an
advantage compared to bit-blasting solutions since in the latter
context all those operations have to be translated into one big
propositional formula while iSAT3 can handle them on the
arithmetic level.</p>
        <p>
          Alongside k-induction (CBMC) and Craig interpretation
(iSAT3) there exist other techniques (e. g. IC3 [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ], [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ]) to
prove the unreachability of code fragments. These may have
some advantages over the currently used ones which may
result in a larger number of successful unreachability proofs
– or different instances which may complement and improve
the results of the current techniques.
        </p>
        <p>
          Symbolic Computation methods (such as Gro¨ bner bases
[
          <xref ref-type="bibr" rid="ref25">25</xref>
          ], virtual substitution [
          <xref ref-type="bibr" rid="ref26">26</xref>
          ], [
          <xref ref-type="bibr" rid="ref27">27</xref>
          ] or cylindrical algebraic
decomposition (CAD) [
          <xref ref-type="bibr" rid="ref28">28</xref>
          ]) might also be beneficial in the
context of floating-point reasoning. Especially for more
complex arithmetic expressions these techniques might be able to
(approximately) guide ICP during the search for a solution.
        </p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>V. CONCLUSION</title>
      <p>The AVACS transfer project T1 aims at a method for
accurate dead code detection in embedded C code using arithmetic
constraint solving. While in the target domain of reactive,
control-oriented, and floating-point dominated embedded C
programs several methods exist to deal with parts of the
difficulties induced by this domain, there is none which can
cover all of them. Thus a combination of these techniques as
a solution seems obvious.</p>
      <p>As a first step we integrated iSAT3 (with added support for
floating-point arithmetic and Craig interpolation) into the tool
chain of BTC Embedded Systems as an alternative backend
solver. This allows us to perform code coverage analysis on
automatically generated C code of industrial size including
floating-point operations. The experimental results show, that
iSAT3 is competitive in this environment – it is even able to
prove more code fragments of interest as unreachable.</p>
      <p>To tackle the remaining challenges of the transfer project
there is work in progress concerning CEGAR and interrupt
handling. Furthermore there are some ideas to improve the
current method.</p>
    </sec>
    <sec id="sec-8">
      <title>ACKNOWLEDGMENT</title>
      <p>This work has been supported by the German Research
Foundation (DFG) as part of the Transregional Collaborative
Research Center “Automatic Verification and Analysis of
Complex Systems” (DFG, SFB/TR 14 AVACS).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>P.</given-names>
            <surname>Cousot</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Cousot</surname>
          </string-name>
          , “
          <article-title>Abstract Interpretation: A Unified Lattice Model for Static Analysis of Programs by Construction or Approximation of Fixpoints,” in Proceedings of the 4th ACM SIGACTSIGPLAN Symposium on Principles of Programming Languages, ser</article-title>
          .
          <source>POPL '77</source>
          . New York, NY, USA: ACM,
          <year>1977</year>
          , pp.
          <fpage>238</fpage>
          -
          <lpage>252</lpage>
          . [Online]. Available: http://doi.acm.
          <source>org/10</source>
          .1145/512950.512973
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2] --, “
          <article-title>Abstract interpretation and application to logic programs</article-title>
          ,”
          <source>The Journal of Logic Programming</source>
          , vol.
          <volume>13</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>103</fpage>
          -
          <lpage>179</lpage>
          ,
          <year>1992</year>
          . [Online]. Available: http://www.sciencedirect.com/science/article/ pii/0743106692900307
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>J. Julien</given-names>
            <surname>Bertrane</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Cousot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Cousot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Feret</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Mauborgne</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Mine´, and
          <string-name>
            <given-names>X.</given-names>
            <surname>Rival</surname>
          </string-name>
          , “
          <article-title>Static Analysis by Abstract Interpretation of Embedded Critical Software,” SIGSOFT Softw</article-title>
          .
          <source>Eng. Notes</source>
          , vol.
          <volume>36</volume>
          , no.
          <issue>1</issue>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>8</lpage>
          , Jan.
          <year>2011</year>
          . [Online]. Available: http: //doi.acm.
          <source>org/10</source>
          .1145/1921532.1921553
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>P.</given-names>
            <surname>Cousot</surname>
          </string-name>
          ,
          <article-title>Formal Verification by Abstract Interpretation</article-title>
          . Berlin, Heidelberg: Springer Berlin Heidelberg,
          <year>2012</year>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>7</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>E. M.</given-names>
            <surname>Clarke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Grumberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Jha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Lu</surname>
          </string-name>
          , and
          <string-name>
            <given-names>H.</given-names>
            <surname>Veith</surname>
          </string-name>
          , “
          <article-title>Counterexample-guided abstraction refinement</article-title>
          ,” in Computer Aided Verification, 12th International Conference,
          <string-name>
            <surname>CAV</surname>
          </string-name>
          <year>2000</year>
          , Chicago, IL, USA, July
          <volume>15</volume>
          -
          <issue>19</issue>
          ,
          <year>2000</year>
          , Proceedings, ser. Lecture Notes in Computer Science,
          <string-name>
            <given-names>E. A.</given-names>
            <surname>Emerson</surname>
          </string-name>
          and
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Sistla</surname>
          </string-name>
          , Eds., vol.
          <source>1855</source>
          . Springer,
          <year>2000</year>
          , pp.
          <fpage>154</fpage>
          -
          <lpage>169</lpage>
          . [Online]. Available: http://dx.doi.org/10.1007/10722167 15
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>E.</given-names>
            <surname>Clarke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Grumberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Jha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Lu</surname>
          </string-name>
          , and
          <string-name>
            <given-names>H.</given-names>
            <surname>Veith</surname>
          </string-name>
          , “
          <article-title>Counterexampleguided Abstraction Refinement for Symbolic Model Checking,”</article-title>
          <string-name>
            <surname>J. ACM</surname>
          </string-name>
          , vol.
          <volume>50</volume>
          , no.
          <issue>5</issue>
          , pp.
          <fpage>752</fpage>
          -
          <lpage>794</lpage>
          , Sep.
          <year>2003</year>
          . [Online]. Available: http://doi.acm.
          <source>org/10</source>
          .1145/876638.876643
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>R.</given-names>
            <surname>Alur</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Dang</surname>
          </string-name>
          , and
          <string-name>
            <given-names>F.</given-names>
            <surname>Ivancic</surname>
          </string-name>
          , “
          <article-title>Counter-Example Guided Predicate Abstraction for Hybrid Systems,” in Tools and Algorithms for the Construction and Analysis of Systems, ser</article-title>
          . LNCS,
          <string-name>
            <given-names>H.</given-names>
            <surname>Garavel</surname>
          </string-name>
          and J. Hatcliff, Eds., vol.
          <volume>2619</volume>
          . Springer,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>M.</given-names>
            <surname>Fra</surname>
          </string-name>
          ¨nzle, C. Herde,
          <string-name>
            <given-names>T.</given-names>
            <surname>Teige</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ratschan</surname>
          </string-name>
          , and T. Schubert, “
          <article-title>Efficient solving of large non-linear arithmetic constraint systems with complex boolean structure</article-title>
          ,
          <source>” Journal on Satisfiability, Boolean Modeling, and Computation</source>
          , vol.
          <volume>1</volume>
          , no.
          <issue>3-4</issue>
          , pp.
          <fpage>209</fpage>
          -
          <lpage>236</lpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>J. G.</given-names>
            <surname>Cleary</surname>
          </string-name>
          , “Logical arithmetic,
          <source>” Future Computing Systems</source>
          , vol.
          <volume>2</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>125</fpage>
          -
          <lpage>149</lpage>
          ,
          <year>1987</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>H. Kelly J.</surname>
          </string-name>
          , V. Dan S.,
          <string-name>
            <surname>C. John J.,</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Leanna</surname>
          </string-name>
          <string-name>
            <surname>K.</surname>
          </string-name>
          , “
          <article-title>A practical tutorial on modified condition/decision coverage,”</article-title>
          <string-name>
            <surname>Tech. Rep.</surname>
          </string-name>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>C.</given-names>
            <surname>Herde</surname>
          </string-name>
          , “
          <article-title>Efficient solving of large arithmetic constraint systems with complex boolean structure: proof engines for the analysis of hybrid discrete-continuous systems</article-title>
          ,
          <source>” Ph.D. dissertation</source>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>F.</given-names>
            <surname>Benhamou</surname>
          </string-name>
          and
          <string-name>
            <given-names>L.</given-names>
            <surname>Granvilliers</surname>
          </string-name>
          , “
          <article-title>Continuous and Interval Constraints,” in Handbook of Constraint Programming, ser</article-title>
          .
          <source>Foundations of Artificial Intelligence</source>
          ,
          <year>2006</year>
          , pp.
          <fpage>571</fpage>
          -
          <lpage>603</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          , V.
          <string-name>
            <surname>D'Silva</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Haller</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Griggio</surname>
            , and
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Kroening</surname>
          </string-name>
          , “
          <article-title>An abstract interpretation of DPLL(T),” in VMCAI 2013</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>K.</given-names>
            <surname>Scheibler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Kupferschmid</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Becker</surname>
          </string-name>
          , “
          <article-title>Recent improvements in the SMT solver iSAT</article-title>
          ,” in MBMV,
          <year>2013</year>
          , pp.
          <fpage>231</fpage>
          -
          <lpage>241</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>K.</given-names>
            <surname>Scheibler</surname>
          </string-name>
          and
          <string-name>
            <given-names>B.</given-names>
            <surname>Becker</surname>
          </string-name>
          , “
          <article-title>Using interval constraint propagation for pseudo-boolean constraint solving,” in FMCAD 2014</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>K.</given-names>
            <surname>Scheibler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Neubauer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mahdi</surname>
          </string-name>
          , M. Fra¨nzle, T. Teige, T. Bienm u¨ller,
          <string-name>
            <given-names>D.</given-names>
            <surname>Fehrer</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Becker</surname>
          </string-name>
          , “
          <article-title>Accurate ICP-based Floating-Point Reasoning,” in Formal Methods in Computer-Aided Design</article-title>
          ,
          <string-name>
            <surname>FMCAD</surname>
          </string-name>
          <year>2016</year>
          . IEEE,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          , V.
          <string-name>
            <surname>D'Silva</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Griggio</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Haller</surname>
            , and
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Kroening</surname>
          </string-name>
          , “
          <article-title>Deciding floating-point logic with abstract conflict driven clause learning,” Formal Methods in System Design</article-title>
          , vol.
          <volume>45</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>213</fpage>
          -
          <lpage>245</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>P.</given-names>
            <surname>Schrammel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kroening</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Martins</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Teige</surname>
          </string-name>
          , and T. Bienm u¨ller, “
          <article-title>Successful use of incremental BMC in the automotive industry,” in FMICS 2015</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>T. A.</given-names>
            <surname>Henzinger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Jhala</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Majumdar</surname>
          </string-name>
          , and G. Sutre, “Lazy abstraction,
          <source>” in Conference Record of POPL</source>
          <year>2002</year>
          :
          <article-title>The 29th SIGPLANSIGACT Symposium on Principles of Programming Languages, Portland</article-title>
          ,
          <string-name>
            <surname>OR</surname>
          </string-name>
          , USA, January
          <volume>16</volume>
          -
          <issue>18</issue>
          ,
          <year>2002</year>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Launchbury</surname>
          </string-name>
          and J. C. Mitchell, Eds. ACM,
          <year>2002</year>
          , pp.
          <fpage>58</fpage>
          -
          <lpage>70</lpage>
          . [Online]. Available: http://doi.acm.
          <source>org/10</source>
          .1145/503272.503279
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>D.</given-names>
            <surname>Beyer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. A.</given-names>
            <surname>Henzinger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Jhala</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Majumdar</surname>
          </string-name>
          , “
          <article-title>The software model checker blast</article-title>
          ,
          <source>” STTT</source>
          , vol.
          <volume>9</volume>
          , no.
          <issue>5-6</issue>
          , pp.
          <fpage>505</fpage>
          -
          <lpage>525</lpage>
          ,
          <year>2007</year>
          . [Online]. Available: http://dx.doi.org/10.1007/s10009-007-0044-z
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>T.</given-names>
            <surname>Nagaoka</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Okano</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Kusumoto</surname>
          </string-name>
          , “
          <article-title>An abstraction refinement technique for timed automata based on counterexample-guided abstraction refinement loop</article-title>
          ,
          <source>” IEICE Transactions</source>
          , vol. 93-D, no.
          <issue>5</issue>
          , pp.
          <fpage>994</fpage>
          -
          <lpage>1005</lpage>
          ,
          <year>2010</year>
          . [Online]. Available: http://search.ieice.org/bin/ summary.php?
          <source>id=e93-d 5 994</source>
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>P. S.</given-names>
            <surname>Duggirala</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Tiwari</surname>
          </string-name>
          , “
          <article-title>Safety verification for linear systems</article-title>
          ,”
          <source>in Proceedings of the International Conference on Embedded Software, EMSOFT</source>
          <year>2013</year>
          , Montreal, QC, Canada, September 29 - Oct.
          <volume>4</volume>
          ,
          <year>2013</year>
          . IEEE,
          <year>2013</year>
          , pp.
          <volume>7</volume>
          :
          <fpage>1</fpage>
          -
          <lpage>7</lpage>
          :
          <fpage>10</fpage>
          . [Online]. Available: http://dx.doi.org/10.1109/EMSOFT.
          <year>2013</year>
          .6658585
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>A. R.</given-names>
            <surname>Bradley</surname>
          </string-name>
          , “
          <article-title>Sat-based model checking without unrolling</article-title>
          ,” in Verification, Model Checking, and
          <string-name>
            <surname>Abstract</surname>
          </string-name>
          Interpretation - 12th International Conference, VMCAI 2011, Austin, TX, USA, January
          <volume>23</volume>
          -
          <issue>25</issue>
          ,
          <year>2011</year>
          . Proceedings, ser. Lecture Notes in Computer Science,
          <string-name>
            <given-names>R.</given-names>
            <surname>Jhala</surname>
          </string-name>
          and
          <string-name>
            <given-names>D. A.</given-names>
            <surname>Schmidt</surname>
          </string-name>
          , Eds., vol.
          <volume>6538</volume>
          . Springer,
          <year>2011</year>
          , pp.
          <fpage>70</fpage>
          -
          <lpage>87</lpage>
          . [Online]. Available: http://dx.doi.
          <source>org/10.1007/978-3-642-18275-4 7</source>
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          , V.
          <string-name>
            <surname>D'Silva</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Griggio</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Haller</surname>
            , and
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Kroening</surname>
          </string-name>
          ,
          <article-title>Interpolation-Based Verification of Floating-Point Programs with Abstract CDCL</article-title>
          . Berlin, Heidelberg: Springer Berlin Heidelberg,
          <year>2013</year>
          , pp.
          <fpage>412</fpage>
          -
          <lpage>432</lpage>
          . [Online]. Available: http://dx.doi.
          <source>org/10.1007/ 978-3-642-38856-9 22</source>
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>T.</given-names>
            <surname>Becker</surname>
          </string-name>
          and
          <string-name>
            <given-names>V.</given-names>
            <surname>Weispfenning</surname>
          </string-name>
          ,
          <article-title>Gr o¨bner bases: a computational approach to commutative algebra</article-title>
          . London, UK: Springer-Verlag,
          <year>1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>V.</given-names>
            <surname>Weispfenning</surname>
          </string-name>
          , “
          <article-title>The complexity of linear problems in fields,”</article-title>
          <string-name>
            <given-names>J.</given-names>
            <surname>Symb</surname>
          </string-name>
          . Comput., vol.
          <volume>5</volume>
          , no.
          <issue>1-2</issue>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>27</lpage>
          , Feb.
          <year>1988</year>
          . [Online]. Available: http://dx.doi.org/10.1016/S0747-
          <volume>7171</volume>
          (
          <issue>88</issue>
          )
          <fpage>80003</fpage>
          -
          <lpage>8</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27] --, “
          <article-title>Quantifier elimination for real algebra - the quadratic case and beyond,” Applicable Algebra in Engineering, Communication and Computing</article-title>
          , vol.
          <volume>8</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>85</fpage>
          -
          <lpage>101</lpage>
          ,
          <year>1997</year>
          . [Online]. Available: http://dx.doi.org/10.1007/s002000050055
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>B. F.</given-names>
            <surname>Caviness</surname>
          </string-name>
          and
          <string-name>
            <given-names>J. R.</given-names>
            <surname>Johnson</surname>
          </string-name>
          , Quantifier Elimination and Cylindrical Algebraic Decomposition. Vienna: Springer-Verlag,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>