<!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>F-IKOS: An Abstract Interpretation-based Static Analyzer for Fortran Programs</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Sheng Zou</string-name>
          <email>zous@nudt.edu.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
          <xref ref-type="aff" rid="aff4">4</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Liqian Chen</string-name>
          <email>lqchen@nudt.edu.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
          <xref ref-type="aff" rid="aff4">4</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Guangsheng Fan</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
          <xref ref-type="aff" rid="aff4">4</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Renjie Huang</string-name>
          <email>renjiehuang@nudt.edu.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
          <xref ref-type="aff" rid="aff4">4</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Banghu Yin</string-name>
          <email>bhyin@nudt.edu.cn</email>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
          <xref ref-type="aff" rid="aff4">4</xref>
        </contrib>
        <contrib contrib-type="editor">
          <string-name>Fortran, Static Analysis, Abstract Interpretation, Floating-point Program Analysis</string-name>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>College of Computer Science and Technology, National University of Defense Technology</institution>
          ,
          <addr-line>Changsha 410073</addr-line>
          ,
          <country country="CN">China</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>College of Systems Engineering, National University of Defense Technology</institution>
          ,
          <addr-line>Changsha 410073</addr-line>
          ,
          <country country="CN">China</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>State Key Laboratory of Complex &amp; Critical Software Environment</institution>
          ,
          <addr-line>Changsha 410073</addr-line>
          ,
          <country country="CN">China</country>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>a Fortran program analyzer on top of the Inference Kernel</institution>
        </aff>
        <aff id="aff4">
          <label>4</label>
          <institution>to Software Quality</institution>
        </aff>
      </contrib-group>
      <fpage>27</fpage>
      <lpage>34</lpage>
      <abstract>
        <p>The Fortran programming language is widely utilized in numerical computation and scientific computing. Fortran programs are prone to potential runtime errors related to numerical properties due to the large number of numerical operations. In this paper, we present F-IKOS, an abstract interpretation-based static analyzer for Fortran programs on top of IKOS, which soundly handles floating-point types in Fortran programs. Firstly, we translate Fortran programs to LLVM IR using compiler front-end Flang. After that, we extend IKOS to support sound floating-point analysis and then employ it to analyze the translated LLVM IR. Particularly, when analyzing lfoating-point types in programs, we first abstract floating-point expressions into real-number expressions with interval coeficients, and then linearize these expressions into real-number expressions with scalar coeficients. These linear expressions are subsequently handled by abstract domains originally designed for real-number types to produce sound analysis results. We have conducted experiments on representative Fortran programs to show the eficiency and efectiveness of soundly analyzes runtime errors in complex programs, outperforming other analyzers.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        The Fortran programming language is one of the oldest
high-level programming languages and one of the first to be
widely adopted for scientific computing. Additionally,
several numerical computation libraries, including BLAS[
        <xref ref-type="bibr" rid="ref17">17</xref>
        ],
which are developed in Fortran, have significantly
contributed to the widespread use of Fortran in domains such
as numerical computing and high-performance computing.
Compared with mainstream high-level programming
languages such as C++ and Java, Fortran possesses a distinctive
set of features, such as powerful array manipulation and
abundant intrinsic functions for numerical computation.
      </p>
      <p>
        However, Fortran programs are prone to potential
runtime errors related to numerical aspects such as
divisionby-zero and arithmetic overflow due to the large number of
numerical operations. Researchers have dedicated eforts
to the analysis and verification of Fortran programs.
Previous research on the analysis of Fortran programs can be
mainly classified into three categories: Firstly, approaches
such as f2c [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and FABLE [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] convert Fortran programs to
other high-level language programs and verify them using
verifiers over the converted high-level language programs.
Secondly, approaches such as SMACK [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] and CIVL [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]
translate Fortran programs to Intermediate Representation (IR),
which is then verified using verifiers for IR, mainly based on
model checking. Additionally, some static analyzers such
as FORTRAN-lint [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], ftnchek [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] and Coverity [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]
detect certain generic defects, such as dead code and variable
usage problems, using pre-defined patterns.
      </p>
      <p>
        Fortran programs are characterized by the extensive use
of floating-point operations, which are crucial for achieving
high precision and scale in numerical computing tasks, such
as solving diferential equations. Every floating-point type
QuASoQ 2024: 12th International Workshop on Quantitative Approaches
for Open Static Analyzers (IKOS [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]) to implement the
proposed approach, named F-IKOS. F-IKOS utilizes Flang[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]
to translate Fortran programs into LLVM Intermediate
Representation (LLVM IR) and then leverages IKOS to analyze
the LLVM IR. The core of F-IKOS is IKOS, which is a static
analyzer based on abstract interpretation. IKOS can use
abstract domains from the Apron [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] numerical abstract
domain library to analyze programs. However, it mainly
detects runtime errors in machine integer types and cannot
infer invariants on floating-point types [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. In our
implementation, we first extended
      </p>
      <sec id="sec-1-1">
        <title>IKOS to support floating-point</title>
        <p>types, and then applied the proposed approach to handle
lfoating-point operations soundly. With these extensions,
FIKOS can analyze floating-point types in Fortran programs
and obtain sound analysis results. We conducted
experiments over benchmarks consisting of representative Fortran
programs and the evaluation results demonstrate the
eficiency, efectiveness, and utility of the analyzer F-IKOS. The
main contributions of this work are as follows:
• We proposed an approach to soundly abstract
lfoating-point operations in Fortran programs,
accounting for rounding errors during program
analyCEUR
Workshop</p>
        <p>ceur-ws.org
ISSN1613-0073
sis.
• We developed F-IKOS, a static analyzer for Fortran
programs, to implement the proposed approach.
FIKOS can soundly analyze floating-point types in
Fortran programs.
• Evaluation shows that F-IKOS can handle the
complex syntax of Fortran programs and produce sound
analysis results, outperforming other relevant
Fortran analyzers.</p>
        <p>The rest of the paper is organized as follows. Section
2 describes background. Section 3 presents the overview
of our analyzer F-IKOS. Section 4 presents the proposed
abstraction of floating-point expressions. Section 5 presents
our analyzer implementation together with experimental
results. Section 6 discusses some related work and Section
7 concludes.</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>2. Background</title>
      <p>2.1. The Fortran Programming Language
The Fortran programming language is a well-established
high-level language with many syntax standards, such as
Fortran 77 and Fortran 90. Fortran has similarities to other
high-level programming languages. For example, Fortran
includes common control structures such as conditional
statements and looping control structures. However, Fortran
programs often emphasize numerical computation tasks
more than logical control functions. This is reflected by the
fact that Fortran has a wealth of intrinsic functions, such as
the trigonometric functions sin, cos, asin, and acos.</p>
      <p>Besides, Fortran has a rich set of convenient array
operations. Fortran supports flexible array boundaries, such
as   ∶∶  (−3 ∶ 3) , indicating that the index of array
 ranges from -3 to 3. It also provides a range of intrinsic
functions for arrays, including sum and product, as well as
matmul and dot_product for computing matrix products
and dot products. Fortran inherently supports
multidimensional arrays and ofers mechanisms for array slicing and
reshaping. For instance, the reshape function facilitates
altering the number of dimensions and the size of each
dimension within an array. Due to these characteristics,
Fortran is widely used in scientific and high-performance
computing.
2.2. The Floating-point Representation
The floating-point representation adheres to the IEEE-754
standard. Many high-precision real numbers, cannot be
exactly represented by floating-point numbers. The
IEEE754 standard provides four rounding modes: nearest, zero,
−∞, and +∞, to approximate real numbers using
floatingpoint numbers. This approximation can introduce rounding
errors, which result in inexactness.</p>
      <p>Due to rounding errors, mathematical properties followed
by real number operations do not hold in floating-point
operations. We illustrate it with an example. To distinguish
between real and floating-point numbers and their respective
operators, we employ  (⋅) to represent floating-point
numbers in machines and denote real number operators using
symbols +, −, ×, /, while denoting floating-point operators
using ⊕ , , ⊖ , , ⊗ , , ⊘ , where the subscripts  ,  denote
diferent precision and rounding modes. Real numbers like
0.1, 0.2, and 0.3 cannot be exactly represented by machines.</p>
      <p>Under real number semantics, the equation 0.1 + 0.2 = 0.3
holds. But in machines,  (0.1) ⊕  ,  (0.2) is not equal
to  (0.3) . Furthermore, the law of association and
distribution is not always true in floating-point operations. E.g.,
it may happen that
( ()⊕
 ,  ())⊕
 ,  () ≠  ()⊕
 , ( ()⊕
 ,  ())
2.3. Rounding Model of IEEE-754
A simplified rounding model of the IEEE-754 standard
follows the equation below:</p>
      <p>() =  × (1 + ) + 
where || ≤  , || ≤  , and  ×  = 0 . When  is a normalized
number, it holds that  = 0 , and when  is a denormalized
number, it holds that  = 0 . Here,  denotes the maximum
relative error for normalized numbers, and  describes the
maximum absolute error for denormalized numbers for
specific precision of floating-point numbers.</p>
      <sec id="sec-2-1">
        <title>2.4. Linearization</title>
        <p>An interval linear expression is an expression where the
coeficients may be intervals instead of scalars. For instance,
 = [ 1,  1] + [ 2,  2]</p>
        <p>Interval linear expressions, in which the coeficients are
intervals, can be abstracted into linear expressions with
scalar coeficients. This process is linearization, and it is
defined as follows:</p>
        <p>Definition 1 (Linearization). An interval linear
expression ∑ [  ,   ] ×   + [, ] can be linearized into a linear
expression ∑   ×  +[ ′,  ′], where   ∈ [  ,   ] and satisfying
∑ [  ,   ] ×   + [, ] ⊆ ∑   ×   + [ ′,  ′] for all   ∈ [  ,   ]
where   ≤   ≤   .</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Overview</title>
      <p>
        In this section, we give an overview of our approach. We
develop a static analyzer on top of IKOS [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], named F-IKOS,
to perform sound analysis of floating-point types in Fortran
programs. The architecture and workflow of F-IKOS are
illustrated in Fig. 1, highlighting our modifications to
enable the sound analysis of floating-point types in Fortran
programs. Initially, F-IKOS takes Fortran programs as input
and uses the parser Flang [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] to translate programs into
LLVM IR. Subsequently, after optimization and processing,
F-IKOS uses extended IKOS together with numerical
abstract domains from Apron [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] to analyze the LLVM IR and
obtain invariants of programs. Finally, potential runtime
errors in programs are checked by utilizing these invariants.
      </p>
    </sec>
    <sec id="sec-4">
      <title>4. Approach</title>
      <p>
        Fortran programs involve numerous floating-point
operations, and analyzing these programs within the abstract
interpretation framework by simply treating floating-point
expressions as real-number expressions may result in unsound
results. This occurs because floating-point numbers in
programs are rounded before being passed to abstract domains
(e.g., Apron [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]). For example, within the polyhedra abstract
domain, linear constraints between variables are collected
Fortran program
      </p>
      <p>Flang</p>
      <p>Representation
LLVM Immediate LLVM2AR
Representation
(AR)
Floatingpoint Type</p>
      <p>Sound
of
Floating</p>
      <p>point
Linearization</p>
      <p>IKOS Library
(LLVM IR)</p>
      <p>Front-end
Fixed Point
Iterators
.
.</p>
      <p>.
Domains</p>
      <p>Uses</p>
      <p>Analyzer:</p>
      <p>IKOS</p>
      <p>Analysis result
Apron Numerical</p>
      <p>Library
⊖ , , ⊗ , , ⊘ , ), these expressions are under floating-point
semantics. Directly interpreting floating-point expressions
as expressions under real-number semantics introduces
unsoundness to the analysis. For instance, (rnd() ⊕  , rnd( ))
is not equivalent to ( +  )</p>
      <p>under real-number semantics.</p>
      <p>
        To address this challenge, Miné [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] proposes to
overapproximately abstract floating-point expressions into
realnumber expressions. The approach includes the following
⊕ , ,
three steps:
1. Abstract the deterministic semantics of
floatingpoint expressions into non-deterministic semantics
on real-number expressions.
2. Convert the non-deterministic semantics of real
numbers into deterministic semantics for real
numbers.
3. Analyze programs with real-number operations
using abstract domains initially designed for programs
with real-number types.
      </p>
      <p>In this section, we present the following three steps:
sound abstraction of floating-point expressions,
linearization of interval linear expressions, and the analysis of
programs using abstract domains.
4.1. Abstraction of Floating-point</p>
      <sec id="sec-4-1">
        <title>Expressions</title>
        <p>can be represented as:
follows.
 ()
Abstraction of floating-point numbers.</p>
        <p>Floating-point
types in Fortran programs adhere to the IEEE-754 standard.
Given the value of a floating-point number and its precision,
using the rounding model outlined in Section 2.3, we can
compute the relation of  ()
and  (the interval range) as
When  is a normalized number, the relation of  and
 () =  × [1 − , 1 + ]</p>
        <p>() =  + [− ,  ]</p>
        <p>When  is a denormalized number (i.e., close to zero), the
relation of  and  ()</p>
        <p>is given by:
where  denotes the maximum relative error for normalized
numbers, and  represents the maximum absolute error for
(1)
(2)</p>
        <p>Precision
single (32 bits)
double (64 bits)
quad (128 bits)</p>
        <p>2−23
2−52
2−112

2−149
2−1074
2−16494
2 regardless of whether  is a normalized or denormalized
number.</p>
        <p>
          () =  × ([1 − , 1 + ]) + [− ,  ]
(3)
ators. Miné [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ] proposes a method for abstracting
expressions involving floating-point operators into real-number
expressions. This approach captures rounding errors of
lfoating-point arithmetic by over-approximating the
behavior of floating-point operators using real-number semantics.
        </p>
        <p>Assume that  ()
and  ( )
are two floating-point
expressions, with  and  representing the corresponding
real-number expressions. Let  and  be real numbers, and
let  and  denote the relative and absolute errors,
respectively, which depend on the precision of the floating-point
types.</p>
        <p>
          Non-linear operators (such as ⊗ , and ⊘ , ) can be
handled by applying the corresponding operator on intervals
after ”intervalizing” the arguments [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]. The operator | ⋅ |
is used to ”intervalize” the argument by a single interval
[
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]. When multiplying two linear forms that have not been
reduced to an interval, the operator | ⋅ | can be applied to
either argument. Similarly, operator | ⋅ | can be applied to
the divisor to obtain a single interval before performing
division.
        </p>
        <p>
          The abstraction is described as follows [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]:
 ⊕  ,  = ( +  ) × [1 − , 1 + ] + [− ,  ]
 ⊖  ,  = ( −  ) × [1 − , 1 + ] + [− ,  ]
 ⊗  , [ 0,  0] =  × [1 − , 1 + ] ⋅ [
0,  0] + [− ,  ]
[ 0,  0] ⊗ ,  =  ⊗  , [ 0,  0]
 ⊗  ,  =  × [1 − , 1 + ] ⋅ | |

 ⊗  ,  =  × [1 − , 1 + ] ⋅ ||
 + [− ,  ]
 + [− ,  ]
 ⊘  , [ 0,  0] =  × [1 − , 1 + ]/[
0,  0] + [− ,  ]
 ⊘  ,  =  × [1 − , 1 + ]/| |
 + [− ,  ]
 () ⊕
        </p>
        <p>,  ( )
 () =  × [1 − , 1 + ] + [− ,  ]
 ( ) =  × [1 − , 1 + ] + [− ,  ]
ators.
where
programs, variables (or constants) and operators in
expressions are under floating-point semantics. We abstract
expressions that involve floating-point variables and
perform floating-point arithmetic into real-number expressions,
which involve real-number variables and real-number
operabstracted into a real-number expression as follows:
The floating-point expression  () ⊕
 ,  ( )
can be
Substituting these into the expression, we get
( ×([1−, 1+])+[− ,  ])⊕</p>
        <p>, ( ×([1−, 1+])+[− ,  ])
Since  ⊕  ,  =  ( +  ), we convert Formula
5 as:
 ((( +  )([1 − , 1 + ]) + 2 × [− ,  ]))
as:</p>
        <sec id="sec-4-1-1">
          <title>Thus, the expression  () ⊕</title>
          <p>,  ( )
can be abstracted
( +  )[(1 − )</p>
          <p>2, (1 + ) 2] + [−(3 + 2) , (3 + 2) ]</p>
          <p>By following this approach, the floating-point expression
 () ⊖</p>
          <p>,  ( )
real-number expression, as illustrated:</p>
          <p>can be abstracted into its corresponding
( −  )[(1 − )</p>
          <p>2, (1 + ) 2] + [−(3 + 2) , (3 + 2) ]</p>
          <p>When multiplying two linear forms, the operator | ⋅ | can
be applied to either argument to obtain an interval range
of the argument. In this case, we apply | ⋅ | to the second
argument. The floating-point expression  () ⊗
can be abstracted through the following steps:</p>
          <p>Assume [, ] = | ( )| × [1 − , 1 + ] + [− ,  ]
 () ⊗
 ,  ( )
can be converted into
 () ⊗</p>
          <p>, [, ]</p>
          <p>Given that  () =  × [1 − , 1 + ] + [− ,  ]
[ 0,  0] =  ( × [</p>
          <p>0,  0]) =  × [1 − , 1 + ] ⋅ [
we can express Formula 8 as follows:
 ,  ( )
, then</p>
          <p>(8)
and  ⊗  ,
0,  0] + [− ,  ] ,
 
( × [1 − , 1 + ] ⋅ [, ] + [− ,  ] ⋅ [, ]
)
as:
Thus, the expression  () ⊗
 ,  ( )
can be abstracted
 ×[(1−) 2, (1+) 2]⋅[, ]+[−(1+) , (1+) ]⋅[, ]+[− ,  ]
(4)
(5)
(6)
(7)
(9)</p>
          <p>inequalities).</p>
          <p>Similarly, we apply | ⋅ | to the divisor to obtain a single
interval before performing the division. The floating-point
expression  () ⊘
 ,  ( )</p>
          <p>can then be abstracted into its
corresponding real-number expression, as illustrated below:
 ×[(1−) 2, (1+) 2]/[, ]+[−(1+) , (1+) ]/[, ]+[− ,  ]</p>
          <p>The coeficients of variables within the real-number
expressions obtained by abstraction are represented as
realnumber intervals. However, many abstract domains cannot
process such interval-coeficient forms, as they only support
linear expressions.
(10)
4.2. Linearization of Interval Linear</p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>Expressions</title>
        <p>
          To enable existing numerical abstract domains (e.g.,
polyhedra abstract domain) to handle interval linear
expressions, Miné [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ] proposes to linearize these interval
linear expressions to linear expressions. The core idea is
as follows: Supposing variable   ranges over the interval
[  ,   ], an interval linear expression Σ [  ,   ] ×   + [, ]
can
be over-approximated by a linear expression of the form
Σ   ×   + [ ′,  ′]. This approach converts real-number
interval linear expressions into real-number linear expressions
with scalar coeficients. The existing numerical abstraction
domain initially designed for real-number semantics can
directly analyze these expressions. We present our approach
to linearize interval linear expressions.
        </p>
        <p>
          Drawing inspiration from [
          <xref ref-type="bibr" rid="ref19 ref2">2, 19</xref>
          ], we define the
linearization of interval linear expressions within real-number
semantics as follows:
        </p>
        <p>Definition 2 (Linearization Operator).</p>
        <p>Given an
interval linear expression  ∶ ( ∑ [  ,   ] ×   + [, ]) , and
letting x ∶= [ , ] be the bounding box of variable x, the
linearization operator is defined as
 (,</p>
        <p>x) =</p>
        <p>∑   ×   + [ ′,  ′]
interval   = (  +   ) × 0.5.</p>
        <p>where   is any real number in the interval [  ,   ], and
[ ′,  ′] denotes the resulting interval of ∑ [  −   ,   −   ] ×
[  ,   ] + [, ] . Generally, we choose the midpoint of the</p>
        <p>We provide the proof of the soundness of the linearization
operator through the following reasoning:
∑ [  ,   ] ×   + [, ]
∑ (  + [  −   ,   −   ]) ×   + [, ]
∑   ×   + ∑[  −   ,   −   ] ×   + [, ]</p>
        <p>⟺
⟺




can be over-approximated as</p>
        <p>∑   ×   + ([  −   ,   −   ] × [  ,   ]) + [, ]
since it holds that [  −   ,   −   ] ×   ⊆ [  −   ,   −   ] × [  ,   ],
where   ≤   ≤   and</p>
        <p>≤   ≤   .</p>
        <p>
          Note that following the same principle, an interval linear
a linear inequality in the form of ∑
inequality ∑ [  ,   ]×  +[, ] ≤ 0 can be also linearized into
  ×   + [ ′,  ′] ≤ 0 in the
sense of weak solution [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ]. It means that a weak solution
of an interval linear inequality ∑ [  ,   ] ×   + [, ] ≤ 0
be a solution of ∑   ×   + [ ′,  ′] ≤ 0 (but the reverse does
will
not hold). This approach over-approximates interval linear
expressions (or inequalities) up into linear expressions (or
4.3. Analyze programs with existing
abstract domains
Due to the sound handling of rounding errors inherent in
lfoating-point operations through the above abstraction and
linearization procedure, we can now obtain sound results
using abstract domains initially designed for real-number
semantics.
5. Implementation and Evaluation
        </p>
      </sec>
      <sec id="sec-4-3">
        <title>5.1. Implementation</title>
        <p>We have implemented a static analyzer for Fortran programs,
named F-IKOS, with over 4K LOC of C++ code by extending
IKOS. F-IKOS is endowed with the capability to perform
sound analysis of floating-point types in Fortran programs.
5.2. Research Questions and Experimental</p>
        <p>
          Setup
To evaluate F-IKOS, we compare it with two most relevant
Fortran program analyzers, SMACK [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ] and CIVL [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ]. Both
SMACK and CIVL translate Fortran programs into IR for
subsequent verification using IR-compatible verifiers, mainly
based on model checking. They are designed to verify
certain program properties but do not directly detect potential
errors in Fortran programs.
        </p>
        <p>We investigate the following three research questions
across the analyzers:
• RQ1: How efective is F-IKOS in analyzing simple</p>
        <p>Fortran programs?
• RQ2: How well does F-IKOS handle complex
features of Fortran programs?
• RQ3: How does F-IKOS perform when applied to
real-world Fortran programs?</p>
        <p>
          To address these questions, we conducted three
experiments to evaluate the capabilities of F-IKOS. The
benchmarks employed in our experiments are categorized into
three distinct classes:
• 36 Fortran programs used by SMACK [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ] and CIVL[
          <xref ref-type="bibr" rid="ref8">8</xref>
          ],
which are used to evaluate F-IKOS’s ability to handle
simple syntaxs and accomplish verification tasks.
• 45 real-world Fortran programs extracted from
opensource repositories [
          <xref ref-type="bibr" rid="ref21 ref22">22, 21</xref>
          ], encompassing various
Fortran syntax standards.
• 10 artificially constructed programs, derived from
the repository [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ], designed to evaluate the
capability of F-IKOS in detecting runtime errors associated
with floating-point types.
        </p>
        <p>
          All experiments were conducted on a PC running Ubuntu
20.04 (16GB Memory) in the Oracle VirtualBox 6.1.30 with
a 3.3GHz Intel Core i9 CPU. The abstract domain used is
Polka [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ], which is an implementation of the Polyhedra
abstract domain in Apron.
5.3. RQ1: Verifying simple Fortran
        </p>
        <p>
          programs
We analyzed 36 simple Fortran programs from the first
benchmark [
          <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
          ], excluding parallel and recursive program
instances. The experimental results are presented in
Table 2, where ”F-IKOS Time (s)”, ”SMACK Time(s)” and ”CIVL
Time (s)” denote the execution time of F-IKOS, SMACK, and
CIVL, respectively. In the last row of Table 2, the average
execution time of programs is recorded.
        </p>
        <p>Specifically, SMACK successfully verified only 19 out of 36
programs. In contrast, CIVL correctly verified all 36
programs, and F-IKOS successfully completed the analysis of
the majority (30 out of 36). Further analysis of the unverified
programs by F-IKOS reveals that most required disjunctive
invariants for successful verification, are out of the
expressiveness of the used polyhedra abstract domain, whereas
CIVL, with the help of the SMT solver (i.e., Z3), can address
them efectively.</p>
        <p>Furthermore, a comparative analysis of the average
execution time reveals that F-IKOS exhibits shorter analysis
time, approximately 5% of SMACK’s and 10% of CIVL’s. The
experimental results underscore F-IKOS’s ability to achieve
a delicate balance between analysis eficiency and
efectiveness, demonstrating its strengths compared to existing
state-of-the-art Fortran analyzers.</p>
        <p>RQ-1 Answer: F-IKOS undergoes comparison with
SMACK and CIVL for the analysis of 36 Fortran programs.
It successfully verified 30 out of 36 programs, exhibiting a
shorter average execution time compared with
state-of-theart approach and about 10% of CIVL’s. The results highlight
the eficiency and efectiveness of F-IKOS in analyzing
simple Fortran programs.
5.4. RQ2: Handling complex feature
operations
We analyzed 45 Fortran programs from the second
benchmark. The programs in this benchmark utilize features and
intrinsic functions in Fortran that have not been previously
examined. Some programs exemplify common Fortran
programming conventions, while others involve algorithmic
implementations. The inclusion of integer and
floatingpoint types, along with arrays, increases the complexity of
analyzing the programs.</p>
        <p>In addition to the Fortran 90 standard programs, some
programs following Fortran 77, and Fortran 95 standards are
also included in bold in the table. The evaluation results in
the eficiency and efectiveness of the analyzers are shown
in Table 3. ”F-IKOS (s)” and ”F-IKOS FP” illustrate the
Execution Time and False Positives (FP) of F-IKOS, respectively.</p>
        <p>The experimental results demonstrate that both SMACK
and CIVL to analyze the 45 programs in benchmark and
ifnd that SMACK can parse 37 out of 45 programs, whereas
CIVL can only parse 3 out of 45. In contrast, F-IKOS can
analyze all programs within an average time of 1.79s while
maintaining an acceptable average of 3 false positives per
program. In particular, when analyzing programs that use
intrinsic functions to manipulate Fortran’s arrays, F-IKOS
issues some false positives. The reason for these false
positives lies in the diferences between Fortran arrays and
common high-level language arrays.</p>
        <p>RQ-2 Answer: F-IKOS maintains analytical capabilities
when dealing with intrinsic functions. F-IKOS successfully
analyzed all Fortran programs within an average time of
1.79s. Moreover, F-IKOS can be used to analyze Fortran
programs adhering to multiple syntax standards, and the
results show that F-IKOS performs better than SMACK and</p>
        <p>Program Name</p>
        <p>array
arrary_fail
compound
compound_fail
compound_fail_2</p>
        <p>compute
compute_fail</p>
        <p>forloop
forloop_fail</p>
        <p>function
function_fail
function_fail_2
function_fail_3</p>
        <p>hello
hello_fail</p>
        <p>inout
inout_fail
pointer
pointer_fail</p>
        <p>abs
abs_bad
array_section
array_section_bad
intent_inout
intent_out
intent_out_bad</p>
        <p>mod_impl
mod_impl_bad
mod_spec
mult_impl
mult_impl_bad
mult_spec
short_circuit
short_circuit_bad</p>
        <p>truncate
truncate_bad
Average
5.5. RQ3: Handling real-world programs
We evaluated the capability of F-IKOS to detect runtime
errors in larger programs from the third benchmark. To
objectively demonstrate F-IKOS’s capabilities, we
intentionally injected 10 division-by-zero bugs into some of these
programs. Our evaluation metrics include both analysis
time and accuracy. The accuracy of the analysis is defined
as follows:
 
   =
  +  
where   represents the number of true positives, and  
denotes the number of false positives.</p>
        <p>The experimental results are represented in Table 4,
where ”F-IKOS TP” and ”F-IKOS FP” denote true positives
and false positives of F-IKOS, respectively. SMACK
successfully parsed 7 programs, but it failed to detect runtime errors
within them. CIVL couldn’t parse any of the 10 programs.
In contrast, F-IKOS detected all runtime errors, achieving
an accuracy of 22.2%. The programs include both custom
and Fortran intrinsic functions, exhibiting more complex
numerical characteristics. The results demonstrate the
effectiveness of F-IKOS to detect runtime errors in numerical
computation programs. Regardless of the rounding mode
used by machines, our analysis of Fortran programs remains
sound, ensuring consistent and sound analysis results across
diferent computational environments.</p>
        <p>We find that some programs require more time for
analysis. Two primary factors contribute to the long execution
time. Firstly, our experiments utilize the polyhedra abstract
domain, which can be computationally expensive for certain
programs. Additionally, real-world programs often exhibit
distinct numerical characteristics, particularly due to the
presence of loops and arrays, which demand more
timeintensive processing.</p>
        <p>RQ-3 Answer: The results show that SMACK parses 7
out of 10 Fortran programs, while CIVL fails to parse any.
Moreover, neither tools can detect runtime errors in the
programs they parse. In contrast, F-IKOS soundly analyzes all
programs and successfully detects runtime errors,
demonstrating its efectiveness in handling Fortran numerical
programs.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>6. Related Work</title>
      <p>
        In the literature, there exists several tools to analyze or
verify Fortran programs. Some tools such as f2c [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and
FABLE[
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], involve converting Fortran programs into other
high-level languages (such as C++) programs, and then use
      </p>
      <p>Program
arguments
associate_bounds
bounds</p>
      <p>boz
case_insensitivity
column_major
compare_floats</p>
      <p>data
derived_type_composition
derived_type_implied_do
dimension
direct_access
do_loop_index
do_while
error_stop
get_command
implicit_save</p>
      <p>intrinsic
list_directed_read</p>
      <p>loop
loop_bound
loop_index
loop_label
merge
module
module_parameter</p>
      <p>open_file
overlapping_arg
print_implied_do_loop
protected
recursive_io</p>
      <p>scratch
select_case</p>
      <p>slash
sum_exit</p>
      <p>trim
type_constructor_optional</p>
      <p>
        value
write_char
xrandom_int
swap_arrays
average
submod
linear_equations
temp_converter
verifiers to conduct verification. Alternatively,
FORTRANlint [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], ftnchek [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] and Coverity [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] specializes in
predefined, general-purpose defect detection within
Fortran programs, lacking the comprehensive capability to
analyze program properties semantically. In contrast, CamFort
[
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] incorporates a lightweight declarative specification
language capable of both checking and inferring specifications.
      </p>
      <p>
        SMACK [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] and CIVL [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] translate Fortran programs into
Intermediate Representation (IR) for subsequent verification
using IR-compatible verifiers. Specifically, SMACK converts
Fortran programs to LLVM IR and then verifies LLVM IR via
Corral [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], wherein Corral restricts the syntax of
expressions in this language to one that can be eficiently decided
by a SMT solver. CIVL [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] converts Fortran programs to
CIVL-C which is an Intermediate Verification Language
(IVL), which is subsequently verified using model
checking and symbolic execution. However, their work mainly
focuses on the verification of Fortran programs, without
      </p>
      <p>SMACK (s)
2.43
2.71
3.24
2.85
2.43
2.9
3.25
2.91
2.73
3.34
2.67</p>
      <p>3.14
3.27</p>
      <p>3.27
3.17
2.93
3.23
2.91
3.28
3.05
3.64
3.26
2.7
2.62
2.98
2.84
4.27
2.87</p>
      <p>3.47
3.56
2.9
3.11
2.63
2.75
2.73
2.67
2.19</p>
      <p>CIVL (s)
0.99
1.59
1.52
addressing runtime error detection. In this paper, we use
F-IKOS to support the sound analysis of Fortran programs
with complex features.</p>
    </sec>
    <sec id="sec-6">
      <title>7. Conclusion</title>
      <p>In this paper, we present F-IKOS, an abstract
interpretationbased static analyzer designed for Fortran programs.
Particularly, F-IKOS provides a sound analysis for floating-point
types in programs. F-IKOS first abstracts floating-point
expressions into real-number expressions with interval
coeficients, then linearizes these expressions into real-number
expressions with scalar coeficients. These linear expressions
are subsequently handled by abstract domains originally
designed for real-number types to produce sound
analysis results. Evaluation of three benchmarks demonstrates
F-IKOS’s eficiency and efectiveness than other relevant
analyzers in the analysis of Fortran programs.</p>
      <p>Program Name
converter
bubblesort
libconstants</p>
      <p>simpson
diferentiation
div
expr
function
palindrome
trapezodial
8. Acknowledgments
We thank the reviewers for their constructive feedback. This
work is supported by the National Key R&amp;D Program of
China (No.2022YFA1005101) and the National Natural
Science Foundation of China (Nos.62032024,62102432).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <article-title>[1] Response to issues about floating-point program analysis in IKOS, 2023</article-title>
          . URL: https://github.com/NASA-SWVnV/ikos/issues/224.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Liqian</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <article-title>Sound floating-point and non-convex static analysis using interval linear abstract domains</article-title>
          ,
          <year>2010</year>
          . National University of Defense Technology.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Feldman</surname>
          </string-name>
          ,
          <string-name>
            <surname>Stuart</surname>
            <given-names>I</given-names>
          </string-name>
          ,
          <article-title>A Fortran to C converter, ACM SIGPLAN Fortran Forum</article-title>
          . Vol.
          <volume>9</volume>
          . No. 2. New York, NY, USA: ACM,
          <year>1990</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4] LLVM homepage,
          <year>2000</year>
          . URL: https://llvm.org/.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <article-title>[5] Flang Fortran language front-end homepage</article-title>
          . URL: https://github.com/flang-compiler/flang.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>Jeannet</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Miné</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <article-title>Apron: A library of numerical abstract domains for static analysis</article-title>
          , in: Computer Aided Verification, Springer, Berlin, Heidelberg,
          <year>2009</year>
          , pp.
          <fpage>661</fpage>
          -
          <lpage>667</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Garzella</surname>
            ,
            <given-names>J.J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Baranowski</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>He</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rakamaric</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <article-title>Leveraging compiler intermediate representation for multi- and cross-language verification</article-title>
          , in: Verification,
          <string-name>
            <given-names>Model</given-names>
            <surname>Checking</surname>
          </string-name>
          , and Abstract Interpretation: 21st International Conference,
          <string-name>
            <surname>VMCAI</surname>
          </string-name>
          <year>2020</year>
          ,
          <article-title>New Orleans</article-title>
          , LA, USA, January
          <volume>16</volume>
          -
          <issue>21</issue>
          ,
          <year>2020</year>
          , Proceedings, Springer, Berlin, Heidelberg,
          <year>2020</year>
          , pp.
          <fpage>90</fpage>
          -
          <lpage>111</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname>Wu</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hückelheim</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hovland</surname>
            ,
            <given-names>P.D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Siegel</surname>
            ,
            <given-names>S.F.</given-names>
          </string-name>
          ,
          <article-title>Verifying Fortran Programs with CIVL</article-title>
          ,
          <source>in: International Conference on Tools and Algorithms for the Construction and Analysis of Systems</source>
          , Springer, Berlin, Heidelberg,
          <year>2022</year>
          , pp.
          <fpage>106</fpage>
          -
          <lpage>124</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>Lal</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Qadeer</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lahiri</surname>
            ,
            <given-names>S.K.</given-names>
          </string-name>
          ,
          <article-title>A solver for reachability modulo theories</article-title>
          , in: Computer Aided Verification: 24th International Conference,
          <string-name>
            <surname>CAV</surname>
          </string-name>
          <year>2012</year>
          , Berkeley, CA, USA, July
          <volume>7</volume>
          -
          <issue>13</issue>
          ,
          <year>2012</year>
          , Proceedings, Springer, Berlin, Heidelberg,
          <year>2012</year>
          , pp.
          <fpage>427</fpage>
          -
          <lpage>443</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Brat</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Navas</surname>
            ,
            <given-names>J.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shi</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Venet</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <article-title>IKOS: A framework for static analysis based on abstract interpretation</article-title>
          ,
          <source>in: Software Engineering and Formal Methods: 12th International Conference, SEFM 2014</source>
          , Grenoble, France, September 1-
          <issue>5</issue>
          ,
          <year>2014</year>
          , Proceedings, Springer, Berlin, Heidelberg,
          <year>2014</year>
          , pp.
          <fpage>271</fpage>
          -
          <lpage>277</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Grosse-Kunstleve</surname>
            ,
            <given-names>R.W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Terwilliger</surname>
            ,
            <given-names>T.C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sauter</surname>
            ,
            <given-names>N.K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Adams</surname>
            ,
            <given-names>P.D.</given-names>
          </string-name>
          , Automatic Fortran to C+
          <article-title>+ conversion with FABLE</article-title>
          ,
          <source>Source Code for Biology and Medicine</source>
          ,
          <volume>7</volume>
          (
          <year>2012</year>
          ), pp.
          <fpage>1</fpage>
          -
          <lpage>11</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>Mak</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Taheri</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <source>An Automated Tool for Upgrading Fortran Codes, Software</source>
          ,
          <volume>1</volume>
          (
          <issue>3</issue>
          ) (
          <year>2022</year>
          ), pp.
          <fpage>299</fpage>
          -
          <lpage>315</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <article-title>FORTRAN-lint: a pre-compile analysis tool</article-title>
          , URL: https://stellar.cleanscape.net/docs_lib/data_Flint2.pdf.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Coverity</given-names>
            <surname>Fortran Syntax Analysis</surname>
          </string-name>
          , URL: https://sigproduct-docs.synopsys.com/bundle/coveritydocs/page/webhelp-files/fortran_start.html#introduction.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <surname>Orchard</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Contrastin</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Danish</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rice</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <article-title>Verifying spatial properties of array computations</article-title>
          ,
          <source>Proceedings of the ACM on Programming Languages, 1(OOPSLA)</source>
          (
          <year>2017</year>
          ), pp.
          <fpage>1</fpage>
          -
          <lpage>30</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <surname>Rakamarić</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Emmi</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>SMACK</surname>
          </string-name>
          :
          <article-title>Decoupling source language details from verifier implementations</article-title>
          , in: Computer Aided Verification: 26th International Conference, CAV 2014,
          <article-title>Held as Part of the Vienna Summer of Logic</article-title>
          ,
          <source>VSL</source>
          <year>2014</year>
          , Vienna, Austria,
          <source>July 18-22</source>
          ,
          <year>2014</year>
          , Proceedings, Springer, Berlin, Heidelberg,
          <year>2014</year>
          , pp.
          <fpage>106</fpage>
          -
          <lpage>113</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>BLAS (Basic Linear Algebra Subprograms</surname>
          </string-name>
          ), URL: https://www.netlib.org/blas/.
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Cousot</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cousot</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <article-title>Abstract interpretation: a uniifed lattice model for static analysis of programs by construction or approximation of fixpoints</article-title>
          ,
          <source>in: Proceedings of the 4th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages</source>
          ,
          <year>1977</year>
          , pp.
          <fpage>238</fpage>
          -
          <lpage>252</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <surname>Miné</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <article-title>Relational abstract domains for the detection of floating-point run-time errors</article-title>
          ,
          <source>in: European Symposium on Programming</source>
          , Springer, Berlin, Heidelberg,
          <year>2004</year>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>17</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <article-title>fortranlib2024 homepage</article-title>
          , URL: https://github.com/astrofrog/fortranlib.
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <article-title>FortranTip homepage</article-title>
          , URL: https://github.com/Beliavsky/FortranTip.
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <article-title>Fortran4Researchers homepage</article-title>
          , URL: https://github.com/WarwickRSE/Fortran4Researchers.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <surname>Fiedler</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nedoma</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ramík</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rohn</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zimmermann</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <article-title>Solvability of systems of interval linear equations and inequalities, in: Linear Optimization Problems with Inexact Data</article-title>
          , Springer, Berlin, Heidelberg,
          <year>2006</year>
          , pp.
          <fpage>35</fpage>
          -
          <lpage>77</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>