<!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>
      <journal-title-group>
        <journal-title>APSEC</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Mining and Detecting Bugs in Introductory Programs</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Wenchu Xu</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Yanran Ma</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Nanjing Foreign Language School</institution>
          ,
          <addr-line>30 East Beijing Road, Nanjing, 210008</addr-line>
          ,
          <country country="CN">China</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Nanjing University</institution>
          ,
          <addr-line>163 Xianlin Road, Nanjing, 210093</addr-line>
          ,
          <country country="CN">China</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2021</year>
      </pub-date>
      <volume>06</volume>
      <fpage>8</fpage>
      <lpage>13</lpage>
      <abstract>
        <p>For students who start learning a programming language, bugs in the introductory program hinder the learning progress. Current introductory program judge systems merely provide a pass or fail by the percentage of passed test cases, while students may be unaware of potential defects hiding in their programs. It is helpful to provide a bug detection tool for them. However, state-of-the-art bug detection methods emphasize on precision and scalability, yet developing detection methods for numerous categories of defects is typically costly. In this paper, we first conducted an empirical study to mine common bug patterns, and found that (1) most bugs in such programs are simple; (2) bug patterns rely on specific programming tasks and thus be various. According to our findings, developing precise analysis methods for each bug pattern is unrealistic and unnecessary. Therefore, this paper further proposes a static detection framework to discover software bugs in order to ease the development of bug detection while maintaining a fair level of precision. Our framework is extensible by defining bug specification for bug patterns in a specific input format. The method is then applied to real-world introductory programs and successfully detect all bugs with a false positive rate of 25.8%.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Empirical Study</kwd>
        <kwd>Introductory Programming</kwd>
        <kwd>Static Bug Detection</kwd>
        <kwd>Bug Pattern</kwd>
        <kwd>Bug Specification</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        In this paper, we focus on static detection methods, in
order to achieve a sound result and act as a complement
Introductory programming received increasing attention of program judgment systems. Unlike existing software
both in industry and academia. Such programs, devel- bugs or security vulnerabilities, bugs in introductory
prooped by students when taking introductory program- grams may have various patterns. To better understand
ming courses, are only validated by pre-defined test cases. bug patterns in such programs, this paper first conducts
However, passing all test cases does not guarantee that an empirical study of bug patterns that introductory
proprograms are free from bugs, leading to students mistak- grams commonly have. The results demonstrate that (1)
enly assume their programs are bug-free. And students most bugs in such programs are simple; (2) bug patterns
may introduce similar bugs (e.g., integer overflow) in rely on specific programming tasks and thus be various.
real-world programs, which may lead to serious conse- These results of empirical study show that existing
quences [
        <xref ref-type="bibr" rid="ref2">1</xref>
        ]. Therefore, detecting bugs in such programs static analysis methods, albeit conceptually appealing,
can help students to better understand programming and are not applicable for detecting bugs in introductory
proavoid similar bugs in future real-world programs. grams. Students without any programming background
      </p>
      <p>
        Earlier works predominately considered program anal- may introduce various kinds of bugs, which only occur
ysis for large-scale programs with complex bug patterns [2, in a certain category of programs. This raises a new
chal1, 3, 4, 5]. Carrybound [
        <xref ref-type="bibr" rid="ref1 ref6">5</xref>
        ], based on taint analysis, real- lenge that, notwithstanding, the cause of each bug may
izes the checking of array index out of bounds defects be simple and trivial, detecting all of them is a non-trivial
through backward data flow analysis. At the same time, task. To the best of our knowledge, the reason is that
it provides array boundary checking conditions to im- existing static analysis methods require costly human
prove precision. Pinpoint [
        <xref ref-type="bibr" rid="ref5">4</xref>
        ] tracks the precision and efort to implement a sound and precise bug detector for
scalability dilemma by symbolic expression graph, which each bug, so it is impractical to detect all trivial bugs.
memorizes non-local data dependence relations and path In this paper, we present a simple but efective
frameconditions. At the bug detection step, only bug-related work that is capable of detecting bugs in introductory
code is precisely analyzed. This design achieves high programs. Given a bug specification, this framework first
precision and almost linear time growth. Both tools are identifies potential bug locations. Then, it analyzes
incapable of analyzing one million lines of code while keep- structions before or after the bug location in control flow
ing the analysis accurate in analyzing complex bugs. graphs. Finally, it reports a bug if instructions flow from
a bug location do not meet specified constraints.
      </p>
      <p>In summary, this paper makes the following
contributions:
• An empirical study of student programming bugs</p>
      <p>whose goal is to find common bug patterns in
introductory programs.
• A static detection framework that is extensible to</p>
      <p>detect student programming bugs.
• An implementation, DBI, which we use to bugs in
existing bug datasets. Results show that (1) DBI
is fast, taking on average less than 2 seconds to
analyze all programs; (2) DBI is efective, giving
on average less than 25.8% false-positive rate in
real-world programs.</p>
      <p>The remainder of this article is presented as the following.</p>
      <p>Section 2 presents the detailed results of our empirical
study. Section 3 details our analysis framework. Section 4
present our evaluation of DBI. Section 5 presents related
works. Finally, section 6 gives the conclusion.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Mining Bugs in Introductory programs</title>
      <p>In this section, we show the setup and result of our
empirical study about common bugs in introductory programs.
1 void secretFunction() {
2 printf("Danger zone!\n");
3 }
4 void echo() {
5 char buffer[20];
6 printf("Enter some text:\n");
7 scanf("%s", buffer);
8 printf("You entered: %s\n", buffer);
9 }
10 int main() {
11 echo();
12 return 0;
13 }
Specifically, their methods are proposed to analyze
large2.1. Learning from practice scale programs in an acceptable time budget while
keeping high precision including flow-, context- and
fieldSource code written by novice programmers is not free sensitive. Such methods are not suitable for detecting
from bugs even though it passes the testing of the on- bugs in introductory programs because they require
exline judge system. Such hidden bugs may make them perts to develop a new bug checker. To tackle this
chalassume that their programs are bug-free. Therefore, in lenge, we present an extensible framework that can detect
order to find such hidden bugs and design an extensible a new bug pattern with a little human cost.
bug detection framework for these bugs, we conduct an
empirical study to mine common bug patterns in existing
bug datasets. Such bug patterns help us to understand 3. Detecting Bugs in Introductory
how they are introduced, and how to detect them. programs</p>
      <p>To survey the bug patterns, we manually inspect two
kinds of programs in CodeForce1: the first kind passes
test cases and the second one does not.</p>
      <p>In this section, we first give a motivating example to show
a buggy program. Then, we present an overview of DBI,
followed by a detailed description of each component.</p>
      <sec id="sec-2-1">
        <title>2.2. Results of the empirical study</title>
      </sec>
      <sec id="sec-2-2">
        <title>3.1. Motivating example</title>
        <sec id="sec-2-2-1">
          <title>String related bugs</title>
        </sec>
        <sec id="sec-2-2-2">
          <title>Float related bugs</title>
        </sec>
        <sec id="sec-2-2-3">
          <title>Integer related bugs</title>
        </sec>
        <sec id="sec-2-2-4">
          <title>Pointer related bugs Null pointer dereference</title>
        </sec>
        <sec id="sec-2-2-5">
          <title>Misuse modulo operator Bug patterns Incorrect use</title>
          <p>of memset
Bufer overflow</p>
          <p>Missing checks
against external input</p>
        </sec>
        <sec id="sec-2-2-6">
          <title>Use after free</title>
        </sec>
        <sec id="sec-2-2-7">
          <title>Missing ’\0’</title>
          <p>Missing checks
after modification
Difer ent precision of
floating point data types</p>
        </sec>
        <sec id="sec-2-2-8">
          <title>Numerical calculations</title>
        </sec>
        <sec id="sec-2-2-9">
          <title>Integer overflow</title>
        </sec>
        <sec id="sec-2-2-10">
          <title>Conversion between Unsigned and signed Divided by zero</title>
        </sec>
        <sec id="sec-2-2-11">
          <title>Modulo negative number Compare modulo results Example</title>
          <p>
            int a[16]; memset(a, 1, sizeof(a));
//a[0] is not 1.
int a[
            <xref ref-type="bibr" rid="ref5">4</xref>
            ]; strcpy(a, "hello world");
//Buffer overflow
scanf("%d", &amp;nLen);
for (int i = 0; i &lt; nLen; i++)
          </p>
          <p>
            aVal[i] = octs[i]; //Buffer overflow
struct node *ptr = head;
for (; ptr != NULL; ptr = ptr-&gt;next)
free(ptr);
//ptr is freed when accessing ptr-&gt;next.
char str[
            <xref ref-type="bibr" rid="ref1 ref6">5</xref>
            ] = {’h’,’e’,’l’,’l’,’o’};
printf("str=%s\n",str);
printf("strlen(str)%d\n",strlen(str));
// Incorrect output
while (n[0]==’0’ &amp;&amp; n.size()&gt;1)
          </p>
          <p>n=n.substr(1);
float a=0.1+0.2;
if(a==0.1+0.2) return true; return false;
double sap[100] = 3.14e10; int n = 100;
double sum, sqresum ;
for ( int i; i &lt; n; i ++) {
sum += sap [i ];
sqresum += sap [i] * sap [i ];
} return ( sqresum - sum*sum/n) / n;
// Should be zero but is 9.761004 × 1018
if(a+b&lt;=c||a+c&lt;=b||c+b&lt;=a)</p>
          <p>
            return true; // Incorrect result when
a, b, c are all INT_MAX
unsigned int a = 0; int b = -1;
if((a+b)&gt;=0) return true;
return false;
// Should return fale but it returns true.
scanf("%d", &amp;x); x = x - 5;
int y = 100/x; // x may be zero.
int *p = NULL; int q = *p;
// Dereferencing p leads to crash.
int a[
            <xref ref-type="bibr" rid="ref11">10</xref>
            ] = 0, b = -5; int c = a[b%10];
// Array index should be larger than 0.
if(100&gt;5); if(100%10 &lt; 5%10);
// The comparison result is incorrect.
          </p>
        </sec>
        <sec id="sec-2-2-12">
          <title>Bugfix</title>
        </sec>
        <sec id="sec-2-2-13">
          <title>Use other API</title>
        </sec>
        <sec id="sec-2-2-14">
          <title>Check the length of source and dest string</title>
        </sec>
        <sec id="sec-2-2-15">
          <title>Add checks for external input</title>
        </sec>
        <sec id="sec-2-2-16">
          <title>Add checks for external input Add ’\0’</title>
        </sec>
        <sec id="sec-2-2-17">
          <title>Check string length</title>
          <p>after modification.</p>
          <p>Replace the condition with.
abs(a-b) &lt; epsilon</p>
        </sec>
        <sec id="sec-2-2-18">
          <title>Rewrite code</title>
        </sec>
        <sec id="sec-2-2-19">
          <title>Check whether math operations may . cause overflow</title>
        </sec>
        <sec id="sec-2-2-20">
          <title>Rewrite code</title>
        </sec>
        <sec id="sec-2-2-21">
          <title>Add checks for division and modulo</title>
        </sec>
        <sec id="sec-2-2-22">
          <title>Rewrite code</title>
          <p>Change to (b+10)%10.</p>
        </sec>
        <sec id="sec-2-2-23">
          <title>Rewrite code</title>
          <p>of 4 main components: CFG Construction, Pre-Analysis, notes a bug pattern,  denotes directions (forward or
Analysis Mode, and Post-Analysis. backward),  indicates whether all paths (i.e., forall) or</p>
          <p>
            CFG Construction produces inter-procedure CFGs for only one path (i.e., exists) should satisfy , and  is a
programs. The reaming three components, acting as constraint whose violation will lead to a bug report. The
the main procedure, perform the analysis against a bug four elements are used for Pre-Analysis ( ), Analysis
specification. Its intuition is straightforward: we first Mode ( and  ), and Post-Analysis (), respectively.
search instructions that satisfy a pre-defined bug pattern.  and  are written according to the syntax of a
proThen for each of these instructions (denoted by ), gramming language in first order logic [
            <xref ref-type="bibr" rid="ref7">6</xref>
            ]. Specifically,
we analyze instructions before or after  according to  and  are defined by first order logic. Variables in
the pre-defined analysis mode. Finally, a bug is reported  and  are from the syntax grammar of a
programif there is an instruction (denoted by ) along the ming language (e.g., C++).We describe these variables
paths from  to  that fails to meet a pre-defined by the kind of statements and expressions (e.g.., IfStmt,
constraint. ForStmt, BinaryOperator, etc.). For example,  =
  means  is an if statement.
          </p>
        </sec>
      </sec>
      <sec id="sec-2-3">
        <title>3.3. Inputs</title>
        <p>The inputs of the framework are the source code of a
program and bug specification. The bug specification The first component in the framework is CFG
Construcis a 4-tuple:  := &lt;, , , &gt;, where  de- tion, which is a preprocessing step that generates control
3.4. CFG Construction
lfow graphs (CFG) for the input source code. Specifically, along the ICFG. For each of these instructions (denoted as
it parses the source code, constructs CFG for each func- ), we construct a path (denoted as ℎ) from 
tion, and connects each CFG to an inter-procedure CFG to , then check whether  satisfies condition .
(ICFG). Worth noting that we do not perform alias analy- If it does and the analysis mode  is exists, then we
sis in this step because our method naturally traces all finish the analysis. If the analysis mode  is forall, then
possible aliases when analyzing bugs in each path. we continue analyzing other paths until all paths satisfy
condition  or some path fails to meet . If the condition
3.5. Pre-Analysis  is satisfied in at least one path ( resp., all paths) in exists
(resp., forall), we will not report the bug. Otherwise, we
The component identifies a set of buggy instructions de- regard  as a buggy instruction.
ifned by  . We analyze each instruction in the ICFG to For the example in Figure 1, we will not report the
determine whether the instruction meets the bug pattern. instruction if each path that starts from the  (i.e.,
If so, the instruction is denoted as  and the variable scanf at line 7) has corresponding  that satisfies
that saves the buggy content is denoted as  .  :=  ∈  .. In other words, we</p>
        <p>For example, in order to detect the bug in Figure 1, will not report the bug if   (i.e., buffer) in  is
we design  :=  =   ∧ . =  . checked in a condition (e.g., a if branch), regardless of
It means that we will find all instructions with scanf whether the condition is correct or not.
because input from users is regarded as unsafe. Therefore,
a function call scanf("%s", buffer); is  and its 3.8. Outputs
  is buffer because the buffer saves the content
of unsafe input.</p>
        <p>Forward/Backward.  indicates the direction of our
analysis: forward or backward. Forward (resp., Backward)
means analyzing the instructions after (resp., before) the
bug pattern. The reason is to analyze two kinds of bugs: 4.1. Implementation
the first kind occurs when condition  is before the bug
pattern while the second one is after the bug pattern.</p>
        <p>For example, given a user input, we check whether the
input is valid and discard invalid input. Such checks, if
exist, only be valid after the bug pattern (i.e., a variable
provided by users).</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>4. Implementation and Evaluation</title>
      <p>Our method is implemented by Clang2, in order to use
its basic analysis infrastructure such as parsing ASTs,
constructing CFGs, analyzing instructions and analyzing
paths.</p>
      <sec id="sec-3-1">
        <title>3.7. Post-Analysis</title>
        <p>Forall/Exists.  indicates whether all paths or at least 4.2. Implemented bug specifications
one path should satisfy . The intuition of  is because
one situation only requires that at least one path (denoted
as ℎ) that satisfies condition  to avoid introducing
the bugs. In contrast, the other situation requires that all
paths should satisfy condition  to avoiding introducing
the bugs. Therefore, we design forall and exists modes to
support the two situations.</p>
        <p>For example, to detect the bug in Figure 1, we should
check that all paths after the scanf should check whether
the input string is valid. So  is forward and  is forall
We design bug specifications and apply it to existing
introductory programs. As shown in Table 2, we implement
seven bug specifications for bugs in Table 1. We explain
the first two specifications in detail:
Check string length after modification. The
specification is  := &lt;, , , &gt; where  := []
( is an integer variable),  is set to backward,  is forall,
and  := .() &gt; 1. An example of the buggy
statement is while (n[0]==’0’ &amp;&amp; n.size()&gt;1)
n=n.substr(1); . The correct one should swap the
two predicates, resulting in while (n.size()&gt;1 &amp;&amp;
n[0]==’0’) n=n.substr(1);.</p>
        <p>The component checks whether variable   in each Modulo negative number. As for detecting Modulo
instruction that flows from  satisfies constraint . operation with negative numbers, the bug specification
 is the buggy instruction from the Pre-Analysis. For is  := &lt; &gt; where  := % without ,  ,
each , we analyze instructions after (or before) 
and . ( + )% is deemed to satisfy the  , but
(% + )% is deemed as a bug-free statement because
% +  must be positive.
caused by imprecise  . The instruction in the
falsepositive program matching the  is  = %10;
, but the data type of num is unsigned int. To get rid of
this, we need to refine bug specification to meet more
situations.</p>
      </sec>
      <sec id="sec-3-2">
        <title>4.3. Subjects</title>
        <p>
          We evaluated DBI against synthetic and real-world
programs. First, we apply it to existing introductory pro- Table 4 depicts the results of our method in analyzing
realgrams in IntroClass [
          <xref ref-type="bibr" rid="ref8">7</xref>
          ]. We randomly select four pro- world programs. In all programs, our tool runs relatively
grams and inject bugs into each of them. To evaluate fast, and thousands of lines of code can be analyzed in a
the real-world programs, we use programs from GitHub3, few seconds. The total false-positive rate is 25.8%, which
these programs consist of known bugs to help us to eval- is relatively low. And most of false-positive situations
uate the performance of DBI in a more general way. are caused by imprecise  or .
        </p>
      </sec>
      <sec id="sec-3-3">
        <title>4.5. The results of real-world programs</title>
      </sec>
      <sec id="sec-3-4">
        <title>4.4. The results of synthetic programs</title>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>5. Related work</title>
      <p>
        Table 3 depicts the results of our method in analyzing 4
introductory programs. In all 4 programs, our method, 5.1. Static analysis
which achieves an average 25% false-positive rate, is pre- We found two strands of static methods, the first one
cise in detecting bugs. We found that one reason of analyzes programs with theoretical guarantee [
        <xref ref-type="bibr" rid="ref1 ref5 ref6">5, 4</xref>
        ] and
false positives for the pattern of check string length after the second uses deep learning models to predict bugs [
        <xref ref-type="bibr" rid="ref3">2</xref>
        ].
modification is caused by incomplete bug specification Carrybound [
        <xref ref-type="bibr" rid="ref1 ref6">5</xref>
        ], a static analysis tool based on taint
(e.g., length = strlen(n); length&gt;1; is semanti- analysis, realizes the checking of array index out of bounds
cally equivalent but not equal to strlen(n)&gt;1;). For ex- bugs through backward data flow analysis and provides
ample, the buggy instruction is length = strlen(n); array boundary checking conditions to be added. Value
length&gt;1; instead of strlen(n)&gt;1;, thus no instruc- flow analysis is way of precise static analysis, but it is not
tion that meets constraint  := () &gt; 1. The rea- eficient enough for checking large-scale programs. To
son of false positive for Modulo negative number is also tackle this problem, Pinpoint [
        <xref ref-type="bibr" rid="ref5">4</xref>
        ] first builds fast and
precise local data dependence, then it creates a new type of
3https://github.com/piggy10086/Nasac_benchmark SVFG, i.e., symbolic expression graph, which memorizes
BovInspector [
        <xref ref-type="bibr" rid="ref2">1</xref>
        ] automatically validates static bufer
overflow warnings and provides repair suggestions by
warning reachability analysis and guided symbolic
execution. SDRacer [
        <xref ref-type="bibr" rid="ref4">3</xref>
        ], following the similar spirit of
BovInspector, detects race conditions in interrupt-driven
embedded software by pipelining static analysis, symbolic
execution and dynamic validation. AddressSanitizer [
        <xref ref-type="bibr" rid="ref9">8</xref>
        ]
is a new memory access checker that uses an eficient
way to encode and map shadow memory. In addition
to detecting heap space bugs, the tool can find
out-ofbounds memory access bugs in the stack, global objects.
      </p>
      <sec id="sec-4-1">
        <title>5.3. Program analysis for introductory programs</title>
        <p>
          For java introductory programs, Nghi et al.. developed
a static analysis framework ELP (Learning to Program)
based on good programming practice experience [
          <xref ref-type="bibr" rid="ref10">9</xref>
          ]. The
tool implements software metric analysis and structural
similarity analysis, including cyclomatic complexity,
redundant logic expression, etc., to improve programming
quality and give feedback. The Investigating [
          <xref ref-type="bibr" rid="ref11">10</xref>
          ] was
conducted on nearly 10 million static analysis errors in
student java programs collected by Web-CAT. The
results show that formatting and documentation errors
are the most frequent errors. However, the two kinds
of bugs, albeit frequently occur, will not lead to serious
consequences. In contrast, DBI focuses on bugs hidden
in programs.
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>6. Conclusion</title>
      <p>This paper first conducts an empirical study showing
common bug patterns written by novice programmers.
However, it also finds that such bug patterns are
usually simple and easy to detect but the bug patterns may
rely on specific programming tasks. Therefore, to easily
develop a new bug checker while keeping a reasonable
precision, this paper also presents a bug detection
framework for introductory programs. This method reports
bugs by checking whether variables that flow from a bug
pattern do not meet an expected constraint. In addition,
we implement a prototype tool and conduct a case study</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>5.2. Dynamic analysis</mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>F.</given-names>
            <surname>Gao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <article-title>Bovinspector: automatic inspection and repair of bufer overflow vulnerabilities</article-title>
          ,
          <source>in: Proceedings of the 31st IEEE/ACM International Conference on Automated Software Engineering</source>
          ,
          <year>2016</year>
          , pp.
          <fpage>786</fpage>
          -
          <lpage>791</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Gao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <article-title>Learning semantic program embeddings with graph interval neural network</article-title>
          ,
          <source>Proceedings of the ACM on Programming Languages</source>
          <volume>4</volume>
          (
          <year>2020</year>
          )
          <fpage>1</fpage>
          -
          <lpage>27</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Yu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Zhao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <article-title>Automatic detection and validation of race conditions in interrupt-driven embedded software</article-title>
          ,
          <source>in: Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis</source>
          ,
          <year>2017</year>
          , pp.
          <fpage>113</fpage>
          -
          <lpage>124</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Q.</given-names>
            <surname>Shi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Xiao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Wu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Zhou</surname>
          </string-name>
          , G. Fan,
          <string-name>
            <given-names>C.</given-names>
            <surname>Zhang</surname>
          </string-name>
          , Pinpoint:
          <article-title>Fast and precise sparse value flow analysis for million lines of code</article-title>
          ,
          <source>in: Proceedings of the 39th ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          ,
          <year>2018</year>
          , pp.
          <fpage>693</fpage>
          -
          <lpage>706</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>F.</given-names>
            <surname>Gao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Situ</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <article-title>Carraybound: Static array bounds checking in c programs based on taint analysis</article-title>
          ,
          <source>in: Proceedings of the 8th Asia-Pacific Symposium on Internetware</source>
          ,
          <year>2016</year>
          , pp.
          <fpage>81</fpage>
          -
          <lpage>90</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>R. M.</given-names>
            <surname>Smullyan</surname>
          </string-name>
          ,
          <article-title>First-order logic</article-title>
          ,
          <source>Courier Corporation</source>
          ,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>C.</given-names>
            <surname>Le Goues</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Holtschulte</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E. K.</given-names>
            <surname>Smith</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Brun</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Devanbu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Forrest</surname>
          </string-name>
          , W. Weimer,
          <article-title>The manybugs and introclass benchmarks for automated repair of c programs</article-title>
          ,
          <source>IEEE Transactions on Software Engineering</source>
          <volume>41</volume>
          (
          <year>2015</year>
          )
          <fpage>1236</fpage>
          -
          <lpage>1256</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>K.</given-names>
            <surname>Serebryany</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Bruening</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Potapenko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Vyukov</surname>
          </string-name>
          ,
          <article-title>Addresssanitizer: A fast address sanity checker</article-title>
          ,
          <source>in: 2012 {USENIX} Annual Technical Conference ({USENIX}{ATC} 12)</source>
          ,
          <year>2012</year>
          , pp.
          <fpage>309</fpage>
          -
          <lpage>318</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>N.</given-names>
            <surname>Truong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Roe</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Bancroft</surname>
          </string-name>
          ,
          <article-title>Static analysis of students' java programs</article-title>
          ,
          <source>in: Proceedings of the Sixth Australasian Conference on Computing EducationVolume 30</source>
          ,
          <string-name>
            <surname>Citeseer</surname>
          </string-name>
          ,
          <year>2004</year>
          , pp.
          <fpage>317</fpage>
          -
          <lpage>325</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S. H.</given-names>
            <surname>Edwards</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Kandru</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. B.</given-names>
            <surname>Rajagopal</surname>
          </string-name>
          ,
          <article-title>Investigating static analysis errors in student java programs</article-title>
          ,
          <source>in: Proceedings of the 2017 ACM Conference on International Computing Education Research</source>
          ,
          <year>2017</year>
          , pp.
          <fpage>65</fpage>
          -
          <lpage>73</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>