<!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>Mutative Fuzzing for an Assembler Compiler</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Aynel Gul</string-name>
          <email>aynel.gul@hotmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Vadim Zaytsev</string-name>
          <email>vadim@grammarware.net</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Raincode Labs Brussels</institution>
          ,
          <country country="BE">Belgium</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2008</year>
      </pub-date>
      <abstract>
        <p>Compilers play a crucial role in software development, and demands for their correctness are high. Testing them is a challenging process, involving many layers of complexity and many interwoven methodologies. One of the popular techniques that is known to increase the e ectiveness of manually written test cases, is fuzzing: seeded with an initial test case, a fuzzer can mutate it to automatically infer multitudes of mutated test cases. Yet, not all is well when you try to apply fuzzing to test an industrial compiler of a legacy assemblerlevel language, since most research on fuzzing was done on C, and such results are not easy to generalise. In this paper, we explain the complications and show a number of mutation strategies that we successfully applied to fuzz HLASM code. So far we have tested 24000 mutated les and have been able to ag 621 of them as triggering a bug, and found and xed at least one unique bug in Raincode Assembler Compiler.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        Index terms| legacy software, compiler testing,
random testing, fuzzing, mutation strategy
Compilers are known to be among the most
important, widely-used and complex software and we expect
them to be correct. In practise, however, compilers are
signi cantly vulnerable to bugs [1]. Bugs can lead to
crashes or miscompilations [
        <xref ref-type="bibr" rid="ref1">2</xref>
        ], resulting in unexpected
behavior. Unexpected behaviour can result in serious
software failures [
        <xref ref-type="bibr" rid="ref2">3</xref>
        ]. A single erroneous compiler can
produce many erroneous programs. Given the vital
role of compilers in the creation of the code that is
executed, it is important that con dence should be
created in their correctness.
      </p>
      <p>
        Compilers are mainly intensively tested by special
test suites, which are are manually written and
extended over time. However, this traditional way of
testing often revolves around positive testing (i.e.
testing that features work as speci ed), rather than
negative testing (i.e. testing that the system does not
do things that it is not supposed to do). Some errors
cannot be found using only positive testing [
        <xref ref-type="bibr" rid="ref3 ref4">4, 5</xref>
        ]. In
addition, it is known that human testers have blind
spots. It has been shown that test cases are more
effective when they have been written by someone other
than the original programmer [
        <xref ref-type="bibr" rid="ref4">5</xref>
        ]. It is likely that a
blind spot in the implementation also poses a blind
spot in testing. Furthermore, as these tests are written
by hand, they cost a substantial amount of time and
e ort, which makes manual tests expensive [
        <xref ref-type="bibr" rid="ref4">5</xref>
        ]. It is
common to use fuzzing in addition to these test suites
in an attempt to overcome these issues [
        <xref ref-type="bibr" rid="ref3">4</xref>
        ]. Fuzzing
is an approach to software testing where the System
Under Test (SUT) is bombarded with test cases
generated by another program. The technique relies on
providing unexpected or random input, such as randomly
generated test programs. Fuzzing revolves around
negative testing. As fuzzing focuses on random and
unexpected input, it overcomes the blind spot problem.
As the process can be automated, it can be more
coste cient. Fuzzing has shown to be very e ective at
exposing non-obvious errors that had been missed by
other testing techniques [
        <xref ref-type="bibr" rid="ref3 ref5">4, 6</xref>
        ].
      </p>
      <p>
        One such well known and successful fuzzing tool
is Csmith [
        <xref ref-type="bibr" rid="ref6">7</xref>
        ]. Csmith generates random C programs
and has proven to be useful for testing compilers and
other tools that process C code. The tool is based on
di erential testing, which implies that test programs
get compiled by di erent compilers and after their
execution the results are compared. Csmith is a
generative fuzzer, but there is also a lot of interest
recently in research dedicated to mutative approaches,
which do not require two or more comparable
compilers, and in general require less human e ort [
        <xref ref-type="bibr" rid="ref4">5</xref>
        ]. Such
techniques apply equivalence transformations on
existing test programs to automatically generate more test
programs. An equivalence transformation is a
transformation that is applied to a seed program and that
does not change the output of the program. A seed
program is a trivial but valid program that is used as
the initial program in this method. These mutation
strategies can be rather language speci c and many
di erent strategies are possible depending on the
syntax and grammar.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Problem Context</title>
      <p>
        Raincode Labs [
        <xref ref-type="bibr" rid="ref7">8</xref>
        ] is a compiler company that works
with compilers, interpreters, grammars, refactoring
tools, assemblers, etc. We often provide consulting
services to other companies and provide compiler
services such as migration o the mainframe platform.
One of our tools to enable this migration is the
Raincode Assembler Compiler [
        <xref ref-type="bibr" rid="ref8 ref9">9, 10</xref>
        ]. This tool is speci
cally designed for legacy code bases that contain,
besides commonly encountered COBOL, PL/I and other
\third generation languages", also some code in the
IBM assembler. HLASM, or High Level Assembler,
is IBM's low level programming language for
z/Architecture mainframe computers. Just like other
assembler languages, the assembler language supported by
HLASM is speci c to a particular computer
architecture and operating system. As HLASM is an assembler
language, it is very close to the machine language in
both form and content. HLASM operates under the
z/OS operating system, the CMS component of the
z/VM operating system, the z/VSE operating system,
and Linux for System z [
        <xref ref-type="bibr" rid="ref10">11</xref>
        ]. The Raincode Assembler
Compiler is a relatively new tool and currently its
integration testing infrastructure mainly consists of 40
manually written issue-driven test cases.
      </p>
      <p>
        To increase the reliability of a compiler, it is
common to apply complementary testing methods [
        <xref ref-type="bibr" rid="ref11">12</xref>
        ],
as manually written tests presumably lack coverage.
However, random testing of assemblers is uncharted
territory. Tools like Orange4 [
        <xref ref-type="bibr" rid="ref12">13</xref>
        ] and Orion [
        <xref ref-type="bibr" rid="ref13">14</xref>
        ] are
examples of successful random compiler testing tools
that are based on mutative testing1. Their work
sug1Following McNally et al [
        <xref ref-type="bibr" rid="ref4">5</xref>
        ], we use the term \mutative
testing", which is not to be confused with much researched
nowadays \mutation testing" [
        <xref ref-type="bibr" rid="ref14 ref15">15, 16</xref>
        ]. Mutative testing techniques
tweak test cases to produce more test cases to improve test suite
quality. Mutation testing techniques tweak the code under test
to measure test suite quality.
gests that the ideas behind methods of random
compiler testing are generic. However, these tools are
based on the syntax of the C programming language
to speci cally test C compilers. As di erent
programming languages have di erent syntax, it is not possible
to use the same tool for a syntactically di erent
programming language. For this reason, it is unclear if
and how random testing can be applied to HLASM.
      </p>
      <p>In the next section we provide an overview of related
work on testing compilers with generated test data,
covering both generative (subsection 3.2) and mutative
(subsection 3.1) approaches.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Related work</title>
      <p>
        Despite active ongoing initiatives in compiler veri
cation [
        <xref ref-type="bibr" rid="ref16">17</xref>
        ], testing is still the dominant technique that
is used for assuring compiler quality [
        <xref ref-type="bibr" rid="ref11 ref8">9, 12</xref>
        ]. The most
common compiler testing approach, also used at
Raincode Labs, is manually creating, growing and
maintaining a test suite for each compiler implementation.
There are also popular commercial compiler test suites
available, such as PlumHall [18] and SuperTest [19].
As test suites presumably lack coverage, other
methods like random testing are used to provide extra
testing coverage [
        <xref ref-type="bibr" rid="ref4">5</xref>
        ]. Random testing of compilers is not a
replacement of test suites, but rather a complementary
method. Other comparable methods aimed speci cally
at extending existing test suites, are called test plan
augmentation [20] and test suite augmentation [21{24],
or simply test augmentation [25]. Out of those,
metamorphic testing appears to be the closest to our
approach [26].
      </p>
      <p>
        As suggested by McNally et al [
        <xref ref-type="bibr" rid="ref4">5</xref>
        ], we divide the
related random testing work into two categories:
mutative approaches and generative approaches. For a
comprehensive overview of all compiler testing
methods available before 2005, we refer to Kossatchev and
Posypkin [27].
3.1
      </p>
      <sec id="sec-3-1">
        <title>Mutative approaches</title>
        <p>
          In our research, we explore possibilities for applying
random compiler testing with equivalence
transformation on HLASM. Equivalence transformation is a
mutative testing method. At the moment we are unaware
of research that does similar work related to
equivalence transformation and HLASM. However, there
are several projects that apply the same technique
of mutative testing, which we also drew inspiration
from. The initial approach to mutative compiler
testing was presented by Tao et al. [28]. They present
the Mettoc tool, which concentrates on open-source
compilers for C. Mettoc was able to generate
equivalent programs and to expose multiple bugs. A more
recent tool, the Orange4 presented by Nakamura and
Ishiura [
          <xref ref-type="bibr" rid="ref12">13</xref>
          ], introduced a new mutation method for
generating C programs. They start with a trivial
initial program that includes only \return 0;" in the
main function and repeatedly apply equivalence
transformations. Examples are new variable declarations
and if/for-statements. The Orange4 was able to
detect bugs in the latest versions of GCC and LLVM.
Their research is currently limited to C and to the
above mentioned trivial seed program.
        </p>
        <p>
          Le et al. [
          <xref ref-type="bibr" rid="ref13">14</xref>
          ] introduce Orion, which is based on a
new technique called Equivalence Modulo Inputs, or
in short: EMI. In contrast to Orange4, they take
existing real-world code and transform it in a systematic
way to produce equivalent variants of the original code.
More precisely, they analyse real-life code by detecting
dead code and then prune these sections stochastically.
They have been able to nd 147 new bugs in 3 big C
compilers in 11 months. This technique is said to be
generally applicable, but has only been tested with
C compilers. Also, the only mutation strategy used is
pruning. Moreover, the proposed technique only works
on, and with, dead code. It does not include live code
in the transformations, which means that the applied
transformations are limited to deleting code fragments
which are not on the execution path of the programs.
        </p>
        <p>
          Complementary to Orion, Proteus [
          <xref ref-type="bibr" rid="ref17">29</xref>
          ], Athena [
          <xref ref-type="bibr" rid="ref18">30</xref>
          ]
and Hermes [
          <xref ref-type="bibr" rid="ref19">31</xref>
          ] are other examples of recent random
test tools that have proven to be successful. These
three tools are also based on equivalence
transformation by generating single- le test programs from
existing ones. It transforms a seed program into
multiple compilation units and randomly assigns each of
them to an optimisation level. In addition to Orion
they support both deletion and insertion. However,
the transformations of Athena and Proteus are still
and all limited to code fragments that are not on the
execution paths of the programs. Hermes, however,
also applies equivalence transformations on live code.
3.2
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>Generative approaches</title>
        <p>
          A very successful compiler testing tool, known as
Csmith [
          <xref ref-type="bibr" rid="ref6">7</xref>
          ], has been able to nd several hundred bugs
in C compilers GCC and LLVM. Their method is based
on di erential testing, thus their generated programs
are compared across compilers and compiler versions
to detect potential deviant behavior. Csmith covers a
broad range of syntax, including arrays, function calls,
loop statements, etc. They avoid unde ned behaviour
by placing conservative restrictions on the syntax of
the generated test programs [
          <xref ref-type="bibr" rid="ref12">13</xref>
          ]. Csmith is limited to
C and their technique is limited to cases that have two
or more comparable compilers.
        </p>
        <p>
          Another generative approach, presented by Lindig
[
          <xref ref-type="bibr" rid="ref20">32</xref>
          ], concentrates on generating C programs with
complex data structures. These are loaded with constant
values and passed to functions that check the received
values. These received values are compared to the
expected values. Any inconsistencies are exposed by an
assertion failure. The tool, named Quest, is not based
on di erential testing as their tests are self-checking.
Quest was mainly used to test GCC, LCC and ICC
and they were able to nd 13 bugs.
        </p>
        <p>
          Alternatively, generation of test programs can
revolve around extensive coverage of the language|or,
as a proxy, coverage of the grammar of the language.
For instance, there is a famous algorithm of generating
a small set of short test sentences from a context-free
grammar, initially proposed by Purdom [
          <xref ref-type="bibr" rid="ref21">33</xref>
          ] and later
extended with backtracking [
          <xref ref-type="bibr" rid="ref22">34</xref>
          ], actions [
          <xref ref-type="bibr" rid="ref23">35</xref>
          ],
controlled coverage [
          <xref ref-type="bibr" rid="ref24">36</xref>
          ], etc. Just as with mundane
software testing, in parser testing rule coverage is known
to be important but fundamentally insu cient [
          <xref ref-type="bibr" rid="ref25">37</xref>
          ].
Coverage can be seen as two-dimensional [
          <xref ref-type="bibr" rid="ref26">38</xref>
          ] with a
syntactic axis (nonterminals, rules, etc.) and a
semantic one (computations, calculations, attributes, etc).
Fischer et al. [
          <xref ref-type="bibr" rid="ref27">39</xref>
          ] use grammar-based test data
generators to compare several alternative grammars for
reportedly \the same" language.
        </p>
        <p>
          As for making the next step and going from the test
case exposing a possible defect, to the place where
defect can be found and xed, recently it has been
shown that spectrum-based fault localisation methods
can help to identify problematic grammar rules
corresponding to test case failures [
          <xref ref-type="bibr" rid="ref28">40</xref>
          ]. The applicability
of this method to HLASM remains to be investigated,
since it requires instrumentation of the parser to
collect grammar spectra.
4
4.1
        </p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Equivalence transformation</title>
      <sec id="sec-4-1">
        <title>Overview</title>
        <p>In this section, we present a method for automatically
generating equivalent programs using a mutative
approach. Valid HLASM programs are generated
starting from a trivial seed program and by repeatedly
applying mutations.</p>
        <p>When a seed program P is fed to the compiler C, it
produces an executable E (1).</p>
        <p>c : P ! E
(1)
The behaviour of the executable c(P ) ought to behave
exactly as the semantic of the seed program P
prescribes. As follows, if a seed program satis es a certain
property, then the executable should satisfy the same
property (2) [28].</p>
        <p>R(P1; P2; : : : ; Pn) ) R(c(P1); c(P2); : : : ; c(Pn)) (2)
When we create equivalent programs, we expect them
to behave the same as the seed program when they
have the same input (3) [28].</p>
        <p>P1</p>
        <p>P2</p>
        <p>Pn
)
c(P1)
c(P2)
c(: : :)
c(Pn)
(3)</p>
        <p>The HLASM language consists of di erent types of
instructions, namely machine instructions, assembler
instructions and macro instructions. As our method
is mutative and the results should be equivalent, it is
very important to preserve the semantics of the seed
program. As the assembler language lies very close to
the machine language, every little change can have a
big impact as you can work on byte- or even bit level.
This is especially true for machine instructions and
assembler instructions. These given instructions
provide the opportunity to, for example, make jumps in
the program speci ed by bytes rather than symbolic
addresses. However, the third type of instructions,
macro instructions, have shown a lot more mutative
testing potential by providing an environment that is
less prone to semantic changes. As macro instructions
are more high-level than machine- and assembler
instructions, it provides better means for mutative
testing. With macro instructions we were able to apply
mutations that created valid programs that did not
alter the semantics of the program.</p>
        <p>As for the seed programs, we use Raincode's 40
issue-driven test cases, as these test cases have an
expected output.
4.2</p>
      </sec>
      <sec id="sec-4-2">
        <title>Mutation strategies</title>
        <p>All mutation strategies are restricted to strategies that
preserve the semantics of the seed program. Below we
give four examples of mutation strategies that we have
already implemented and deployed.</p>
        <p>1. Label mutation simply changes the name of a
label in the program along with all its occurrences.
If this is done consistently, the behaviour of all
branching instructions will not change.</p>
      </sec>
      <sec id="sec-4-3">
        <title>2. Simple code injection involves adding new</title>
        <p>valid instructions and expressions to the program.
Examples are casting instructions and
declarations. For HLASM, this is only possible to
perform on the level of macro instructions, since
injecting actual assembler instructions will change
the byte code representation of the compiled
program, and semantic preservation cannot be
guaranteed.
3. Expression derivation uses mathematical
properties to generate or mutate arithmetic
expressions. It uses a target value as a starting point and
applies mathematical operations that evaluate to
the target value. In our current implementation
these mathematical operations can be addition,
subtraction or division, selected at random. The
target value is randomly selected from what can
be guaranteed by the current state of the program.
4. Control structure mutation allows to control
the sequence in which the statements of the
program are processed by the assembler. By adding
certain macro branching instructions, we are able
to mutate the control ow without changing the
byte code representation of the program, and thus
preserving its behaviour. Examples are
unconditional branches or branches depending on logical
expressions. No original lines are skipped in the
process.
5</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Experimental results</title>
      <p>We fed the mutated les generated by our tool to
the Raincode Compiler Tester (a proprietary
regression testing tool we use to test all our compilers) and
investigated if we were able to detect any bugs. For
this experiment we generated HLASM programs with
3 di erent numbers of mutation rounds: 150, 300 and
600 (the higher the number, the farther the result from
the seed). With each seed program we generated 200
equivalent programs. All mutation strategies were
included during the mutation phase.</p>
      <p>In addition, we generated HLASM programs with
single mutation strategies to be able to compare them.
We generated 1000 programs for each strategy. Each
program underwent 150 mutations.</p>
      <p>In total, the Raincode Compiler Tester agged 621
programs out of the 24000 mutated programs
produced with our tool. Per round of 8000 mutated
programs, an average of 207 mutated programs were
agged. An overview of these results can be found in
Table 1. An important side note to these results is
that not all agged les indicate unique bugs, as one
bug can trigger multiple miscompilations.</p>
      <p>When running experiments with single mutation
strategies, we were able to ag 30 mutated les with
the simple code injection strategy. We were not able
to ag any mutated les with the other three mutation
strategies. An overview of these results can be found
in Table 2.</p>
      <p>In this short paper we have presented a complementary
method for HLASM compiler random testing based
on equivalence transformation of seed test programs.
To the best of our knowledge, this is the rst
attempt to apply mutative testing to a compiler of an
assembler-level language such as HLASM. The main
problem with the inapplicability of straightforward
Clevel equivalence transformations to HLASM, lies in
the fact that assembler-level programs depend on their
own bytecode representation: use code as data and
data as code, modify themselves at runtime, perform
relative jumps, etc. After noticing this inapplicability,
we still found a way to apply mutative compiler
testing to HLASM, if operating on the level of the macro
language. Thus, our prototype is limited to macro
code, but it might be a fundamental limitation that
can only be lifted by imposing heavy and uncheckable
restrictions on the seed programs, which would make
it possible to fuzz machine instructions and assembler
[18] Plum Hall, Inc. The Plum Hall Validation Suite
for C. http://www.plumhall.com/stec.html.
[19] ACE. SuperTest compiler test and
validation suite. http://www.ace.nl/compiler/
supertest.html.
[20] Wen Chen, Kuo-Kai Hsieh, Li-Chung Wang, and
Jayanta Bhadra. Data-Driven Test Plan
Augmentation for Platform Veri cation. IEEE Design &amp;
Test, 34(5):23{29, 2017.
[21] Zhihong Xu. Directed test suite augmentation.</p>
      <p>In Richard N. Taylor, Harald Gall, and Nenad
Medvidovic, editors, Proceedings of the 33rd
International Conference on Software Engineering,
pages 1110{1113. ACM, 2011.
[22] Tingting Yu. TACO: test suite augmentation for
concurrent programs. In ESEC-FSE, pages 918{
921. ACM, 2015.
[23] Zhihong Xu, Yunho Kim, Moonzoo Kim, Myra B.</p>
      <p>Cohen, and Gregg Rothermel. Directed test suite
augmentation: an empirical investigation.
Software Testing, Veri cation &amp; Reliability, 25(2):77{
114, 2015.
[24] Raul A. Santelices, Pavan Kumar Chittimalli,
Taweesup Apiwattanapong, Alessandro Orso, and
Mary Jean Harrold. Test-Suite Augmentation
for Evolving Software. In Proceedings of the
23rd IEEE/ACM International Conference on
Automated Software Engineering, pages 218{227.</p>
      <p>IEEE, 2008.
[25] Benjamin Danglot, Oscar Vera-Perez,
Zhongxing Yu, Andy Zaidman, Martin Monperrus, and
Benoit Baudry. A Snowballing Literature Study
on Test Ampli cation. Journal of Systems and
Software, 157, 2019.
[26] Zhi Quan Zhou and Liqun Sun. Metamorphic
Testing of Driverless Cars. Communications of
the ACM, 62(3):61{67, February 2019.
[27] A. S. Kossatchev and M. A. Posypkin. Survey
of Compiler Testing Methods. Programming and
Computing Software, 31:10{19, January 2005.
[28] Qiuming Tao, Wei Wu, Chen Zhao, and Wuwei
Shen. An automatic testing approach for compiler
based on metamorphic testing technique. In Asia
Paci c Software Engineering Conference, pages
270{279. IEEE, 2010.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Chengnian</given-names>
            <surname>Sun</surname>
          </string-name>
          , Vu Le, and
          <string-name>
            <given-names>Zhendong</given-names>
            <surname>Su</surname>
          </string-name>
          .
          <article-title>Finding compiler bugs via live code mutation</article-title>
          .
          <source>In ACM SIGPLAN Notices</source>
          , volume
          <volume>51</volume>
          , pages
          <fpage>849</fpage>
          {
          <fpage>863</fpage>
          . ACM,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Xavier</given-names>
            <surname>Leroy</surname>
          </string-name>
          .
          <article-title>Formally Verifying a Compiler: Why? How? How Far</article-title>
          ?
          <source>In Proceedings of the 9th International Symposium on Code Generation and Optimization (CGO)</source>
          .
          <source>IEEE Computer Society</source>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Hongliang</given-names>
            <surname>Liang</surname>
          </string-name>
          , Xiaoxiao Pei, Xiaodong Jia,
          <string-name>
            <given-names>Wuwei</given-names>
            <surname>Shen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>and Jian</given-names>
            <surname>Zhang</surname>
          </string-name>
          . Fuzzing:
          <article-title>State of the art</article-title>
          .
          <source>IEEE Trans. Reliability</source>
          ,
          <volume>67</volume>
          (
          <issue>3</issue>
          ):
          <volume>1199</volume>
          {
          <fpage>1218</fpage>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Richard</surname>
            <given-names>McNally</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Ken</given-names>
            <surname>Yiu</surname>
          </string-name>
          , Duncan Grove, and
          <string-name>
            <given-names>Damien</given-names>
            <surname>Gerhardy</surname>
          </string-name>
          .
          <article-title>Fuzzing: the State of the Art</article-title>
          .
          <source>Technical report, Defence Science and Technology Organisation Edinburgh (Australia)</source>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [6]
          <string-name>
            <surname>Barton</surname>
            <given-names>P Miller</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Louis Fredriksen</surname>
            , and
            <given-names>Bryan</given-names>
          </string-name>
          <string-name>
            <surname>So</surname>
          </string-name>
          .
          <article-title>An Empirical Study of the Reliability of UNIX Utilities</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>33</volume>
          (
          <issue>12</issue>
          ):
          <volume>32</volume>
          {
          <fpage>44</fpage>
          ,
          <year>1990</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Xuejun</surname>
            <given-names>Yang</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yang</surname>
            <given-names>Chen</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Eric Eide</surname>
            ,
            <given-names>and John</given-names>
          </string-name>
          <string-name>
            <surname>Regehr</surname>
          </string-name>
          .
          <article-title>Finding and Understanding Bugs in C Compilers</article-title>
          . In Mary W. Hall and David A. Padua, editors,
          <source>PLDI</source>
          , pages
          <volume>283</volume>
          {
          <fpage>294</fpage>
          . ACM,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Raincode</given-names>
            <surname>Labs</surname>
          </string-name>
          . http://www.raincodelabs.com,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Volodymyr</given-names>
            <surname>Blagodarov</surname>
          </string-name>
          , Ynes Jaradin, and
          <string-name>
            <given-names>Vadim</given-names>
            <surname>Zaytsev</surname>
          </string-name>
          .
          <article-title>Raincode Assembler Compiler</article-title>
          . In Tijs van der Storm, Emilie Balland, and Daniel Varro, editors,
          <source>Proceedings of the Ninth International Conference on Software Language Engineering (SLE)</source>
          , pages
          <fpage>221</fpage>
          {
          <fpage>225</fpage>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Raincode</surname>
          </string-name>
          .
          <article-title>The Raincode ASM370 compiler for .NET and</article-title>
          .NET Core. https://www.raincode. com/technical-landscape/asm370/,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [11]
          <fpage>SC26</fpage>
          -
          <fpage>4940</fpage>
          -
          <lpage>06</lpage>
          .
          <article-title>High Level Assembler for z/OS &amp; z/VM &amp; z/VSE. Language Reference. Version 1 Release 6</article-title>
          . IBM, http://publibz.boulder.ibm. com/epubs/pdf/asmr1021.pdf,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>Vadim</given-names>
            <surname>Zaytsev</surname>
          </string-name>
          .
          <article-title>An Industrial Case Study in Compiler Testing</article-title>
          . In David J. Pearce, Tanja Mayerhofer, and Friedrich Steimann, editors,
          <source>Proceedings of the 11th International Conference on Software Language Engineering (SLE)</source>
          , pages
          <fpage>97</fpage>
          {
          <fpage>102</fpage>
          . ACM,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>Kazuhiro</given-names>
            <surname>Nakamura</surname>
          </string-name>
          and
          <string-name>
            <given-names>Nagisa</given-names>
            <surname>Ishiura</surname>
          </string-name>
          .
          <article-title>Random testing of C compilers based on test program generation by equivalence transformation</article-title>
          .
          <source>In APCCAS</source>
          , pages
          <volume>676</volume>
          {
          <fpage>679</fpage>
          . IEEE,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [14]
          <string-name>
            <surname>Vu</surname>
            <given-names>Le</given-names>
          </string-name>
          , Mehrdad Afshari, and
          <string-name>
            <given-names>Zhendong</given-names>
            <surname>Su</surname>
          </string-name>
          .
          <article-title>Compiler validation via equivalence modulo inputs</article-title>
          . In
          <string-name>
            <surname>Michael F. P. O'Boyle</surname>
          </string-name>
          and Keshav Pingali, editors,
          <source>Proceedings of the 35th Conference on Programming Language Design and Implementation</source>
          , page 25. ACM,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Pedro</given-names>
            <surname>Reales</surname>
          </string-name>
          <string-name>
            <surname>Mateo</surname>
          </string-name>
          , Macario Polo, Jose Luis Fernandez Aleman, Ambrosio Toval, and
          <string-name>
            <given-names>Mario</given-names>
            <surname>Piattini</surname>
          </string-name>
          .
          <article-title>Mutation testing</article-title>
          .
          <source>IEEE Software</source>
          ,
          <volume>31</volume>
          (
          <issue>3</issue>
          ):
          <volume>30</volume>
          {
          <fpage>35</fpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [16]
          <string-name>
            <surname>Mike</surname>
            <given-names>Papadakis</given-names>
          </string-name>
          , Marinos Kintis, Jie Zhang, Yue Jia, Yves Le Traon, and
          <string-name>
            <given-names>Mark</given-names>
            <surname>Harman</surname>
          </string-name>
          .
          <source>Mutation Testing Advances: An Analysis and Survey. Advances in Computers</source>
          ,
          <volume>112</volume>
          :
          <fpage>275</fpage>
          {
          <fpage>378</fpage>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [17]
          <string-name>
            <surname>Maulik</surname>
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Dave</surname>
          </string-name>
          .
          <article-title>Compiler veri cation: A bibliography</article-title>
          .
          <source>ACM SIGSOFT Software Engineering Notes</source>
          ,
          <volume>28</volume>
          (
          <issue>6</issue>
          ):
          <fpage>2</fpage>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [29]
          <string-name>
            <surname>Vu</surname>
            <given-names>Le</given-names>
          </string-name>
          , Chengnian Sun, and
          <string-name>
            <given-names>Zhendong</given-names>
            <surname>Su</surname>
          </string-name>
          .
          <article-title>Randomized Stress-testing of Link-time Optimizers</article-title>
          .
          <source>In Proceedings of the 2015 International Symposium on Software Testing and Analysis</source>
          , pages
          <volume>327</volume>
          {
          <fpage>337</fpage>
          . ACM,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [30]
          <string-name>
            <surname>Vu</surname>
            <given-names>Le</given-names>
          </string-name>
          , Chengnian Sun, and
          <string-name>
            <given-names>Zhendong</given-names>
            <surname>Su</surname>
          </string-name>
          .
          <article-title>Finding Deep Compiler Bugs via Guided Stochastic Program Mutation</article-title>
          .
          <source>In ACM SIGPLAN Notices</source>
          , volume
          <volume>50</volume>
          , pages
          <fpage>386</fpage>
          {
          <fpage>399</fpage>
          . ACM,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [31]
          <string-name>
            <surname>Christian</surname>
            <given-names>Holler</given-names>
          </string-name>
          , Kim Herzig, and
          <string-name>
            <given-names>Andreas</given-names>
            <surname>Zeller</surname>
          </string-name>
          .
          <article-title>Fuzzing with code fragments</article-title>
          .
          <source>In Presented as part of the 21st USENIX Security Symposium (USENIX Security 12)</source>
          , pages
          <fpage>445</fpage>
          {
          <fpage>458</fpage>
          .
          <string-name>
            <surname>USENIX</surname>
          </string-name>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [32]
          <string-name>
            <given-names>Christian</given-names>
            <surname>Lindig. Random Testing of C Calling</surname>
          </string-name>
          <article-title>Conventions</article-title>
          .
          <source>In Proceedings of the Sixth International Symposium on Automated Analysis-Driven Debugging</source>
          , pages
          <volume>3</volume>
          {
          <fpage>12</fpage>
          . ACM,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [33]
          <string-name>
            <given-names>Paul</given-names>
            <surname>Purdom</surname>
          </string-name>
          .
          <article-title>A Sentence Generator for Testing Parsers</article-title>
          .
          <source>BIT Numerical Mathematics</source>
          ,
          <volume>12</volume>
          (
          <issue>3</issue>
          ):
          <volume>366</volume>
          {
          <fpage>375</fpage>
          ,
          <year>1972</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [34]
          <string-name>
            <given-names>Uwe</given-names>
            <surname>Kastens</surname>
          </string-name>
          .
          <article-title>Studie zur Erzeugung von Testprogrammen fur Ubersetzer</article-title>
          .
          <source>Bericht</source>
          <volume>12</volume>
          /80,
          <string-name>
            <surname>Institut</surname>
            <given-names>fu</given-names>
          </string-name>
          r
          <string-name>
            <surname>Informatik</surname>
            <given-names>II</given-names>
          </string-name>
          , University Karlsruhe,
          <year>1980</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [35]
          <string-name>
            <given-names>Augusto</given-names>
            <surname>Celentano</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. Crespi</given-names>
            <surname>Reghizzi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Della Vigna</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Ghezzi</surname>
          </string-name>
          , G. Granata, and
          <string-name>
            <given-names>F.</given-names>
            <surname>Savoretti</surname>
          </string-name>
          .
          <article-title>Compiler Testing Using a Sentence Generator</article-title>
          .
          <source>Software: Practice and Experience</source>
          ,
          <volume>10</volume>
          (
          <issue>11</issue>
          ):
          <volume>897</volume>
          {
          <fpage>918</fpage>
          ,
          <year>1980</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [36]
          <string-name>
            <surname>Ralf</surname>
            <given-names>L</given-names>
          </string-name>
          
          <article-title>ammel and Wolfram Schulte. Controllable Combinatorial Coverage in Grammar-Based Testing</article-title>
          . In Umit Uyar, Mariusz Fecko, and Ali Duale, editors,
          <source>Proceedings of the 18th IFIP TC6/WG6.1 International Conference on Testing of Communicating Systems (TestCom'06)</source>
          , volume
          <volume>3964</volume>
          <source>of LNCS</source>
          , pages
          <volume>19</volume>
          {
          <fpage>38</fpage>
          . Springer Verlag,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [37]
          <string-name>
            <surname>Ralf</surname>
            <given-names>Lammel. Grammar</given-names>
          </string-name>
          <string-name>
            <surname>Testing</surname>
          </string-name>
          .
          <source>In Proceedings of the Fourth International Conference on Fundamental Approaches to Software Engineering (FASE)</source>
          , volume
          <volume>2029</volume>
          <source>of LNCS</source>
          , pages
          <volume>201</volume>
          {
          <fpage>216</fpage>
          . Springer,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [38]
          <article-title>Jorg Harm and Ralf Lammel. Two-dimensional Approximation Coverage</article-title>
          .
          <source>Informatica Journal</source>
          ,
          <volume>24</volume>
          (
          <issue>3</issue>
          ),
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [39]
          <string-name>
            <surname>Bernd</surname>
            <given-names>Fischer</given-names>
          </string-name>
          , Ralf Lammel, and Vadim Zaytsev.
          <article-title>Comparison of Context-free Grammars Based on Parsing Generated Test Data. In Uwe A mann</article-title>
          and Anthony Sloane, editors,
          <source>Post-proceedings of the Fourth International Conference on Software Language Engineering (SLE</source>
          <year>2011</year>
          ), volume
          <volume>6940</volume>
          <source>of LNCS</source>
          , pages
          <volume>324</volume>
          {
          <fpage>343</fpage>
          . Springer,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [40]
          <string-name>
            <given-names>Moeketsi</given-names>
            <surname>Raselimo</surname>
          </string-name>
          and
          <string-name>
            <given-names>Bernd</given-names>
            <surname>Fischer</surname>
          </string-name>
          .
          <article-title>Spectrumbased fault localization for context-free grammars</article-title>
          . In Oscar Nierstrasz, Je Gray, and Bruno C. d. S. Oliveira, editors,
          <source>Proceedings of the 12th ACM SIGPLAN International Conference on Software Language Engineering (SLE)</source>
          , pages
          <fpage>15</fpage>
          {
          <fpage>28</fpage>
          . ACM,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>