<!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>C Code Verification based on the Extended Labeled Transition System Model</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Dexi Wang</string-name>
          <email>dx-wang12@mails.tsinghua.edu.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Chao Zhang</string-name>
          <email>zhang-chao13@mails.tsinghua.edu.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Guang Chen</string-name>
          <email>chenguan14@mails.tsinghua.edu.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ming Gu</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jiaguang Sun</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>School of Software, TNLIST, Tsinghua University</institution>
          ,
          <country country="CN">China</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>The C programming language is widely used in safety-critical software systems. With its large appliance and increasing complexity, the need of ensuring the correctness of C codes emerged. This paper presents Ceagle , a fully automated program verifier for finding assertion violations in C programs. It is decent in both accuracy and efficiency by using a semantically equivalent program model language that is specifically designed for C program, together with various optimizations that make the satisfiability checking faster and memoryfriendly. More specifically, Ceagle uses LLVM clang as front-end parser, an extended labeled transition system as program model, and Z3 SMT solver as the back-end satisfiability checker. Ceagle is designed to be fully automatic and requires no user interaction as long as the assertions are provided. For evaluation, we compare Ceagle with existing C program verifiers based on open benchmarks. Ceagle outperforms others in terms of accuracy, and time and memory consumption.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Introduction</title>
      <p>
        Many safety critical software systems use C programming language, and the verification
of safety properties of C programs are widely adopted to ensure the safety of the whole
software system [
        <xref ref-type="bibr" rid="ref12 ref13 ref3 ref5">3,5,12,13</xref>
        ]. With the increasing complexity of system applications, the
size of the C code is larger and the structure of the code is more complex, which bring
new challenges for the traditional verification tools in three aspects: time efficiency,
memory usage, and verification accuracy. A complex C program and corresponding
safety property may easily lead to state space explosion, and the memory and time for
verification may be infinite for traditional tools.
      </p>
      <p>In fact, an ideal verification tool is supposed to be fast, memory friendly and
accurate, but it is not easy to achieve all of them in real cases. For example, a verification
tool that is very accurate may suffer from low performance, and needs a long time and
huge memory to get a relative complete and sound result.</p>
      <p>Except for the performance and accuracy, the usability of the verification tool is
another important issue. Users prefer verification tools that require less user interaction
than those require manual mathematical proof injection or even sophisticated formal
verification knowledge background.</p>
      <p>In this paper, we propose a novel verification tool Ceagle to get a better balance
between the performance and accuracy, and needs less interaction from users. It is
comparatively accurate and efficient by using a semantically equivalent program model
language that is specifically designed for C programs, together with various optimizations
that make the satisfiability checking faster. The program model language extends the
original labeled transition system (LTS) with more variable types, C style statements,
and built-in functions. The extended labeled transition system (ELTS) inherits the
inner property of traditional LTS that is suitable for the implementation of various model
checking algorithms. Based on the ELTS, several optimizations are performed during
C programs parsing, ELTS construction and ELTS analysis to make Ceagle faster and
more memory friendly than other C verification tools.</p>
      <p>ELTS Counterexample
clang</p>
      <p>LLVM IR
ir2elts</p>
      <p>ELTS
core
C</p>
      <p>C Counterexample</p>
      <p>SMT SMT Model
z3</p>
      <p>The overall structure of Ceagle is shown in Fig.1. Ceagle contains four components:
clang, ir2elts, core, and z3. The C program is firstly parsed by LLVM clang, yielding
the LLVM IR program. Then, the component ir2elts translates the generated LLVM
IR program to the program model ELTS. Finally, the component core constructs SMT
constraints from ELTS, and inputs them into the component z3 for verification. If the
safety property is not satisfied, the C counterexample will be generated and presented
automatically by the implemented trace-back engine. During the whole procedure, the
program intermediate representation LLVM IR and program model ELTS play
important roles in source-level and model-level optimizations, respectively.</p>
      <p>All model translation and construction are accomplished automatically, the user just
needs to input the C program and corresponding safety property assertions. It is easy
to use and does not need complex interactions or formal verification knowledge
background. For evaluation, we compare Ceagle with existing C program verifiers based on
the benchmarks, and Ceagle uses about 20% memory and time of CBMC to acquire
almost the same accuracy, and improves the accuracy of CPAchecker for 25%.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Background</title>
      <p>An intermediate program model ELTS is designed to represent the C program for
optimized verification. Formally, an ELTS model S is a five tuple (L; l0; V; V0; T ) where:
– L is a finite non-empty set of locations;
– l0 is the location of initial basic block;
– V is a finite non-empty set of variables ranging over V, where V is the (possible
infinite) set of values of V ;
– V0 is the set of initial values of V ;
– T L V V L is a finite non-empty set of transitions, a transition t =
(li; Vi; Vj ; lj ) 2 T can also be denoted as (li; Vi) ! (lj ; Vj ), li and lj are called
f rom and to locations, respectively.</p>
      <p>ELTS is extended from the traditional labeled transition system to support all kinds
of operations and types of C programs. For example, the built-in floating point functions
such as fpclassifyf and isnanf contained in math.h are reserved in the element T of
ELTS and will be translated to corresponding SMT constraints later during satisfiability
checking. Details of ELTS can be referred to the website1.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Related Work</title>
      <p>
        During the last decades, there are approaches of assuring quality of programs by
modeling and formal verification [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. Several verifiers for C programs are also
designed to ensure the the correctness of the software such as CMBC [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], CPAchecker [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ],
LLBMC [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], and SMACK [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. Among them, CMBC and CPAchecker have been
widely used and accepted in both academic and industry sides. CBMC applies bounded
model checking to C programs. It verifies the absence of violated assertions on a
transformed GOTO program under a given loop unwinding bound, and uses SAT and SMT
solver as the constraint solving back end. CPAchecker is guided by the concept of
configurable software verification and aims at the easy integration of new verification
components. It supports dynamic precision adjustment during analysis [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. CPAchecker uses
CDT from Eclipse as C parser and multiple SMT solvers as the back end. Ceagle adopt
similar structure with them, but before the integration of back-end SMT, we do some
optimization on the LLVM IR and use a program model ELTS which is designed to
be easier for model checking, and more modular and easier to be optimized for a more
efficient verification.
4
      </p>
    </sec>
    <sec id="sec-4">
      <title>Design of Ceagle</title>
      <p>
        As presented in Fig. 1, Ceagle contains four components: clang, ir2elts, core, and z3,
where clang [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] and z3 [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] are obtained from existing projects for C program
preparser and back-end constraint solver respectively. ir2elts and core are developed for
program model ELTS construction, constraint formalization and optimization.
4.1
      </p>
      <sec id="sec-4-1">
        <title>Kernel Components</title>
        <p>LLVM clang : This component is used to translate C to LLVM IR. A program is firstly
parsed by LLVM clang, yielding the LLVM IR program with debug information, the
debug information will be used in C counterexample generation.</p>
        <p>Translator ir2elts : This component translates LLVM IR program to the ELTS model.
Each basic block in LLVM IR program is translated into the corresponding transition
in an ELTS model with four steps: (i) the name of f rom (to) location in ELTS model
is the label value of the current (successor) basic block in LLVM IR program; (ii) the
guard condition of the transition in ELTS model is translated from the goto-condition of
the current basic block in LLVM IR program; (iii) the body of the current basic block is
copied as-is to preserve full LLVM IR semantics, except that LLVM IR instructions are
translated into ELTS statements; (iv) assertion calls in LLVM IR program are translated
into guarded transitions to error locations.
1 http://sts.thss.tsinghua.edu.cn/ceagle
Formalizer core : This component constructs SMT constraints based on the ELTS
model and assertion. It performs reachability analysis of the translated error locations
via a depth-first search (DFS) on the ELTS model. Once DFS reaches an error
location, it constructs an SMT trace constraint containing those transitions from the initial
location to current error label. It returns “TRUE” if error location is not reachable in
ELTS, otherwise, it returns “FALSE” along with an ELTS counterexample, which is an
ELTS trace that starts from the initial location to error location. Another function of this
component is to convert the ELTS counterexample back to the C counterexample. The
reverse mapping information from ELTS model to LLVM IR program is preserved by
ir2elts when it translates LLVM IR program to ELTS model, and the reverse mapping
information from LLVM IR program to C source code is preserved by clang via debug
information stored in LLVM IR program.</p>
        <p>Solver z3 : This component checks the satisfiability of the formalized constraint, and
infers violations of assertions by the following rules: (i) if the result is sat together
with an SMT model, it means there exists an assignment of variables that can make the
program executes to error label, thus proves an assertion violation; (ii) if the result is
unsat, it means the current trace is safe, the DFS continues; (iii) if all traces are checked
to be unsat, the program is proved to be safe.
4.2</p>
      </sec>
      <sec id="sec-4-2">
        <title>Verification Optimizations</title>
        <p>There are two main reasons that bring up the state space explosion problem and prevent
a verifier from analyzing the C program efficiently: structural complexity and a large
number of variables. We aim at reducing both of them through LLVM IR program,
ELTS model, and formalization optimizations.</p>
        <p>
          LLVM IR program optimization : We observe that there are basic blocks in the LLVM
IR that are not reachable from the program entry, which can be removed when being
translated to ELTS. There are also set of basic blocks that have no conditional jumps
and can be merged into one large basic block, thus helps reducing verification state
space. On the other hand, an LLVM IR program is constructed in static single
assignment (SSA) form [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ] which introduces too many temporary variables, while an ELTS
model uses C-like grammar for its transitions, which are not in SSA form. This means
temporary variables introduced by SSA can be trimmed away when translated to ELTS,
and multiple lines of LLVM IR instructions can be merged into one single line of
Clike ELTS statement. These optimizations are carried out during the IR to ELTS model
transformation.
        </p>
        <p>ELTS model optimization : In the ELTS model level, a depth-first search (DFS) is
carried out to help to generate SMT constraints of all paths. Optimizations on ELTS model
are performed to reduce the search space as follows. First, more variables are trimmed
away through methods of constant propagation, temporary variables are eliminated, and
locations that are not reachable to error labels are deleted, thus reduces nodes the DFS
has to visit. Second, we perform optimization during the DFS search, where variables
from different transitions are annotated with a sequence number according to the index
of the transition in the ELTS trace, which makes it easier to construct counterexamples
after satisfiability checking.</p>
        <p>
          Formalization optimization : A program usually contains multiple kinds of types, such
as boolean, integer, and floating point, which brings several challenges to construct the
constraints in a precise and efficient way. Traditional methods solve mixed-type
expressions and type conversion problems by using precise memory model [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ] or
explicitstate model checking [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ], which is time-consuming. For optimization purpose, we
implemented a lazy type conversion mechanism to infer types of expressions.
        </p>
        <p>The expression is consists of variables, constants, and operators, and we encode an
expression as a directed acyclic graph, in which non-leaf nodes are operators, their
children are their operands, and the leaves are labeled with variables or constants. For every
expression e, we record two types: “intrinsic” type tyi(e) and “to-be” type tytobe(e).
The intrinsic type is the expression evaluated to be, and the “to-be” type is the
expression that should be converted to be when the expression is participating in parental
expressions. The “to-be” type is inferred lazily, and integers and floating points are
evaluated to be bit-vector “to-be” type when the operator is bit-precise. In this way,
variables that are not necessarily to be analyzed bit-precisely can keep being arithmetic,
thus reduces constraint satisfiability overhead of the back end SMT solver.
5</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Experiment evaluations</title>
      <p>
        Experiment setup : We compared Ceagle with the most widely used and recently
developed C verifiers CBMC 5.2 and CPAchecker 1.4, in terms of the accuracy, time and
memory consumption. They are tested on the set of benchmarks from the software
verification competition held at TACAS [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. These are widespread benchmarks offering a
good coverage of the core features of the C programming language, and many
state-ofthe-art analysis tools including CBMC and CPAchecker have been trained on them.
      </p>
      <p>More specifically, we conducted the experiments on the 81 files in the Floats
benchmark set, with a total of approx. 5K lines of code. The experiments are performed on
a machine with a 3.4 GHz 64-bit Quad Core CPU (Intel i7-4770) processor and 32GB
of memory, running an Ubuntu 14.04 with a 64-bit Linux kernel 4.2.0. We set a 15GB
memory limit and a 900s timeout for the analysis of each subject.</p>
      <p>Verification result : The experiments for the three tools are summarized in Table 1.
In the results table, correct negative means the file is true (i.e., negative, assertions are
not violated) and the tool reported true, correct positive means the file is false (i.e.,
positive, assertions are violated) and the tool reported false, incorrect negative means
the file is false but the tool reported true (usually means an unsound tool), incorrect
positive means the file is true but the tool reported false (i.e., a false alarm, usually
means an incomplete tool). Ceagle reported 77 correct and 4 unknown results for total
81 benchmarks, CBMC reported 78 correct and 3 unknown, and CPAchecker reported
56 correct, 1 incorrect, 6 unknown, and 18 timeout results. The correctness rate is
computed by the division of the number of correct files and the number of total files (81),
so the three tools have correctness rates of 95.06%, 96.30%, and 69.15%, respectively.
Ceagle uses about 10%-20% memory and time consumption of CBMC and CPAchecker,
but acquires almost the same accuracy (just one more unknown file) of CBMC and
improves the accuracy of CPAchecker for 25%. It is reasonable to draw the conclusion that
Ceagle is efficient in both time and memory usage while maintaining a high correctness
rate. More details about efficiency are analyzed and illustrated as follows.</p>
      <p>We presented both the time and memory consumption in the third and fourth row
of Table 1. Ceagle is about 5.5X faster than CBMC and 5X faster than CPAchecker on
arbitrary files. Note that Ceagle is a little bit slower than CPAchecker if only
counting correct results, and it would be much faster than CPAchecker when including those
incorrect and timeout results. Ceagle uses about 80% lesser memory than CBMC and</p>
      <p>Ceagle 1.0 CBMC 5.2 CPAchecker 1.4
Number of correct files 77 78 56
Correct negatives 59 56 35
Correct positives 18 22 21
Number of incorrect files 0 0 1
Incorrect negatives 0 0 0
Incorrect positives 0 0 1
Unkowns 4 3 6
Timouts 0 0 18
Correctness rate (%) 95.06 96.30 69.14
Total time (s) 3700 21000 19000
Total time of correct files (s) 3700 18000 2500
Time per file (s) 45.68 259.26 234.57
Timer per correct file (s) 48.05 230.77 44.64
Time ratio of per file (%) 100.00 567.56 513.51
Time ratio of per correct file (%) 100.00 480.27 92.90
Total memory (MB) 2900 15000 31000
Total memory of correct files (MB) 2900 13000 17000
Memory per file (MB) 35.80 185.19 382.72
Memory per correct file (MB) 37.66 166.67 303.57
Memory ratio of per file (%) 100.00 517.29 10069.05</p>
      <p>Memory ratio of per correct file (%) 100.00 442.57 806.08
90% lesser memory than CPAchecker on arbitrary files. This is because the
optimizations at different levels (LLVM IR program, ELTS model, and constraint formalization)
help to reduce much verification overhead, thus reduces time and memory usage.</p>
      <p>For the unknown and timeout result files, Ceagle output 4 unknown due to its
lacking full support of arrays and some internal bugs on handling high order
multiplications of floating points. CBMC output 3 unknown and crashed without any prompts.
CPAchecker reported 6 unknown and 18 timeouts. The 6 unknown files are because of
incomplete analysis. The 18 timeout files are all true files, and it is because when the
value analysis algorithm of CPAchecker found no counterexample, the predicate
analysis algorithm would be used, which consumed a lot of time but still could not prove
true for these files.
6</p>
    </sec>
    <sec id="sec-6">
      <title>Conclusion and future work</title>
      <p>In this paper, we presented the C program verifier Ceagle to check assertion violations
of C programs. It uses LLVM clang as front-end parser, an extended labeled transition
system as program model, and Z3 SMT solver as the back-end satisfiability checker.
Several optimization techniques during the three steps are designed and implemented
to reduce the memory and time consumption. Except for those experiments on
benchmarks, we have applied Ceagle to verify the core optimization algorithm which has
17k LOC of C code of the real train energy efficiency control software for smart
railway transportation. Several safety assertions are inserted in the code to check its safety,
and an over speed bug in the code is detected. Our future work mainly includes
extending the scalability of Ceagle to support more advanced features such as struct and
dynamic memory allocation of C programming language.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>D.</given-names>
            <surname>Beyer</surname>
          </string-name>
          .
          <article-title>Reliable and reproducible competition results with benchexec and witnesses (report on sv-comp</article-title>
          <year>2016</year>
          ).
          <source>In Tools and Algorithms for the Construction and Analysis of Systems</source>
          , pages
          <fpage>887</fpage>
          -
          <lpage>904</lpage>
          . Springer,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <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>
          , and
          <string-name>
            <surname>G.</surname>
          </string-name>
          <article-title>The´oduloz. Program analysis with dynamic precision adjustment</article-title>
          .
          <source>In Automated Software Engineering</source>
          ,
          <year>2008</year>
          .
          <source>ASE</source>
          <year>2008</year>
          . 23rd IEEE/ACM International Conference on, pages
          <fpage>29</fpage>
          -
          <lpage>38</lpage>
          . IEEE,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>D.</given-names>
            <surname>Beyer</surname>
          </string-name>
          and
          <string-name>
            <given-names>M. E.</given-names>
            <surname>Keremoglu</surname>
          </string-name>
          .
          <article-title>Cpachecker: A tool for configurable software verification</article-title>
          .
          <source>In Computer Aided Verification</source>
          , pages
          <fpage>184</fpage>
          -
          <lpage>190</lpage>
          . Springer,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>D.</given-names>
            <surname>Beyer</surname>
          </string-name>
          and
          <string-name>
            <surname>S.</surname>
          </string-name>
          <article-title>Lo¨we. Explicit-state software model checking based on cegar and interpolation</article-title>
          . In Fundamental Approaches to Software Engineering, pages
          <fpage>146</fpage>
          -
          <lpage>162</lpage>
          . Springer,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>E.</given-names>
            <surname>Clarke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kroening</surname>
          </string-name>
          , and
          <string-name>
            <given-names>F.</given-names>
            <surname>Lerda</surname>
          </string-name>
          .
          <article-title>Tools and Algorithms for the Construction and Analysis of Systems: 10th International Conference</article-title>
          , TACAS 2004,
          <article-title>Held as Part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2004</article-title>
          , Barcelona, Spain, March 29 - April 2,
          <year>2004</year>
          . Proceedings,
          <article-title>chapter A Tool for Checking ANSI-C Programs</article-title>
          , pages
          <fpage>168</fpage>
          -
          <lpage>176</lpage>
          . Springer Berlin Heidelberg, Berlin, Heidelberg,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <string-name>
            <surname>6. L. De Moura</surname>
            and
            <given-names>N.</given-names>
          </string-name>
          <string-name>
            <surname>Bjørner</surname>
          </string-name>
          . Z3:
          <article-title>An efficient smt solver</article-title>
          .
          <source>In Tools and Algorithms for the Construction and Analysis of Systems</source>
          , pages
          <fpage>337</fpage>
          -
          <lpage>340</lpage>
          . Springer,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <article-title>and etc. Design and optimization of multiclocked embedded systems using formal techniques</article-title>
          .
          <source>IEEE Transactions on Industrial Electronics</source>
          ,
          <volume>62</volume>
          (
          <issue>2</issue>
          ):
          <fpage>1270</fpage>
          -
          <lpage>1278</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jiang</surname>
          </string-name>
          , H. Liu,
          <article-title>and etc. Design of mixed synchronous/asynchronous systems with multiple clocks</article-title>
          .
          <source>IEEE Transaction on Parallel and Distributed Systems</source>
          , pages
          <fpage>2220</fpage>
          -
          <lpage>2232</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Song</surname>
          </string-name>
          ,
          <article-title>and etc. Data-centered runtime verification of wireless medical cyberphysical system</article-title>
          .
          <source>IEEE Transactions on Industry Informatics</source>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <surname>H. Zhang,</surname>
          </string-name>
          <article-title>and etc. Tsmart-galsblock: a toolkit for modeling, validation, and synthesis of multi-clocked embedded systems</article-title>
          .
          <source>In Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering</source>
          , pages
          <fpage>711</fpage>
          -
          <lpage>714</lpage>
          . ACM,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>C.</surname>
          </string-name>
          <article-title>Lattner. Llvm and clang: Next generation compiler technology</article-title>
          .
          <source>In The BSD Conference</source>
          , pages
          <fpage>1</fpage>
          -
          <lpage>2</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>F.</given-names>
            <surname>Merz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Falke</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Sinz</surname>
          </string-name>
          . Llbmc:
          <article-title>Bounded model checking of c and c++ programs using a compiler ir</article-title>
          .
          <source>In Verified Software: Theories</source>
          , Tools, Experiments, pages
          <fpage>146</fpage>
          -
          <lpage>161</lpage>
          . Springer,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>Z.</given-names>
            <surname>Rakamaric</surname>
          </string-name>
          ´ and
          <string-name>
            <given-names>M.</given-names>
            <surname>Emmi</surname>
          </string-name>
          . Smack:
          <article-title>Decoupling source language details from verifier implementations</article-title>
          . In Computer Aided Verification, pages
          <fpage>106</fpage>
          -
          <lpage>113</lpage>
          . Springer,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>C. Sinz</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Falke</surname>
            , and
            <given-names>F.</given-names>
          </string-name>
          <string-name>
            <surname>Merz</surname>
          </string-name>
          .
          <article-title>A precise memory model for low-level bounded model checking</article-title>
          .
          <source>In Proceedings of the 5th international conference on Systems software verification</source>
          , pages
          <fpage>7</fpage>
          -
          <lpage>7</lpage>
          . USENIX Association,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>