<!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>International Conference on Applied Informatics
Eger, Hungary, January</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Towards Decoupling Nullability Semantics from Indirect Access in Pointer Use∗</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Richárd Szalay</string-name>
          <email>szalayrichard@inf.elte.hu</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Eötvös Loránd University, Faculty of Informatics, Department of Programming Languages and Compilers, Pázmány Péter stny. 1/C.</institution>
          ,
          <addr-line>1117 Budapest</addr-line>
          ,
          <country country="HU">Hungary</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2020</year>
      </pub-date>
      <volume>2</volume>
      <fpage>9</fpage>
      <lpage>31</lpage>
      <abstract>
        <p>The special “null-pointer” (C, C++, Ada) or “null-reference” (Java, C#, Python) value for a pointer-like type is often used to indicate the lack of a meaningful result/data. Accessing a non-existing value is an unnatural operation, resulting in either unpredictable behaviour of the program or the raising of an exception. The usage of pointers often leads to a defensive design: it is expected of the programmer to pre-emptively guard against the null state of a pointer, or handle the resulting exception. Together with a code organisation principle to prefer “early returns”, this defensive mechanism may result in variables in the local scope polluting the list of available symbols. These variables' existence does not pose a performance overhead at run time as virtually all compilers optimise the variable away by caching the loaded value. However, during code comprehension, these symbols remain visible, suggested by code completion tools which hinder understanding. Some programming languages ofer “conditional dereference” operations: in C#, the ?. operator propagates a null reference; in Haskell, the Maybe monad allows expressing such semantics. Modern C++ versions support expressing Maybe-like values with the optional&lt;T&gt; class template, but it encapsulates the value, not the indirect access. Adaptation of new language features or changing user-facing API is often met with business or technical challenges and is thus a slow process. In this paper, we discuss our investigation of the usage of pointer-like types (including iterators) for “nullability” semantics, not only for indirect access. We devised an automated analysis tool that marks potentially redundant pointer variables, lowering the number of visible local symbols. A post-refactoring view can show the landscape of the program where descent</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>in complex data structures (such as configuration maps) is expressed more
concisely.</p>
    </sec>
    <sec id="sec-2">
      <title>1. Introduction</title>
      <p>Configuration* Conf = GetGlobalConfiguration();
if (!Conf)</p>
      <p>return;
ConfigurationKey* SystemKind = Conf→getDataFor("SystemKind");
if (!SystemKind)</p>
      <p>throw InvalidConfiguration("config must contain 'SystemKind'!");
SystemType Sys = (SystemType)SystemKind→value;
switch (Sys) {
case Platform1: /* ... */ break;
/* ... */
}</p>
      <p>Listing 1: Example of C++ program design preferring early returns
when potentially null pointers are used. With minor
transforma</p>
      <p>tions, similar code could detail Java or C#, too.</p>
      <p>
        Several mainstream programming languages support indirect access to values
in memory. In languages such as Java, C# or Python, it is through references,
while other languages, such as C, C++ and Ada uses the term pointers, although
there are no semantic diferences between the two categories. An inherent property
of pointers (or indirect accessors ) is that there is the possibility to assign a null
value to the pointer itself. This null value indicates that the pointer does not point
to any valid value, and various programming languages have defined operating a
null-pointer to be an unexpected operation. In managed or interpreted languages,
such as Java, C#, Lua, Python, etc. a run time exception is raised at the null
dereference. Lower level systems programming languages, such as C, C++ and Ada
define accessing through a null to be an undefined operation, with potential – but
not mandatory – run time support for defence against nulls. While method calls of
an object through a null pointer is undefined behaviour 1 [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], the generated binary
1Code containing erroneous constructs marked as undefined behaviour by the standard allows
the compiler to compile code that does not behave as the developer intended. The lingering
concept of undefined behaviour allows a great set of optimisations to be made, as the compiler
may pretend the developer did not intend to create undefined code. It is also commonly referred
to as a whatever-case, but developers often end up sacrificing full portability for performance in
case they need only support a specific platform.
will run a potential “prefix” of the method’s code without any issue until the first
member access – at which point an ofset in memory from the 0x0 location should
be read – is done.
      </p>
      <p>Due to this, it is common in imperative programming languages with pointers
to develop with a defensive design: the code at all points must either explicitly
guard against the nulls, or specify in comments whether calling a function with
a null argument is valid. Ada supports annotating the access variable with the
Not Null tag, while Eifel ofers optional precondition checks. A common pattern
together with the defensive design is to favour what is commonly referred to as
“early returns”. By early returns, we commonly refer to a technique where the
unlikely or erroneous conditions break the flow – with any flow-control statement,
not just return – of the program ahead, without the “normal” flow being indented
visually. An example of early returns in the context of pointers potentially not
referring to any reasonable value is shown in Listing 1.</p>
      <p>The issue with having to resort to such coding style is that in many cases there
is a potential to reach the useful business logic with several pointer variables
visible in the local scope that are not used in just one dereference, often with a null
check. For example, in Listing 1, the switch statement’s condition could be
written as GetGlobalConfiguration()→getDataFor("SystemKind")→value, were
it not for the potential null value of the intermediate results. The increase of named
symbols in a scope hinders development and code comprehension as development
tools present additional potential suggestions.</p>
      <p>In this paper, we discuss the problem related to null values, focused on the
detection of potentially erroneous program points by an automated tool. In Section 2,
related solutions from other languages and the theory are presented. Section 3
discusses the methodology behind finding bug-prone program sections. We measured
open-source C and C++ projects for the prevalence of the problem, which is detailed
in Section 4.</p>
    </sec>
    <sec id="sec-3">
      <title>2. Related Work</title>
      <p>
        Two potential solutions exist that allows hiding or side-stepping an explicit null
check. The first such solution is mostly known from C# (version 6 and
onwards) as the null conditional operator [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] or via the symbol “ ?.”. The
semantics of ?. is that the member access is only performed if the left-hand side
is not null; otherwise, there is no calculation performed, and the result is null
without evaluating the accessed member itself. The accessed member may be
a data member or a method. Thus, the example in Listing 1 can be rewritten
as GetGlobalConfiguration?.getDataFor("SystemKind")?.value — the result’s
type is the same as value’s type, and it is null if any intermediate step is null;
otherwise, the result is precisely as if the same expression was written without the
? tokens. Compared to explicitly guarding against the null in each step, a
singlestep or chained ?. application has the benefit of concisely expressing a traversal of
calls to obtain a result. It requires, however, a managed language context (where
getGlobalConfiguration :: Maybe Configuration
-- Configuration can not be "null" for this function!
getEntry :: String → Configuration → Maybe Entry
-- Entry can not be "null" either!
getValue :: Entry → Maybe Value
-- "Casting" omitted.
      </p>
      <p>Sys = getGlobalConfiguration &gt;&gt;= (getEntry "SystemKind") &gt;&gt;= getValue
-- Type of 'Sys' is: Maybe Value</p>
      <p>Listing 2: Concise writing of a traversal of a potentially nullable</p>
      <p>chain of function applications.
the null value is intercepted and coalesced before a further call could happen) and
a language with reference semantics where virtually all variable the programmer
could access has a null state. One downside of coalescing the null is that there is no
way to distinguish if the obtained null was because the full expression without the
?s evaluated to null, or because there was an intermediate step where the execution
chain broke.</p>
      <p>
        In Haskell, the Maybe monad can be used to express optional semantics. Maybe
is a data type with two data constructors, Just x – for any value  – or Nothing,
which indicates the lack of value. While the ?. operator in C# works for virtually
every type, the Maybe has to be “channelled through” the types of the functions
involved. Functions taking a Maybe x must either un-box the Just x and be a
partial function, or a total function must be defined that deals with the Nothing
case. A polymorphic definition of the bind operator (&gt;&gt;=) can be used concisely
express calculations where the Nothing case is defined to “just” pass the lack of
value on. (&gt;&gt;=) is a function of type Maybe a → (a → Maybe b) → Maybe b,
i.e. it takes a nullable of type a and applies a calculation on it (if it is not null )
resulting in a potentially null of b.2 An overview of the example of Listing 1
rewritten to Haskell’s Maybe monad can be seen in Listing 2. The downside of
this approach is that the point where the calculation failed cannot be easily found
as the end result is a Nothing. However, developers may use pattern matching
instead of the (&gt;&gt;=) operator, which allows for custom “error handling” codes. A
famous example of a program written in Haskell that deals with the optionality of
data and configuration is Pandoc [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
      <p>
        Pattern matching has been suggested to be a language feature of C++ [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], with
which inspecting values through a pointer can be transcoded to similar syntax as
the Just x and Nothing cases of a function in Haskell. Outside pattern matching,
the optional&lt;T&gt; class template can be used to wrap an object of type T into
a “potentially” null context. The optional instance owns the encapsulated value,
2The actual type of (&gt;&gt;=) is more elaborate as it is designed too handle any Monad instance.
It has been simplified for clarity.
and as such, there is no indirection in the access itself. The optional instance
is convertible to bool and thus can be used in a conditional context, such as to
facilitate early returns. Similar concerns arise with using optional&lt;T&gt; as would
with using Maybe t, namely that the type has to be channelled through the types
of every class and function involved.
      </p>
      <p>
        Various other works detail finding [
        <xref ref-type="bibr" rid="ref21 ref7">7, 21</xref>
        ] or transforming [
        <xref ref-type="bibr" rid="ref4 ref5">4, 5</xref>
        ] programs which
involve null pointers or references, with transformations involving automatically
generating error handling semantics. Several related unsafe programming
constructs have been identified by the authors in [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Our work is similar that it
attempts to identify a potentially unsafe and development-hindering construct.
      </p>
      <p>The modelled constructs in this paper fall into a subclause of taint or garbage
value analysis, which is also often carried out by other means of static analysis,
such as symbolic execution.</p>
    </sec>
    <sec id="sec-4">
      <title>3. Approach</title>
      <p>
        We created an automated tool based on the open-source LLVM/Clang Compiler
Infrastructure’s [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] static analysis framework, which can be used to understand
how developers organise their code around potential null pointers in an automated
fashion. The developed tool works by searching and marking redundant pointers
in the code. Most compilers trivially support automatically warning for unused
variables. A redundant pointer is a relaxation of the unused variable concept.
While these marked variables are not unused in the most rigorous wording – there
exists a usage point like a dereference and potentially a null check –, there is a
chance for the variable to be elided.
      </p>
      <p>Given the example in Listing 1, the idea behind redundant pointers can be
seen. Conf and SystemKind are only used to store a memory address only to be
dereferenced later or flow away on a comparison. Formally, we define potentially
redundant pointers as follows.</p>
      <p>Definition 3.1. Local variables of the function which are of a dereferenceable type
(pointers, smart pointers, iterators, etc.) are potentially redundant if:
• initialised with a value at exactly one point
• used at most once in a “early flow” branch (such as an early
that only range-checks the pointer’s value
return or throw)
• the pointer is passed as an argument or dereferenced exactly once in its
lifetime
We refer to the “early flow branch” in the middle bullet-point as
guards.
3.1. Rewriting single occurrences of variables
Our first goal is to check whether the existence of such local variables is justified.
Abstract examples for the matched source code fragments can be seen in Listing 3.
struct T { int i; T* next; };
T * tp1 = malloc(sizeof(T)), * tp2 = init2(), * tp3 = init3();
free(tp1); // Single argument passing as usage point.
if (!tp2) // Single conditional check.</p>
      <p>return -1; // Flow breaking statement.
printf("%f", sqrt(tp2→i));</p>
      <p>// ∧~~~ Single dereference as usage point.</p>
      <p>T* tnext = tp3→next; // Single dereference as usage point.
T* tnext2 = tnext→next; // Ditto.
free(tnext2); // Single passing of 'tnext2'.</p>
      <p>Listing 3: Various cases of potentially redundant pointers.
free( malloc(sizeof(T)) ); // tp1 substituted.
int tp2i;
if (T* tp2 = init2(); (!tp2) ‖ (tp2i = tp2→i, false))</p>
      <p>return -1;
printf("%f", sqrt(tp2i)); // tp2 substituted.
free(init3()→next→next); // tp3, tnext and tnext2 substituted.</p>
      <p>Listing 4: The examples of Listing 3 rewritten to omit the pointer.</p>
      <p>There are various means to rewrite such potentially unnecessary pointers that
depends on the language – C or C ++ – and the standard – mainly whether C ++17 is
used or earlier – that applies to the project. The static analysis framework allows
for suggesting code changes to the developer, and thus we wrote suggestions on
potential rewrites. The previous example can be seen with the rewrites applied in
Listing 4.</p>
      <p>Certain constructs, such as pointer parameters of a function, loop variables that
are pointers must be ignored by the matching rules as there are no reasonable ways
of removing the variable while also keeping the semantics of the project intact.
Furthermore, the example for tp2 in Listing 3 may only be reasonably rewritten
in the newer C++17 and C++20 standards, and certain other restrictions – such
as that the accessed member must be default-constructible and assignable (either
copy or move) – also apply. The semantics, in this case, is slightly changed due to
the default construction, so it is the responsibility of the developer with domain
knowledge to decide whether the rewrite is sensible.
3.2. Dereference chains
Modelling single occurrences allows for building chains of pointer dereferences,
which we used to identify code constructs similar to those solved in other languages
by operator?., Maybe, or optional (see Section 2).</p>
      <p>Definition 3.2. A sequence of potentially redundant pointers each used in single
dereferences that initialises another variable forms a chain. The last variable
involved in a chain is not necessarily of dereferenceable type.</p>
      <p>For clarity, chains of two are ignored as they are considered in the single
occurrence case detailed in Section 3.1. An example of such a chain is [tp3, tnext,
tnext2] in Listing 3, which can be rewritten step by step eliding the pointer
variable. In case a chain contains a flow breaking statement, the rewrite has to happen
with breaking semantics to a varying degree and changing the types involved to,
e.g. an optional. The head element of a chain might be unusual in a way that it
cannot be removed without changing the interface of the program element at hand.
Such is the case for chains that begin with a loop variable or a function parameter.</p>
      <p>Another solution could be the proposal and implementation of a ?.-like operator
to the language, which takes care of seemingly continuing the calculation when a
“null dereference” is encountered. However, given both the lack of a managed
execution environment of Java or C# and the lack of referential transparency of
functional languages like Haskell, an operation similar to ?. has to be carefully
designed to fit well within the language framework ofered by current standard
C++. Assuming such a feature existed, the example in Listing 1 could be rewritten
as GetGlobalConfiguration?.getDataFor("SystemKind")?.value.</p>
      <p>Chains are built by the traversal of the connections between the single
occurrence cases which usages are marked initialising a new variable from the result of
the dereference.</p>
    </sec>
    <sec id="sec-5">
      <title>4. Evaluation</title>
      <p>We measured a selection of free and open-source projects of various scale and
domain for both C and C++ programming language. The measurement results for
the single occurrence case (see Section 3.1) is detailed in Table 1. It is surprising to
see that virtually all of the cases where pointers (and for C++, other dereferenceable
types) are used in these mature projects happen without any checks for the null
value. This could be attributed to a multitude of reasons. First, the measurement
only considers pointers that have exactly one (meaningful) usage point – it could
be that pointers with multiple usage points are checked more rigorously against a
null dereference. Furthermore, various other means of checking for the potential
null value exists, such as assertions, and macros or short predicate functions that
evaluate to a logical value but do not pass the received pointer-like value further.
The conclusions we can draw from the results is that these pointers contain a hidden
invariant to them, namely, that they will not point to null. This lessens the type
safety of the system and should be rewritten to an Ada Not Null-like type if such
would be available.</p>
      <p>The measurement in Table 2 details the prevalence of chains (see Section 3.2)
in the same set of analysed projects. The first clear result is that the number
of guarded variables within a chain is virtually non-existent. The LLVM/Clang
compiler infrastructure is an outlier with various well-guarded chains, and also
shows multiple longer chains. Given the results, omitting the pointers could be a
possibility to lessen the number of local variables in the function’s scope. Another
interesting result is that the amount of chains with a “trivial” (elidable) head is also
low: almost all of the chains found have been identified with a non-trivial head.
One such example is seen in Figure 1.</p>
    </sec>
    <sec id="sec-6">
      <title>5. Future Work</title>
      <p>
        The initial premise of this work was to show that redundant local pointer variables
pollute the symbol list of the scope, potentially hindering development. We
intend to extend the measurement tool in the future with also measuring how much
percentage of the local symbols these pointers contribute, as in some cases these
seemingly “unused” local variables might contribute to semantic understanding via
their name [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>More concise and compelling analysis methods, such as employing data-flow
and path-sensitive analysis, might also lead to the discovery of further cases and
potential refactoring eforts. As of writing this paper, data-flow information is not
readily available for static analysis tools within the LLVM/Clang tool-chain.</p>
      <p>While this work focused primarily on C and C++ projects, a similar problem
with potentially elidable local references without a solution via language element
exists in Java, which is an often-used application development language.
1 2 9 5 3 1 1 5
6
3
D</p>
      <p>4</p>
      <p>O
n e
e t
s
e
c r
n . n
io G e um ion re ed nu se ay
ssre . 81 80 71 23 77 93 42 75 75 26 52 80 28 99 ftoop lco. ehp .Drt) frceen cgon iilita tam
xp oN 5 2 9 22 3 1 1 77 17 2 2 5 sce G tre p( ree ic in th .se
E 1 n . e e d ren to sse lru
e e h e
rr p w rf is fee red ca eg
t - - - - - - - 2 1 0 2 0 3 01 cu ty re s e ed ro s a
ce 0 4 5 6 r r
j 1 7 2
b
]
3
[
g ] ] ]
t
c</p>
      <p>
        ]
] 7 ] n 5 8 0
4 ] 13 ] la [1 [1 [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]
[
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] 0 5
e
jro ]22 ]4 ta [16 rse [19 [1 i[n li[6 /C CV fuB trca [s2
P [l [2 ad P tsg isd xu tco tez VM en too sse rce
ru it te H o e M i u L p r e e
c g n P P R T B g L O P T X
      </p>
      <p>C
2 2 1 2 3 2
]
3
[
re sg isn i-n eb .c
f
re i t
e dn leb ead ton ,ee
d fin ia h</p>
      <p>n l
t eh rav li a b
a c i</p>
      <p>a
n T
a y iv t r
n d an t-r en av
d .
u se
ro th in re w on
f r a b i
sg fo ch -w in tc
n ) e flo s n
id .2 th a ian fu
ifn 3 f y h a
e n o b c g
D s d</p>
      <p>n e n eh ud
: i p i</p>
      <p>u a t
e2 cah ro ch se e</p>
      <p>d
2</p>
      <p>8
2 3 4 2 1 3 9</p>
      <p>3
8 4 8 3 2 8 2 1 9 8 9 9 2
5 3 2 2 5 3 8
th io h d o ie</p>
      <p>f n
t t
f c g e</p>
      <p>d r b
o e n r e
50 3 1 3 10 ils eS le au bm ito</p>
      <p>
        tea (se y g u t
1 b s
i n e
e
jro ]22 ]4 ta [16 rse [19 [1 i[n li[6 /C CV fuB trca [s2
P l[ [2 ad P tsg isd xu tco tez VM en too sse rce
ru it te H o e M i u L p r e e
c g n P P R T B g L O P T X
] ]7 ] gn ]5 ]8 ]0 l t id
4 ] 13 ] la [1 [1 [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] ab cen reg cah ica le
[
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] 0 5
      </p>
      <p>T e a e d
C
+
+</p>
      <p>C</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>Baráth</surname>
            ,
            <given-names>Á.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Porkoláb</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          :
          <article-title>Towards Safer Programming Language Constructs</article-title>
          , Studia Universitatis Babes,-Bolyai,
          <source>Informatica LX.1 (June</source>
          <year>2015</year>
          ), pp.
          <fpage>19</fpage>
          -
          <lpage>34</lpage>
          , issn:
          <fpage>2065</fpage>
          -
          <lpage>9601</lpage>
          , url: http : / / cs . ubbcluj . ro / ~studia - i / contents / 2015 - 1 /
          <fpage>02</fpage>
          - BarathPorkolab.pdf.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <surname>Butler</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wermelinger</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yu</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sharp</surname>
          </string-name>
          , H.:
          <article-title>Exploring the Influence of Identifier Names on Code Quality: An Empirical Study</article-title>
          ,
          <source>in: 2010 14th European Conference on Software Maintenance and Reengineering</source>
          , Mar.
          <year>2010</year>
          , pp.
          <fpage>156</fpage>
          -
          <lpage>165</lpage>
          , doi: 10.1109/CSMR.
          <year>2010</year>
          .
          <volume>27</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          <article-title>[3] Clang: a C language family frontend for the LLVM Compiler Infrastructure, online</article-title>
          , http://clang.llvm.
          <source>org, version 9</source>
          .0, accessed 2019-
          <volume>12</volume>
          -30, The LLVM Foundation,
          <year>2001</year>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Dobolyi</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Weimer</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          :
          <article-title>Changing Java's Semantics for Handling Null Pointer Exceptions</article-title>
          ,
          <source>in: 2008 19th International Symposium on Software Reliability Engineering (ISSRE)</source>
          ,
          <year>Nov</year>
          .
          <year>2008</year>
          , pp.
          <fpage>47</fpage>
          -
          <lpage>56</lpage>
          , doi: 10.1109/ISSRE.
          <year>2008</year>
          .
          <volume>59</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Durieux</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cornu</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Seinturier</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Monperrus</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Dynamic patch generation for null pointer exceptions using metaprogramming</article-title>
          ,
          <source>in: 2017 IEEE 24th International Conference on Software Analysis, Evolution and Reengineering</source>
          (SANER),
          <year>Feb</year>
          .
          <year>2017</year>
          , pp.
          <fpage>349</fpage>
          -
          <lpage>358</lpage>
          , doi: 10.1109/SANER.
          <year>2017</year>
          .
          <volume>7884635</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6] guetzli, online, http : / / github . com / google / guetzli, version
          <volume>1</volume>
          .0.1, accessed 2019-
          <volume>12</volume>
          -30, Google, Inc.,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Hovemeyer</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pugh</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          :
          <article-title>Finding More Null Pointer Bugs, but Not Too Many</article-title>
          ,
          <source>in: Proceedings of the 7th ACM SIGPLAN-SIGSOFT Workshop on Program Analysis for Software Tools and Engineering</source>
          , PASTE '
          <fpage>07</fpage>
          , San Diego, California, USA: Association for Computing Machinery,
          <year>2007</year>
          , pp.
          <fpage>9</fpage>
          -
          <lpage>14</lpage>
          , isbn: 9781595935953, doi: 10.1145/1251535.1251537, url: https://doi.org/10.1145/1251535.1251537.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          <source>[8] ISO/IEC JTC 1/SC 22: ISO/IEC 14882:2017 Information technology - Programming</source>
          languages - C++, version 17 (C++17) , Geneva, Switzerland: International Organization for Standardization, Dec.
          <year>2017</year>
          , p.
          <volume>1605</volume>
          , url: http://iso.org/ standard/68564.html.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>MacFarlane</surname>
          </string-name>
          , J.:
          <article-title>Pandoc: the Universal Document Converter, online</article-title>
          , http : / / pandoc.org,
          <source>accessed 2020-01-19</source>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Marriott</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          et al.: tmux, online, http://github.com/tmux/tmux, version
          <volume>3</volume>
          .0, accessed 2019-
          <volume>12</volume>
          -30,
          <fpage>2007</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>Microsoft</given-names>
            <surname>Inc</surname>
          </string-name>
          .:
          <article-title>Null-conditional operators ?</article-title>
          . and ?[],
          <string-name>
            <surname>accessed</surname>
          </string-name>
          <year>2020</year>
          -
          <volume>01</volume>
          -18, Sept.
          <year>2019</year>
          , url: http : / / docs . microsoft . com / en - us / dotnet / csharp / language - reference/operators/member
          <article-title>-access-operators#null-conditional-operators-</article-title>
          <string-name>
            <surname>-</surname>
          </string-name>
          and-.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>Murzin</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Park</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sankel</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sarginson</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          : Pattern Matching, online, http://open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf, accessed
          <year>2020</year>
          -
          <volume>01</volume>
          -19, Jan.
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <surname>Nakamoto</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <source>The Bitcoin Core Developers</source>
          , et al.: Bitcoin, online, http: //bitcoincore.org,
          <source>version 0.19.0</source>
          .1, accessed 2019-
          <volume>12</volume>
          -30,
          <fpage>2009</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <surname>Netdata</surname>
          </string-name>
          , online, http://my-netdata.
          <source>io, version 1.19.0</source>
          , accessed 2019-
          <volume>12</volume>
          -30,
          <string-name>
            <given-names>Netdata</given-names>
            <surname>Corporation</surname>
          </string-name>
          ,
          <fpage>2013</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15] OpenCV, online, http://opencv.org, version
          <volume>4</volume>
          .2.0, accessed 2019-
          <volume>12</volume>
          -30,
          <string-name>
            <surname>Xperience</surname>
            <given-names>AI</given-names>
          </string-name>
          ,
          <fpage>2019</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <surname>PHP: Hypertext</surname>
            <given-names>Preprocessor</given-names>
          </string-name>
          , online, http://php.net,
          <source>php-src version 7.4</source>
          .1, accessed 2019-
          <volume>12</volume>
          -30, The PHP Group,
          <year>1999</year>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17] PostgreSQL, online, http : / / postgresql . org, version
          <volume>12</volume>
          .1, accessed 2019-
          <volume>12</volume>
          -30, The PostgreSQL Global Development Group,
          <fpage>1996</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Protocol</surname>
            <given-names>Bufers</given-names>
          </string-name>
          , online, http : / / developers . google . com / protocol - buffers/, version 3.11.2, accessed 2019-
          <volume>12</volume>
          -30, Google, Inc.,
          <fpage>2008</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <surname>Sanfilippo</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          et al.: Redis, online, http://redis.io,
          <source>version 5.0.7, accessed 2019-12-30</source>
          ,
          <fpage>2006</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <surname>Smith</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Google</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          , et al.:
          <source>Tesseract OCR Engine</source>
          , online, http://github. com/tesseract-ocr/tesseract, version
          <volume>4</volume>
          .1.0, accessed 2019-
          <volume>12</volume>
          -30,
          <fpage>2006</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <surname>Spoto</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Precise null-pointer analysis</article-title>
          ,
          <source>Software &amp; Systems Modeling 10.2</source>
          (
          <issue>2011</issue>
          ), pp.
          <fpage>219</fpage>
          -
          <lpage>252</lpage>
          , issn:
          <fpage>1619</fpage>
          -
          <lpage>1374</lpage>
          , doi: 10 . 1007 / s10270 - 009 - 0132 - 5, url: https : //doi.org/10.1007/s10270-009-0132-5.
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <surname>Stenberg</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          et al.: curl, online, http://curl.haxx.se, version
          <volume>7</volume>
          .67.0, accessed 2019-
          <volume>12</volume>
          -30,
          <fpage>1996</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <surname>The</surname>
            <given-names>LLVM</given-names>
          </string-name>
          <article-title>Foundation: LLVM/Clang: C-language family frontend for the LLVM Compiler Infrastructure Project, online</article-title>
          , http://clang.llvm.org,
          <source>accessed 2020-01- 19</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <surname>Torvalds</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          et al.: git, online, http://git-scm.
          <source>org, version 2.24.1, accessed 2019-12-30</source>
          ,
          <fpage>2005</fpage>
          -.
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <surname>Xerces</surname>
            <given-names>C</given-names>
          </string-name>
          ++, online, http://xerces.apache.
          <source>org, version 3.2</source>
          .2, accessed 2019-
          <volume>12</volume>
          - 30, The Apache Software Foundation,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>