<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article  PUBLIC "-//NLM//DTD Journal Publishing DTD v3.0 20080202//EN" "http://dtd.nlm.nih.gov/publishing/3.0/journalpublishing3.dtd"><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="3.0" xml:lang="en" article-type="research article"><front><journal-meta><journal-id journal-id-type="publisher-id">JSEA</journal-id><journal-title-group><journal-title>Journal of Software Engineering and Applications</journal-title></journal-title-group><issn pub-type="epub">1945-3116</issn><publisher><publisher-name>Scientific Research Publishing</publisher-name></publisher></journal-meta><article-meta><article-id pub-id-type="doi">10.4236/jsea.2023.166010</article-id><article-id pub-id-type="publisher-id">JSEA-125885</article-id><article-categories><subj-group subj-group-type="heading"><subject>Articles</subject></subj-group><subj-group subj-group-type="Discipline-v2"><subject>Computer Science&amp;Communications</subject></subj-group></article-categories><title-group><article-title>
 
 
  Review of Software Model-Checking Techniques for Dealing with Error Detection in Program Codes
 
</article-title></title-group><contrib-group><contrib contrib-type="author" xlink:type="simple"><name name-style="western"><surname>Ednah</surname><given-names>Olubunmi Aliyu</given-names></name><xref ref-type="aff" rid="aff1"><sub>1</sub></xref></contrib></contrib-group><aff id="aff1"><label>1</label><addr-line>Department of Computer Science, Adekunle Ajasin University, Akungba-Akoko, Nigeria</addr-line></aff><pub-date pub-type="epub"><day>28</day><month>06</month><year>2023</year></pub-date><volume>16</volume><issue>06</issue><fpage>170</fpage><lpage>192</lpage><history><date date-type="received"><day>17,</day>	<month>April</month>	<year>2023</year></date><date date-type="rev-recd"><day>25,</day>	<month>June</month>	<year>2023</year>	</date><date date-type="accepted"><day>28,</day>	<month>June</month>	<year>2023</year></date></history><permissions><copyright-statement>&#169; Copyright  2014 by authors and Scientific Research Publishing Inc. </copyright-statement><copyright-year>2014</copyright-year><license><license-p>This work is licensed under the Creative Commons Attribution International License (CC BY). http://creativecommons.org/licenses/by/4.0/</license-p></license></permissions><abstract><p>
 
 
  Debugging software code has been a challenge for software developers since the early days of computer programming. A simple need, because the world is run by software. So perhaps the biggest engineering challenge is finding ways to make software more reliable. This review provides an overview of techniques developed over time in the field of software model checking to solve the problem of detecting errors in program code. In addition, the challenges posed by this technology are discussed and ways to mitigate them in future research and applications are proposed. A comprehensive examination of the various model verification methods used to detect program code errors is intended to lay the foundation for future research in this area.
 
</p></abstract><kwd-group><kwd>Software Model Checking</kwd><kwd> Symbolic Execution</kwd><kwd> State Explosion</kwd><kwd> Abstraction</kwd><kwd> Test Case Generations</kwd></kwd-group></article-meta></front><body><sec id="s1"><title>1. Introduction</title><p>This article traced the history of program verification to the mid-sixties [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] , when the founding fathers of Computer Science such as Robert Floyd, Tony Hoare and Edsger Dijkstra realized that one of the most important challenges computing faced was to tame complexity. So, they devised a methodology to study the property of a system. One way to study the properties of a program is to treat it as a black box and execute it. The merit of this approach is its ease of implementation while its drawback is that it can only reveal how the program behaves for a particular input value. To guarantee that some property is held on a different input, one would have to execute the program over every possible input. To solve the problem, the research community decided to open up the black box. This led to the development of higher-level programming languages with precise semantics using mathematical objects to reason about program properties such as operational semantics, denotational semantics and axiomatic semantics as pointed out by [<xref ref-type="bibr" rid="scirp.125885-ref2">2</xref>] . Having laid down the foundation for describing program semantics, researchers began to follow two distinct but overlapping paths. The first was the design of a programming language of increasing sophistication, which promoted various styles of programming, while the second was the development of techniques for reasoning about the properties of programs.</p><p>Meanwhile, the Peer Review method used for software verification [<xref ref-type="bibr" rid="scirp.125885-ref3">3</xref>] is a method carried out by a team of software engineers who preferably have not been involved in the development of the software under review. They analyse code statically without executing it. The shortcoming of this method is that the errors discovered are errors in coding standards, style and readability, but does not display errors in program behaviour. Another verification method is testing. It is a dynamic technique that runs the software. Testing takes the piece of software under consideration and provides its compiled code with an input called tests. The main advantage of testing is that it can be applied to all sorts of software ranging from application software, to compiler and operating systems. However, a problem with testing according to [<xref ref-type="bibr" rid="scirp.125885-ref3">3</xref>] and [<xref ref-type="bibr" rid="scirp.125885-ref4">4</xref>] is that testing can never be complete, that is, it can only show the presence of errors, and it does not show the absence of errors. Also, determining when the testing operation is to stop is a challenge. Due to this problem, [<xref ref-type="bibr" rid="scirp.125885-ref5">5</xref>] stated that early discovery of errors makes development cheaper.</p><p>Static code analysis is another method of debugging by examining code before a program is run. It is implemented by analyzing a set of codes against a set of coding rules using automatic tools. [<xref ref-type="bibr" rid="scirp.125885-ref6">6</xref>] mentioned some static analysis tools that have emerged over the years such as Coverity, FindBugs, C++Test and JTest respectively, enabling common programming errors and style violations to be seen in the early stages of development. The two major challenges of static code analysis according to [<xref ref-type="bibr" rid="scirp.125885-ref7">7</xref>] are false positives and false negatives. False positive indicates the presence of a defect or vulnerability that is not actually present in the code while false negatives indicate that the code is free from defects or vulnerabilities when, in fact, it is not.</p><p>In the quest of making progress in developing tools for verifying requirements and design, the techniques organized themselves into distinct sub-areas under the general heading of formal methods such as: Type checking which define a set of values to be assigned to a variable, the operations that can be performed on a variable, the way a variable is stored in the memory and done automatically within the compiler [<xref ref-type="bibr" rid="scirp.125885-ref8">8</xref>] . Program analysis: A technology that is concerned with approximation about the program automatically, detecting invariants in a program and run-time errors such as division by zero, array bound overflow and arithmetic overflow.</p><p>Theorem prover: Technology for simplifying proof in response to proofs by hand using a Floyd-Hoare style logic [<xref ref-type="bibr" rid="scirp.125885-ref9">9</xref>] . This discipline concentrates on the construction of models by successive refinements, symbolic techniques in the performance of constraint solver that underlie effective symbolic representation for propositional logic, as well as Binary Decision Diagram (BDD) and for the combination of first-order theories of equality with un-interpreted function [<xref ref-type="bibr" rid="scirp.125885-ref10">10</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref11">11</xref>] . Model Checking: Checks the properties of models of program, usually, these models denote finite state machines and the properties to be checked are temporal properties [<xref ref-type="bibr" rid="scirp.125885-ref8">8</xref>] . Also, Ben-Ari [<xref ref-type="bibr" rid="scirp.125885-ref12">12</xref>] describes model checking as one of the most powerful formal methods that generate all possible states of a program and check whether the correctness specifications hold in each state.</p><p>This article focuses on model checking and the application of model checking involves the following phases according to [<xref ref-type="bibr" rid="scirp.125885-ref13">13</xref>] .</p><p>1) First, it is needed to formally specify the system to check, written in a formal language such as temporal logic or process algebra.</p><p>2) The requirements of the system are also specified in the same language as the specification or in a different one.</p><p>3) A model of the system is generated from the formal specification usually, finite state automata or a labelled transition system.</p><p>4) Finally, the satisfaction or refutation of the properties is checked against the model.</p><p>However, each sub-area has its own community and philosophy. But what unifies this sub-area is that to prove the program never enters an undesirable state. To prove that, one has to compute from the program’s description the set of possible states the program may ever enter. [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] documented that this set is not computable, what needs to be done is to demonstrate by construction the existence of a safe set that contains all the states the program may enter, but does not contain an undesirable state. From this point on, the sub-areas diverged in the kinds of error states and the programs being analyzed as shown in <xref ref-type="table" rid="table1">Table 1</xref>.</p><p>This review is based on software model checking which is the algorithmic analysis of programs to prove properties of their execution. More recently, software model checking has been influenced by three parallel but somewhat distinct developments. First, the development of program logic and associated decision procedures, this provided a framework and basic algorithmic tools to reason about infinite state spaces. Second, automatic model-checking techniques for temporal logic, this provided basic algorithmic tools for state-space exploration. Third, compiler analysis, formalized by abstract interpretation, provided connections between the logical world of infinite state spaces and the algorithmic world of finite representations [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] . While the second categories focus on symbolic model checking which has been an active area of research in the field of computer science for several decades, this study intends to review the state-of-the-art of symbolic model checking, especially the use of machine learning techniques to improve the scalability of symbolic model checking.</p><p>The remaining part of this review is organized as follows. Section 2 contains software model-checking techniques for dealing with error detection in program</p><table-wrap id="table1" ><label><xref ref-type="table" rid="table1">Table 1</xref></label><caption><title> Features of formal methods</title></caption><table><tbody><thead><tr><th align="center" valign="middle" >Distinguishing Features of Sub-area</th><th align="center" valign="middle" >Type System</th><th align="center" valign="middle" >Program Analysis</th><th align="center" valign="middle" >Theorem Prover</th><th align="center" valign="middle" >Model Checking</th></tr></thead><tr><td align="center" valign="middle" >Program Code</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td></tr><tr><td align="center" valign="middle" >Model (Abstraction)</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Control-Flow Graph (CFG)</td><td align="center" valign="middle" >Model construction</td><td align="center" valign="middle" >Finite-State Machine (FSM)</td></tr><tr><td align="center" valign="middle" >Type Checking</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td></tr><tr><td align="center" valign="middle" >Invariant Checking</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Functional Correctness</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td></tr><tr><td align="center" valign="middle" >Temporal Properties</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Symbolic Execution</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Precision</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Scalability</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td></tr><tr><td align="center" valign="middle" >Exhaustive</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Efficiency</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td></tr><tr><td align="center" valign="middle" >Undesirable State</td><td align="center" valign="middle" >Type error</td><td align="center" valign="middle" >Spurious error</td><td align="center" valign="middle" >Invalid query</td><td align="center" valign="middle" >Spurious/coarse abstraction</td></tr><tr><td align="center" valign="middle" >Counter-example</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Refinement</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Proposed Properties</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td></tr><tr><td align="center" valign="middle" >Inner Properties</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td><td align="center" valign="middle" >Applicable</td><td align="center" valign="middle" >Not applicable</td></tr></tbody></table></table-wrap><p>codes. Section 3 analyse the situation of the symbolic model checking. Section 4 contains a discussion of challenges and future prospects. Section 5 presents the conclusion.</p></sec><sec id="s2"><title>2. Software Model-Checking Techniques for Dealing with Error Detection in Program Codes</title><p>Several notions have emerged in the field of software model checking to deal with properties of a system. Typically, software model checking was based on explicit enumeration. That is, it manipulates individual states of the program that are stored in a large hash table (that is, states are stored as bit vectors). The state space graph is explored with depth-first search, looking for violation of safety property. An overview of general approach is presented in <xref ref-type="fig" rid="fig1">Figure 1</xref>.</p><p>In the literature, different approaches that brought enhancement in the field of software model checking are depicted in <xref ref-type="table" rid="table2">Table 2</xref>.</p><sec id="s2_1"><title>2.1. Explicit-State Model Checking</title><p>Explicit-state model checking is a formal verification technique that checks whether a system model satisfies a desired property by exploring all possible states of the system. One significant limitation of explicit-state model checking is the state explosion problem, which occurs when the number of possible states or transitions in the system grows exponentially with the size of the system. This</p><table-wrap id="table2" ><label><xref ref-type="table" rid="table2">Table 2</xref></label><caption><title> Different approaches in software model checking</title></caption><table><tbody><thead><tr><th align="center" valign="middle" >Approaches</th><th align="center" valign="middle" >Knowledge Source</th><th align="center" valign="middle" >Strength</th><th align="center" valign="middle" >Limitation</th></tr></thead><tr><td align="center" valign="middle" >Explicit-state Model Checking</td><td align="center" valign="middle" >State graph or state transition system</td><td align="center" valign="middle" >Detect errors in highly concurrent design</td><td align="center" valign="middle" >State explosion problem.</td></tr><tr><td align="center" valign="middle" >Symbolic Model Checking (Boolean Encoding for State Machine and Set of States)</td><td align="center" valign="middle" >Ordered Binary Decision Diagram (OBDD) + Fix-point characterization of temporal operators</td><td align="center" valign="middle" >1) It can handle systems with large state spaces more efficiently. 2) It can verify properties that are specified in rich formal languages, such as temporal logic or mu-calculus spaces more efficiently. 3) It can verify systems that have unbounded data domains, such as integer and real variables. 4) It can verify parameterized systems, where the number of components or processes in the system is not fixed.</td><td align="center" valign="middle" >Many functions do not have a succinct BDD representation.</td></tr><tr><td align="center" valign="middle" >Model Checking with Abstraction</td><td align="center" valign="middle" >Predicate abstraction</td><td align="center" valign="middle" >Ability to balance the trade-off between accuracy and efficiency in formal verification.</td><td align="center" valign="middle" >1) Risk of losing important information or details that are necessary for detecting certain types of errors or properties. 2) Difficulty of ensuring the soundness and completeness of the verification results.</td></tr><tr><td align="center" valign="middle" >Bounded Model Checking</td><td align="center" valign="middle" >Formal language such as temporal logic or automata, and the design or implementation of the system being verified</td><td align="center" valign="middle" >1) Effectively handle systems with a large number of states and transitions. 2) Detect errors and violations quickly, without having to explore the entire state space of the system.</td><td align="center" valign="middle" >1) Cannot detect errors or violations that occur beyond the bound. 2) If the model does not accurately capture the behavior of the system, BMC may produce false negatives or false positives, which can lead to incorrect verification results. 3) State explosion problem.</td></tr><tr><td align="center" valign="middle" >Dynamic Model Checking</td><td align="center" valign="middle" >Program code and its associated documentation, such as requirements and design specifications</td><td align="center" valign="middle" >1) It can handle systems with dynamic or continuous behavior, such as control systems, analog circuits, and hybrid systems. 2) It detects errors and violations in real-time during system execution.</td><td align="center" valign="middle" >1) It only verifies the behavior of the system during execution. 2) It requires a set of inputs that exercise the system’s behavior adequately. 3) It suffers from the state explosion problem.</td></tr></tbody></table></table-wrap><p>can make explicit-state model checking infeasible or impractical for verifying large and complex systems.</p><p>In the sequel, various techniques to improve space consumption in explicit state model checkers were introduced such as: Reduction based techniques—consists of partial-order reduction, symmetry reduction or minimization based on behavioural equivalences such as simulation or bi-simulation, behavioural equivalences such as similarity or bi-similarity. Furthermore, compositional techniques were also introduced to reduce the safety verification problem on the original program to prove properties on subprograms, such that the results of model checking the subprograms can be combined to deduce the safety of the original program. Then, the idea of search heuristic in the field of artificial intelligence was introduced to find bugs quickly [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] . In addition, there was a special case of enumerative verification known as systematic execution exploration which checks the runtime system of a programming language implementation to implement enumerative state space exploration. [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] stated that the benefit of this approach was that it sidesteps the need to be able to formally represent the semantics of the programming language and machine instructions as a transition relation, but the number of states is still too large to be handled by the model checker.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref9">9</xref>] , a method of constructing concurrent program automatically using branching time temporal logic was proposed. They specified the behaviour of a finite number of fixed processes p 1 ⋯ p n running in parallel using Computation Tree Logic (CTL) and applied Tableau-Based decision procedure for satisfiability of CTL formula. Model-checking algorithm (that is, Tableau-Based decision procedure) automatically factors out the synchronization skeletons of the individual processes from the global system flow-graph defined by the model.</p><p>Another study [<xref ref-type="bibr" rid="scirp.125885-ref14">14</xref>] described as a set of Communicating Sequential Processes (CSPs), where a translator transformed the description program into an Interpreted Petri-Nets (IPNs). To verify the conformity of the described system, the model was treated by an analyzer (CESAR) given the specification in branching time logic which expressed invariant, liveness and response to some action properties.</p><p>Also, [<xref ref-type="bibr" rid="scirp.125885-ref15">15</xref>] improved on the work carried out in [<xref ref-type="bibr" rid="scirp.125885-ref14">14</xref>] by developing automatic verification of finite-state concurrent systems using temporal logic specifications and moved fairness requirements into the semantic of Computation Tree Logic (CTL).</p><p>Model Checking Using Net Unfolding were proposed in [<xref ref-type="bibr" rid="scirp.125885-ref16">16</xref>] and made precise effort about the arbitrary interleaving of concurrent actions with certain properties such as reachability and mutual exclusion with the development of a new model-checking algorithm based on net unfolding to improve the model-checking algorithm developed by [<xref ref-type="bibr" rid="scirp.125885-ref17">17</xref>] which required exponential time.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref18">18</xref>] , presented the development of SPIN model checker to prove the correctness interaction between processes. The system model was described in Process Metalanguage (PROMELA) for modelling process synchronization and coordination while specification properties are written in Linear Temporal Logic (LTL) formula.</p></sec><sec id="s2_2"><title>2.2. Symbolic Model Checking</title><p>The need to overcome state-explosion-problem led to research on symbolic algorithms which manipulate representations of sets of states, rather than individual state, and perform state exploration through the symbolic transformation of these representations [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref19">19</xref>] . One strength of symbolic model checking is that it can handle systems with large state spaces more efficiently than explicit-state model checking. The first to create a publicly available symbolic model checker called Symbolic Model Verifier (SMV) based on Binary Decision Diagrams (BDDs) was Ken McMillan, at Carnegie-Mellon University (CMU). The demerit of BDDs was its sensitivity to orderings of variables, that is, the order in which variables are encountered from the root to the leaves of the BDD can vary dramatically with different orderings.</p><p>The issue of scalability is addressed in [<xref ref-type="bibr" rid="scirp.125885-ref20">20</xref>] with explicit state model checker by extending Java Pathfinder model checker with symbolic execution and Satisfiability (SAT) solver.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref21">21</xref>] , looked into the issue of modeling complex data structures such as arrays with the development of a prototype implementation called SMT-CBMC approach.</p><p>Improving the scalability of the composite model-checking algorithms to verify source code level sequential programs is investigated in [<xref ref-type="bibr" rid="scirp.125885-ref22">22</xref>] against programming bug such as array bound violation, use of uninitialized variables, memory leaks, locking rule violations and division by zero with the objectives of combining multiple symbolic representation at Boolean, integer and Boolean combination of Linear constraints on reals to model programs defined using Composite Symbolic Formula (CSF).</p><p>Context-enhanced directed model-checking techniques introduced in [<xref ref-type="bibr" rid="scirp.125885-ref23">23</xref>] to tackle state explosion problem. The goal is to find error states in concurrent systems with the objectives of developing a heuristic search to explore those parts of the state space belonging to the same part of the system using the notion of interference context.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref24">24</xref>] , proposed Configurable Program Analysis Checker (CPACHECKER) with the development of Event Condition Action (ECA) systems using Binary Decision Diagrams (BDDs).</p><p>The issue of static verification techniques of Boolean formula satisfiability solvers were proposed in [<xref ref-type="bibr" rid="scirp.125885-ref25">25</xref>] such as, Satisfiability Theory (SAT) and Satisfiability Modulo Theory (SMT) solvers that operate on conjunctive normal form and first order logic formulae respectively to validate programs with the development of And-Inverter-Graph (AIG), encoding the problem definition in a program.</p></sec><sec id="s2_3"><title>2.3. Model Checking with Abstraction</title><p>Model checking with abstraction is a technique that involves simplifying the formal model of a system being verified by abstracting away some details that are not relevant to the property being verified. Cousot [<xref ref-type="bibr" rid="scirp.125885-ref26">26</xref>] described abstract interpretation to be either partial or preorder. Being partial meaning that it is considered a subset of the concrete semantics. This is regarded as abstraction from below (Under-approximation). Preorder meaning that abstractions are “from above” that is, the abstract semantics describes a superset or logical consequence of the concrete semantics which is known as over-approximation.</p><p>One major improvement in this area was achieved through Satisfiability Modulo Theories (SMT); an algorithm that computes an abstraction of a program with respect to a given abstract interpretation by replacing loops and function calls in the Control Flow Graph (CFG) by their symbolic transformer [<xref ref-type="bibr" rid="scirp.125885-ref19">19</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref27">27</xref>] .</p><p>The work of [<xref ref-type="bibr" rid="scirp.125885-ref28">28</xref>] focused on model checking C programs, which are notoriously difficult to verify due to their complexity and the potential for errors in memory management. To address these challenges, the authors propose a method that uses both Boolean and Cartesian abstraction. Boolean abstraction involves replacing program variables with Boolean variables, which allows for efficient verification of properties that depend only on the truth values of the variables. Cartesian abstraction, on the other hand, involves partitioning the state space of the program into a finite set of Cartesian product abstractions, which can be used to efficiently verify complex temporal properties.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref29">29</xref>] , proposed an automatic method for generating predicate abstractions of C programs using a combination of abstract interpretation and decision tree learning. The authors first use abstract interpretation to generate a set of abstract states that over-approximate the behavior of the program. They then use decision tree learning to identify predicates that can be used to partition the abstract states into smaller sets that correspond to different program behaviors.</p><p>Predicate Abstraction for Software Verification by [<xref ref-type="bibr" rid="scirp.125885-ref30">30</xref>] , proposed a method for automatically generating predicate abstractions using a combination of abstract interpretation and refinement The authors first use abstract interpretation to generate a set of abstract states that over-approximate the behavior of the program. They then use a refinement process to generate a more precise set of predicates that can be used to partition the abstract states into smaller sets that correspond to different program behaviors.</p><p>The paper “Model Checking Software at Compile Time” by [<xref ref-type="bibr" rid="scirp.125885-ref31">31</xref>] describes a novel approach to integrating model checking into the software development process at compile time, rather than after the software has been developed and compiled. It involves the automatic generation of a model of the software system at compile time, based on the source code of the program. This model is then used to perform model checking to verify the correctness of the software with respect to a given specification.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref32">32</xref>] , a methodology that combines automated verification techniques, such as model checking, with automated repair techniques, such as program synthesis were presented. The proposed methodology consists of three main phases: verification, diagnosis, and repair. In the verification phase, the software is analyzed using model checking to identify any errors or bugs. In the diagnosis phase, the errors are further analyzed to determine the root cause of the problem. Finally, in the repair phase, a repair algorithm is used to automatically generate corrected code to fix the identified errors.</p><p>Symbolic abstraction algorithm called symba were introduced in [<xref ref-type="bibr" rid="scirp.125885-ref33">33</xref>] using the power of SMT solver (Z3), encoded all execution as a formula in Quantifier Free-Linear Real Arithmetic (QF-LRA), a commonly used theory for encoding program execution.</p><p>Model Checking with Abstraction by [<xref ref-type="bibr" rid="scirp.125885-ref34">34</xref>] , proposed a method for verifying multi-agent systems using bounded model checking and abstraction techniques. The approach involves modeling the agents as finite-state machines, and using abstraction techniques to reduce the complexity of the model. The model is then checked for correctness using bounded model checking.</p></sec><sec id="s2_4"><title>2.4. Bounded Model Checking</title><p>According to [<xref ref-type="bibr" rid="scirp.125885-ref19">19</xref>] , satisfiability solver was observed to handle much larger formulas than BDDs. This led to the development of Bounded Model Checking (BMC) at Carnegie-Mellon University CMU in late 1990s. Bounded Model Checking (BMC) unrolls the control flow graph for a fixed number of steps, and checks if the error location can be reached within this number of steps and satisfiability of this constraint is checked by a constraint solver using backtracking.</p><p>However, the limitation of this technique according to [<xref ref-type="bibr" rid="scirp.125885-ref1">1</xref>] was the scalability performance of constraint solvers for non-linear arithmetic. Additionally, [<xref ref-type="bibr" rid="scirp.125885-ref35">35</xref>] stated that the disadvantage of bounded model checking is that the method lacks completeness and the types of properties that can currently be checked are very limited.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref21">21</xref>] , addressed the issue of modeling complex data structures such as arrays with the development of a prototype implementation called SMT-CBMC approach. Experimental results show that 1) encoding technique generated more compact formula than CBMC when arrays are involved in the input program; 2) On problems involving complex interactions of arithmetic and arrays manipulation, SMT-CBMC outperforms CBMC as the size of the arrays occurring in the input program increases.</p><p>Bounded Model Checking (BMC) for C and C++ programming languages were introduced in [<xref ref-type="bibr" rid="scirp.125885-ref36">36</xref>] using Low Level Virtual Machine (LLVM) complier front-end such as clang or llvm-gcc to translate C and C++ programs into LLVM’s Intermediate Representation (LLVM-IR); usually in Static Single Assignment (SSA) form, LLVM-IR program is then converted into LLBMC’s Internal Logical Representation (ILR). The result shown that LLBMC performed favourably compare to CBMC and ESBMC in terms of detecting an error such as arithmetic overflow, invalid memory allocations, invalid memory access, invalid free and memory leak detection.</p></sec><sec id="s2_5"><title>2.5. Dynamic Model Checking</title><p>Dynamic model checking is a technique for verifying the correctness of software systems by analyzing their behavior during execution. Unlike static analysis techniques, which analyze the source code of a program without actually running it, dynamic model checking involves running the program on sample inputs or test cases and observing its behavior to detect errors or violations of specified properties. As mentioned in “Model Checking” by [<xref ref-type="bibr" rid="scirp.125885-ref37">37</xref>] , dynamic model checking can be particularly effective in detecting errors in complex systems where static analysis may be impractical or ineffective. Also, as discussed in “Model Checking Software: A Survey” by [<xref ref-type="bibr" rid="scirp.125885-ref11">11</xref>] , dynamic model checking can handle systems with non-deterministic behaviour by generating and exploring all possible execution paths, and verifying that the properties of interest hold for each path.</p><p>Dynamic model checking by [<xref ref-type="bibr" rid="scirp.125885-ref38">38</xref>] proposed a new approach to model checking that involves dynamically executing the program under test and monitoring its behavior in real-time. This approach allows for more comprehensive testing of the software’s behavioral correctness, as it can capture non-deterministic behavior and edge cases that may not be revealed by traditional model-checking techniques.</p><p>Dynamic model checking with evolving software and specifications by [<xref ref-type="bibr" rid="scirp.125885-ref39">39</xref>] , proposed an approach to dynamic model checking that can handle evolving software and specifications. The authors’ approach involves using a combination of dynamic model checking and dynamic symbolic execution. Dynamic model checking involves running the program under test and checking for violations of certain properties, while dynamic symbolic execution involves exploring the program’s execution paths to generate test inputs that can achieve higher coverage. The authors demonstrate the effectiveness of their approach by applying it to several case studies, including a web application and a mobile phone application.</p><p>Dynamic model checking for concurrent software by [<xref ref-type="bibr" rid="scirp.125885-ref40">40</xref>] proposed a dynamic model-checking approach specifically for concurrent software. The authors’ approach involves a combination of dynamic model checking and path-based symbolic execution. Dynamic model checking is used to explore the execution of the program and detect errors such as deadlocks and race conditions, while path-based symbolic execution is used to generate test cases that explore different paths through the program. The authors show the effectiveness of their approach by applying it to several case studies, including a file server and a memory allocator.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref41">41</xref>] , proposed a dynamic model-checking approach for software product lines. The authors’ approach involves using a feature model to guide the testing process. The feature model captures the possible feature combinations of the software product line, and the dynamic model-checking approach is used to explore the possible execution paths of the software products based on these feature combinations. The authors also use slicing techniques to reduce the number of paths explored during the testing process. The authors demonstrate the effectiveness of their approach by applying it to several case studies, including a file system and a configuration tool.</p></sec></sec><sec id="s3"><title>3. State-of-the-Art of Symbolic Model Checking</title><p>Symbolic model checking as mentioned in section two is a technique for verifying the correctness of software systems by analyzing a symbolic representation of the program’s behavior. This technique analyzes a symbolic representation of the system’s behavior and checks whether it satisfies a given set of properties [<xref ref-type="bibr" rid="scirp.125885-ref35">35</xref>] . The symbolic representation is constructed using a set of symbolic variables and their constraints, which allows for the exploration of all possible paths in the system’s behavior without having to explicitly execute the system.</p><p>For example, suppose we want to verify a simple counter that counts from 0 to 3 and then resets to 0. We can represent the counter using a symbolic variable x, which takes values from 0 to 3.</p><p>We can define the constraints on x as follows:</p><p>If x is 0, then the counter increments to 1.</p><p>If x is 1, then the counter increments to 2.</p><p>If x is 2, then the counter increments to 3.</p><p>If x is 3, then the counter resets to 0.</p><p>We can encode these constraints as a Boolean formula using a temporal logic such as Linear Temporal Logic (LTL):</p><p>G ( ( x = 0 → X ( x = 1 ) ) ∧ ( x = 1 → X ( x = 2 ) ) ∧ ( x = 2 → X ( x = 3 ) ) ∧ ( x = 3 → X ( x = 0 ) ) ) (1)</p><p>This formula states that for all future states G, if the current state is x = 0, then the next state must be x = 1, and so on. We can use a symbolic model checker to check whether this formula is satisfied by the symbolic representation of the counter. If the formula is satisfied, then we can conclude that the counter satisfies the given properties. If the formula is not satisfied, then we can use the counterexample generated by the symbolic model checker to diagnose and fix the bug in the counter.</p><p>Symbolic model checking is useful because it can handle complex systems with a large number of states and transitions. It can also find subtle bugs that may be difficult to detect through manual testing or other verification techniques. Additionally, symbolic model checking can be used to generate counterexamples, which are concrete executions of the system that violate a given property. These counterexamples can be used to diagnose and fix the bugs in the system.</p><p>However, it has been successfully applied to a variety of domains, including software, hardware, communication protocols, and distributed systems. Its purpose is to provide a rigorous and automated approach to verify the correctness of complex systems.</p><sec id="s3_1"><title>3.1. Recent Advancement in Symbolic Model Checking</title><p>While Section 2 provides examples of recent research papers that have made significant contributions to the technique, this section discusses recent advancements in the technique, including new algorithms, tools, or applications as well as the technique’s capabilities and limitations.</p><p>As mentioned above that symbolic model checking can be used in different domains, including software, hardware, communication protocols, and distributed systems. Here, a few examples of several new algorithms, tools, and applications of symbolic model checking that have been proposed for software verification and testing in recent years is as follows:</p><p>1) The Symbolic Execution Intermediate Language (SEIL): It is a programming language for specifying symbolic execution of software. It is a high-level language that can be used to describe symbolic execution of complex software systems. The SEIL tool was developed by [<xref ref-type="bibr" rid="scirp.125885-ref42">42</xref>] and can be used to generate test cases automatically.</p><p>2) AFLSmart: The AFLSmart tool is a mutation-based testing framework that uses symbolic execution to generate test cases. It is an extension of the AFL fuzzer and can handle complex software systems. The AFLSmart tool was proposed by [<xref ref-type="bibr" rid="scirp.125885-ref43">43</xref>] and has been shown to be effective in detecting subtle bugs in real-world software.</p><p>3) JPF-SymSpark: The Java PathFinder (JPF) tool is a symbolic model checker for Java programs. JPF-SymSpark is an extension of JPF that uses symbolic execution to generate test cases for Apache Spark applications. It was proposed by [<xref ref-type="bibr" rid="scirp.125885-ref44">44</xref>] and has been shown to be effective in detecting bugs in real-world Spark applications.</p><p>4) Symbiotic: Symbiotic is a tool for symbolic verification of C and C++ programs. It uses a combination of program slicing and symbolic execution to check for memory safety, concurrency bugs, and other types of bugs. Symbiotic was proposed by [<xref ref-type="bibr" rid="scirp.125885-ref45">45</xref>] and has been shown to be effective in finding bugs in large C and C++ codebases.</p><p>5) SymDIVINE: SymDIVINE is a tool for the verification of distributed software systems. It uses a combination of symbolic execution and model checking to check for safety and liveness properties. SymDIVINE was proposed by [<xref ref-type="bibr" rid="scirp.125885-ref46">46</xref>] and has been shown to be effective in detecting subtle bugs in distributed software systems.</p><p>Symbolic model checking is a powerful verification and testing method, but it also has advantages and disadvantages. Here are a few of them:</p></sec><sec id="s3_2"><title>3.2. Capabilities of Symbolic Model Checking</title><p>1) Automatic test case generation: Symbolic model checking can automatically generate test cases that cover different execution paths and edge cases in the software. This can help identify bugs and ensure that the software behaves correctly in all scenarios [<xref ref-type="bibr" rid="scirp.125885-ref47">47</xref>] .</p><p>2) Scalability: Symbolic model checking can handle large and complex software systems with many possible execution paths and inputs. It can also handle programs with dynamic memory allocation and recursion, which are difficult to test with traditional methods [<xref ref-type="bibr" rid="scirp.125885-ref45">45</xref>] .</p><p>3) Precision: Symbolic model checking can analyze the software behavior precisely and exhaustively. It can check for correctness properties such as absence of runtime errors, assertion violations, deadlocks, and data races [<xref ref-type="bibr" rid="scirp.125885-ref48">48</xref>] .</p></sec><sec id="s3_3"><title>3.3. Limitations of Symbolic Model Checking</title><p>1) State space explosion: Symbolic model checking suffers from the state space explosion problem, which arises when the number of possible program states and transitions is very large. This can cause the model checker to run out of memory or take a very long time to complete [<xref ref-type="bibr" rid="scirp.125885-ref17">17</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref49">49</xref>] .</p><p>2) Incomplete specifications: Symbolic model checking relies on formal specifications to check the correctness of the software. If the specification is incomplete or incorrect, the model checker may not be able to detect all the possible bugs in the software [<xref ref-type="bibr" rid="scirp.125885-ref50">50</xref>] .</p><p>3) Input generation: Symbolic model checking can generate test cases automatically, but it may not be able to generate inputs that are representative of real-world usage scenarios. This can limit the effectiveness of the test cases in detecting bugs in the software [<xref ref-type="bibr" rid="scirp.125885-ref51">51</xref>] .</p><p>4) Limited support for non-determinism: Symbolic model checking assumes that the program behavior is deterministic, but many software systems exhibit non-deterministic behavior. This can limit the applicability of symbolic model checking to certain types of software systems [<xref ref-type="bibr" rid="scirp.125885-ref24">24</xref>] .</p><sec id="s3_3_1"><title>3.3.1. State Space Explosion</title><p>As mentioned above that the challenge of state space explosion in software model checking refers to the problem of dealing with a very large number of possible program states and transitions, which makes it difficult to verify the correctness of the software exhaustively. This problem arises because symbolic model-checking algorithms typically operate on a symbolic representation of the program that captures all possible executions of the program, rather than executing the program concretely.</p><p>To address the challenge of state space explosion, researchers have developed several techniques:</p><p>1) Abstraction: This involves reducing the size of the state space by ignoring some details of the program that are not relevant for verifying the desired property. For example, some variables can be abstracted away or combined into equivalence classes to reduce the number of possible states [<xref ref-type="bibr" rid="scirp.125885-ref52">52</xref>] .</p><p>2) Incremental checking: This involves dividing the verification problem into smaller subproblems that can be checked separately. For example, the program can be divided into modules or functions, and each module or function can be checked independently [<xref ref-type="bibr" rid="scirp.125885-ref53">53</xref>] .</p><p>3) Model checking with partial order reduction: This technique reduces the size of the state space by exploiting the fact that many program executions are equivalent up to a certain point. By reducing the number of equivalent executions that are explored, this technique can reduce the overall size of the state space [<xref ref-type="bibr" rid="scirp.125885-ref54">54</xref>] .</p><p>4) Heuristics and optimizations: Researchers have developed various heuristics and optimizations to improve the efficiency of symbolic model-checking algorithms. For example, techniques such as state caching and lazy evaluation can reduce the amount of redundant work that the model checker has to do [<xref ref-type="bibr" rid="scirp.125885-ref49">49</xref>] .</p><p>5) Symbolic model checking with machine learning techniques: Machine learning techniques such as decision trees and regression models have been used to learn the structure of the system and guide the symbolic model-checking process. For example, in the work “Guiding Symbolic Execution towards Unexplored Code” by [<xref ref-type="bibr" rid="scirp.125885-ref55">55</xref>] , a decision tree is used to guide symbolic execution towards unexplored code paths, reducing the number of explored paths and increasing the efficiency of the analysis.</p><p>Another example is the work “Speeding up Symbolic Model Checking with Machine Learning” by [<xref ref-type="bibr" rid="scirp.125885-ref56">56</xref>] , where a regression model is used to predict the reachability of states in the system, reducing the number of states to be explored.</p><p>“DeepGauge: Multi-Granularity Testing Criteria for Deep Learning Systems” by [<xref ref-type="bibr" rid="scirp.125885-ref57">57</xref>] . This work proposes a framework for testing deep learning systems using multi-granularity testing criteria. The approach uses machine learning to generate test cases and evaluate the testing criteria.</p><p>In [<xref ref-type="bibr" rid="scirp.125885-ref58">58</xref>] , the authors propose a framework for learning-based testing that uses a variety of machine learning techniques to generate test cases, execute the test cases, and analyze the results of the test cases. The authors evaluate the framework on a case study of a real world IoT software and show that the framework can be used to find a significant number of defects in the system.</p><p>“Learning to Verify Safety Properties” by [<xref ref-type="bibr" rid="scirp.125885-ref59">59</xref>] . This work proposes a learning-based approach for verifying safety properties of software systems. The approach uses machine learning to learn the properties of the system under test and verify them against a set of safety properties.</p><p>Neural-Guided Deductive Search (NGDS) was proposed in [<xref ref-type="bibr" rid="scirp.125885-ref60">60</xref>] . The authors synthesize real-time programs from a small number of examples with significantly less time and space overhead than traditional deductive search techniques.</p></sec><sec id="s3_3_2"><title>3.3.2. Incomplete Specifications</title><p>The challenge of incomplete specifications in software model checking refers to the problem of verifying software that does not have a complete specification, i.e. a complete and formal description of the expected behavior of the software. This problem arises because model checking algorithms typically rely on a formal specification of the desired behavior of the software in order to check whether the actual behavior of the software satisfies the specification.</p><p>To address the challenge of incomplete specifications, researchers have developed several techniques:</p><p>1) Abductive reasoning: This involves inferring the missing parts of the specification based on the observed behavior of the software. For example, if the software always returns a certain value under certain conditions, we can infer that this behavior is part of the specification [<xref ref-type="bibr" rid="scirp.125885-ref48">48</xref>] .</p><p>2) Falsification: This involves searching for inputs that cause the software to violate the specification. By finding counterexamples to the specification, we can identify parts of the specification that are missing or incorrect [<xref ref-type="bibr" rid="scirp.125885-ref61">61</xref>] .</p><p>3) Model-based testing: This involves generating test cases based on a model of the software, rather than the software itself. By generating tests from the model, we can ensure that the tests cover all possible behaviors of the software that are relevant to the specification [<xref ref-type="bibr" rid="scirp.125885-ref62">62</xref>] .</p><p>4) Runtime verification: This involves monitoring the behavior of the software during execution and checking whether the observed behavior satisfies the specification. This approach is useful when the software is too complex or too difficult to model accurately [<xref ref-type="bibr" rid="scirp.125885-ref63">63</xref>] .</p></sec><sec id="s3_3_3"><title>3.3.3. Input Generation</title><p>The challenge of input generation in software model checking refers to the problem of generating inputs that can trigger interesting behaviors in the software, such as error conditions or violations of the desired properties. This problem arises because model-checking algorithms typically rely on a set of inputs to explore the state space of the software and check whether it satisfies the desired properties.</p><p>To address the challenge of input generation, researchers have developed several techniques:</p><p>1) Randomized testing: This involves generating inputs randomly and testing the software with these inputs. By generating a large number of random inputs, we can increase the chances of finding interesting behaviors in the software [<xref ref-type="bibr" rid="scirp.125885-ref64">64</xref>] .</p><p>2) Search-based testing: This involves using search algorithms to find inputs that are likely to trigger interesting behaviors in the software. By searching the space of possible inputs, we can find inputs that are more likely to uncover errors or violations of the desired properties [<xref ref-type="bibr" rid="scirp.125885-ref65">65</xref>] .</p><p>3) Symbolic execution: This involves using a symbolic representation of the program to explore the space of possible inputs and generate inputs that satisfy certain conditions or constraints. By generating inputs symbolically, we can explore a large number of possible inputs without actually executing the software with each input [<xref ref-type="bibr" rid="scirp.125885-ref66">66</xref>] .</p><p>4) Model-based fuzzing: This involves generating inputs based on a model of the software, rather than the software itself. By generating inputs from the model, we can ensure that the inputs cover all possible behaviors of the software that are relevant to the desired properties [<xref ref-type="bibr" rid="scirp.125885-ref67">67</xref>] .</p></sec><sec id="s3_3_4"><title>3.3.4. Limited Support for Non-Determinism</title><p>The challenge of limited support for non-determinism in software model checking refers to the problem of verifying software that exhibits non-deterministic behavior, where the behavior of the software depends on factors outside the control of the software, such as timing, external events, or user input. This problem arises because model-checking algorithms typically assume a deterministic model of the software, where the behavior of the software is fully determined by its inputs and the internal state.</p><p>To address the challenge of limited support for non-determinism, researchers have developed several techniques:</p><p>1) Probabilistic model checking: This involves extending model-checking algorithms to handle non-deterministic behavior by using probabilistic models, where the behavior of the software is described in terms of probabilities rather than deterministic transitions. By modeling non-determinism probabilistically, we can capture the inherent uncertainty in the behavior of the software [<xref ref-type="bibr" rid="scirp.125885-ref68">68</xref>] .</p><p>2) Runtime verification: This involves monitoring the behavior of the software during execution and checking whether the observed behavior satisfies the desired properties. By monitoring the software at runtime, we can capture non-deterministic behavior that is difficult to model statically.</p><p>3) Symbolic execution with concolic testing: This involves using symbolic execution to explore the space of possible executions of the software, while also generating concrete inputs that satisfy certain conditions or constraints. By generating inputs that capture non-deterministic behavior, we can explore a larger space of possible behaviors than with purely symbolic execution [<xref ref-type="bibr" rid="scirp.125885-ref69">69</xref>] .</p><p>4) Model-based testing with adaptive input generation: This involves generating inputs based on a model of the software, while also adapting the input generation process to capture non-deterministic behavior. By adapting the input generation process, we can explore a larger space of possible behaviors and capture non-deterministic behavior that is difficult to model statically [<xref ref-type="bibr" rid="scirp.125885-ref70">70</xref>] .</p></sec></sec></sec><sec id="s4"><title>4. Discussion: Challenges and Future Prospects</title><sec id="s4_1"><title>4.1. Summary of Challenges</title><p>From the current symbolic model-checking techniques and approaches identified, one interesting method that has been commonly applied to address the limitations is symbolic execution. Studies [<xref ref-type="bibr" rid="scirp.125885-ref71">71</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref72">72</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref73">73</xref>] show that many systems exhibit non-determinism behaviour. One such example is complex data structures that involve non-linear operations, such as matrices and polynomials.</p><p>Matrices, for example, can be represented as multi-dimensional arrays, and operations on matrices often involve non-linear operations such as matrix multiplication and matrix inversion. Symbolic execution can generate constraints on the values stored in matrix elements, but analyzing the constraints can be computationally expensive due to the non-linear nature of the operations.</p><p>Similarly, polynomials involve non-linear operations such as multiplication and exponentiation, which can make symbolic execution of programs involving polynomials challenging. However, recent research Baldoni et al. (2020) has shown that techniques such as SMT-based constraint solving and approximation can be used to overcome some of the challenges of symbolic execution for non-linear operations.</p><p>It is stated in [<xref ref-type="bibr" rid="scirp.125885-ref74">74</xref>] that “Hybrid approaches can overcome the limitations of symbolic execution for non-linear operations by leveraging the strengths of other techniques” such as abstract interpretation or model checking.</p><p>However, one gap in using machine learning techniques with symbolic model checking is the potential loss of precision or soundness in the analysis. Machine learning models can be biased or incomplete, and may not capture all the relevant features or behaviors of the system under verification. This can lead to missed errors or false positives, which can be problematic for safety-critical systems.</p><p>For example, in the work “A Critical Survey of Machine Learning-Assisted Verification” by [<xref ref-type="bibr" rid="scirp.125885-ref75">75</xref>] , the authors note that machine learning models can suffer from overfitting, where they memorize the training data rather than learning general patterns, leading to poor performance on new, unseen data. They also highlight the challenge of incorporating domain knowledge and constraints into machine learning models, which can affect their accuracy and usefulness for verification tasks.</p><p>Another gap is the potential increase in computational overhead and complexity when integrating machine learning with symbolic model checking. Machine learning models can be computationally expensive to train and evaluate, and may require large amounts of memory and storage. This can limit their scalability and practicality for real-world verification tasks.</p></sec><sec id="s4_2"><title>4.2. Future Prospects</title><p>So far, software model-checking techniques for dealing with errors in software programs were introduced. Symbolic execution can be applied to a wide range of complex data structures but there are still some data structures involving non-linear operations that present challenges for symbolic execution. As mentioned by [<xref ref-type="bibr" rid="scirp.125885-ref74">74</xref>] that hybrid approach can be used to combat the problem, this study proposed dynamic symbolic execution which combines concrete execution with symbolic execution and concolic testing that combines symbolic execution with concrete testing to test cases that maximize code coverage.</p><p>Besides the above, recent studies [<xref ref-type="bibr" rid="scirp.125885-ref55">55</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref56">56</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref57">57</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref76">76</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref77">77</xref>] [<xref ref-type="bibr" rid="scirp.125885-ref78">78</xref>] demonstrated the use of machine learning for software model checking. However, further research and development in integrating machine learning with symbolic model checking, to ensure that the combined approach is accurate, scalable, and efficient needs more exploration.</p><p>In general, the challenges to model-checking software highlight the ongoing need for research and innovation in this field. As software systems continue to grow in complexity and importance, there will be a growing need for effective and efficient verification techniques to ensure their correctness and reliability.</p></sec></sec><sec id="s5"><title>5. Conclusions</title><p>In this article, a review of recent techniques for error detection in program codes using model-checking technology was considered. First, an overview of the model-checking process and its importance in software verification is presented. Followed several techniques that have been developed to address some of the limitations of traditional model-checking techniques, including abstraction techniques, dynamic model checking, and model checking for software product lines.</p><p>Also, it highlighted some of the challenges and future prospects for model-checking software, including the state space explosion problem, incomplete and incorrect specifications, scalability, and the need to develop new algorithms and techniques to handle new types of software systems.</p><p>Based on this review of these techniques, model checking is a powerful and effective technique for detecting errors in program codes, but it also has some limitations that need to be addressed. However, with ongoing research and innovation, model checking will continue to be an important tool in the software verification process, helping to ensure the correctness and reliability of complex software systems.</p></sec><sec id="s6"><title>Conflicts of Interest</title><p>The author declares no conflicts of interest regarding the publication of this paper.</p></sec><sec id="s7"><title>Cite this paper</title><p>Aliyu, E.O. (2023) Review of Software Model-Checking Techniques for Dealing with Error Detection in Program Codes. Journal of Software Engineering and Applications, 16, 170-192. https://doi.org/10.4236/jsea.2023.166010</p></sec></body><back><ref-list><title>References</title><ref id="scirp.125885-ref1"><label>1</label><mixed-citation publication-type="other" xlink:type="simple">Henzinger, T.A., Jhala, R., Majumdar, R. and Sutre G. (2002) Lazy Abstraction. Proceedings of the 29th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, Portland, 16-18 January 2002, 58-70. https://doi.org/10.1145/503272.503279</mixed-citation></ref><ref id="scirp.125885-ref2"><label>2</label><mixed-citation publication-type="other" xlink:type="simple">Louden, K.C. (1993) Programming Languages Principles and Practice. URL.</mixed-citation></ref><ref id="scirp.125885-ref3"><label>3</label><mixed-citation publication-type="other" xlink:type="simple">Baier, C. and Katoen, J. (2008) Principle of Model Checking. MIT Press, Cambridge.</mixed-citation></ref><ref id="scirp.125885-ref4"><label>4</label><mixed-citation publication-type="other" xlink:type="simple">Aggarwal, K.K. and Yogesh, S. (2001) Software Engineering. 3rd Edition, New Age International Ltd, New Delhi.</mixed-citation></ref><ref id="scirp.125885-ref5"><label>5</label><mixed-citation publication-type="other" xlink:type="simple">Van-Hung, D. (2005) Model-Checking and the SPIN Model Checker. International Institute for Software Technology, Macau.</mixed-citation></ref><ref id="scirp.125885-ref6"><label>6</label><mixed-citation publication-type="other" xlink:type="simple">Mount, S. (2013) A Language-Independent Static Checking System for Coding Conventions. Ph.D. Thesis, University of Wolverhampton, Wolverhampton.https://www.semanticscholar.org/paper/A-language-independent-static-checking-system-for-Mount/a13e0e45b0c16ac8dda081666b9d2037c44e6b10</mixed-citation></ref><ref id="scirp.125885-ref7"><label>7</label><mixed-citation publication-type="other" xlink:type="simple">Li, Y., Jiang, X., Zhang, Y., Xie, T. and Zhang, L. (2017) An Empirical Study on the limitations of Static Code Analysis for Vulnerability Detection. IEEE Transactions on Software Engineering, 43, 462-477.</mixed-citation></ref><ref id="scirp.125885-ref8"><label>8</label><mixed-citation publication-type="other" xlink:type="simple">Abrial, J. (2009) Modelling in Event-B: System and Software Engineering. Cambridge University Press, Cambridge.</mixed-citation></ref><ref id="scirp.125885-ref9"><label>9</label><mixed-citation publication-type="book" xlink:type="simple">Clarke, E.M. (2008) The Birth of Model Checking. In: Grumberg, O. and Veith, H., Eds., 25 Years of Model Checking, Springer, Berlin, 1-26.</mixed-citation></ref><ref id="scirp.125885-ref10"><label>10</label><mixed-citation publication-type="other" xlink:type="simple">Strunk, E.A., Aiello, M.A. and Knight, J.C. (2006) A Survey of Tools for Model Checking and Model-Based Development. Technical Report, Department of Computer Science, University of Virginia, Charlottesville.</mixed-citation></ref><ref id="scirp.125885-ref11"><label>11</label><mixed-citation publication-type="other" xlink:type="simple">Jhala, R. and Majumdar, R. (2009) Software Model Checking. ACM Computing Surveys, 41, 1-54. https://doi.org/10.1145/1592434.1592438</mixed-citation></ref><ref id="scirp.125885-ref12"><label>12</label><mixed-citation publication-type="other" xlink:type="simple">Ben-Ari, M. (2008) Principles of SPIN Model Checker. Springer-Verlag, London.</mixed-citation></ref><ref id="scirp.125885-ref13"><label>13</label><mixed-citation publication-type="other" xlink:type="simple">Valero, M. (2005) Modal Abstraction and Replication of Processes with Data. Springer, Berlin.https://pdfs.semanticscholar.org/804b/02fd88d199360b65fb6efe13e93e84428596.pdf</mixed-citation></ref><ref id="scirp.125885-ref14"><label>14</label><mixed-citation publication-type="book" xlink:type="simple">Queille, J.P. and Sifakis, J. (1982) Specification and Verification of Concurrent System in CESAR. In: Dezani-Ciancaglini, M. and Montanari, U. Eds., Programming 1982: International Symposium on Programming, Springer, Berlin, 337-351.https://link.springer.com/chapter/10.1007/3-540-11494-7_22https://doi.org/10.1007/3-540-11494-7_22</mixed-citation></ref><ref id="scirp.125885-ref15"><label>15</label><mixed-citation publication-type="other" xlink:type="simple">Clarke, E.M., Emerson, E.A. and Sistla, A.P. (1986) Automatic Verification of Finite-StateConcurrent Systems Using Temporal Logic Specifications. ACM Transactions on Programming Languages and Systems, 8, 244-263. https://doi.org/10.1145/5397.5399</mixed-citation></ref><ref id="scirp.125885-ref16"><label>16</label><mixed-citation publication-type="other" xlink:type="simple">Esparza, J. (1994) Model Checking Using Net Unfolding. Science of Computer Programming, 23, 151-195. https://doi.org/10.1016/0167-6423(94)00019-0</mixed-citation></ref><ref id="scirp.125885-ref17"><label>17</label><mixed-citation publication-type="other" xlink:type="simple">McMillan, K.L. (1992) Symbolic Model Checking: An Approach to the State Explosion Problem. Ph.D. Thesis, Carnegie Mellon University, Pittsburgh, 1-212.</mixed-citation></ref><ref id="scirp.125885-ref18"><label>18</label><mixed-citation publication-type="other" xlink:type="simple">Yin, X. (2006) An Introduction to the SPIN Model Checker. Tools for Model Checking and Model-Based Development Project Report: Tool Description and Analysis.</mixed-citation></ref><ref id="scirp.125885-ref19"><label>19</label><mixed-citation publication-type="book" xlink:type="simple">Biere, A. (2008) Tutorial on Model Checking: Modelling and Verification in Computer Science. In: Horimoto, K., Regensburger, G., Rosenkranz, M. and Yoshida, H., Eds., AB 2008: Algebraic Biology, Lecture Notes in Computer Science, Springer, Berlin, 16-21. https://link.springer.com/chapter/10.1007/978-3-540-85101-1_2https://doi.org/10.1007/978-3-540-85101-1_2</mixed-citation></ref><ref id="scirp.125885-ref20"><label>20</label><mixed-citation publication-type="book" xlink:type="simple">Khurshid, S., Pasareanu, C.S. and Visser, W. (2003) Generalized Symbolic Execution for Model Checking and Testing. In: Garavel, H. and Hatcliff, J., Eds., TACAS 2003: Tools and Algorithms for the Construction and Analysis of Systems, Springer, Berlin, 553-568. https://doi.org/10.1007/3-540-36577-X_40</mixed-citation></ref><ref id="scirp.125885-ref21"><label>21</label><mixed-citation publication-type="book" xlink:type="simple">Armando, A., Mantovani, J. and Platania, L. (2006) Bounded Model Checking of Software Using SMT Solvers Instead of SAT Solvers. In: Valmari, A., Ed., SPIN 2006: Model Checking Software, Springer, Berlin, 146-162. https://doi.org/10.1007/11691617_9</mixed-citation></ref><ref id="scirp.125885-ref22"><label>22</label><mixed-citation publication-type="other" xlink:type="simple">Yang, Z., Wang, C., Gupta, A. and Ivan&amp;#269;i&amp;#263;, F. (2008) Model Checking Sequential Software Programs via Mixed Symbolic Analysis. ACM Transaction on Design Automation of Electronic System, 14, 1-26. https://doi.org/10.1145/1455229.1455239</mixed-citation></ref><ref id="scirp.125885-ref23"><label>23</label><mixed-citation publication-type="book" xlink:type="simple">Wehrle, M. and Kupferschmid, S. (2010) Context-Enhanced Directed Model Checking. In: Van De Pol, J. and Weber, M., Eds., SPIN 2010: Model Checking Software, Springer, Berlin, 88-105. https://doi.org/10.1007/978-3-642-16164-3_7 https://link.springer.com/chapter/10.1007/978-3-642-16164-3_7</mixed-citation></ref><ref id="scirp.125885-ref24"><label>24</label><mixed-citation publication-type="book" xlink:type="simple">Eyer, D. and Stahlbauer, A. (2013) BDD-Based Software Model Checking with CPACHECKER. In: Ku&amp;#269;era, A., Henzinger, T.A., Ne&amp;#353;et&amp;#345;il, J., Vojnar, T. and Anto&amp;#353;, D., Eds., MEMICS 2012: Mathematical and Engineering Methods in Computer Science, Springer, Berlin, 1-11. https://doi.org/10.1007/978-3-642-36046-6_1https://link.springer.com/chapter/10.1007/978-3-642-36046-6_1</mixed-citation></ref><ref id="scirp.125885-ref25"><label>25</label><mixed-citation publication-type="other" xlink:type="simple">Noureddine, M. and Zaraket, F.A. (2016) Model Checking Software with First Order Logic Specifications Using AIG Solvers. IEEE Transactions on Software Engineering, 42, 741-763. https://scholar.google.com/citations?user=iLJ3TyQAAAAJ&amp;hl=enhttps://doi.org/10.1109/TSE.2016.2520468</mixed-citation></ref><ref id="scirp.125885-ref26"><label>26</label><mixed-citation publication-type="other" xlink:type="simple">Cousot, P. (2001) Abstract Interpretation Based Formal Methods and Future Challenge. https://www.di.ens.fr/~cousot/publications.www/Cousot-LNCS2000-sv-sb.pdf</mixed-citation></ref><ref id="scirp.125885-ref27"><label>27</label><mixed-citation publication-type="other" xlink:type="simple">Abraham, E. and Kremer, G. (2017) Satisfiability Checking: Theory and Application. Springer International Publishing, New York.</mixed-citation></ref><ref id="scirp.125885-ref28"><label>28</label><mixed-citation publication-type="book" xlink:type="simple">Ball, T., Podelski, A. and Rajamani, S.K. (2000) Boolean and Cartesian Abstraction for Model Checking C Programs. In: Margaria, T. and Yi, W., Eds., TACAS 2001: Tools and Algorithms for the Construction and Analysis of Systems, Springer, Berlin, 268-283.https://link.springer.com/chapter/10.1007/3-540-45319-9_19https://doi.org/10.1007/3-540-45319-9_19</mixed-citation></ref><ref id="scirp.125885-ref29"><label>29</label><mixed-citation publication-type="other" xlink:type="simple">Ball, T., Majumdar, R., Millstein, T. and Rajamani, S.K. (2001) Automatic Predicate Abstraction of C Programs. Proceedings of the ACM SIGPLAN 2001 Conference on Programming Language Design and Implementation, Snowbird, June 2001, 203-213. https://doi.org/10.1145/378795.378846</mixed-citation></ref><ref id="scirp.125885-ref30"><label>30</label><mixed-citation publication-type="other" xlink:type="simple">Flanagan, C. and Qadeer, S. (2002) Predicate Abstraction for Software Verification. Proceedings of the 29th ACM SIGPLAN-SIGACT Symposium on Principles of Programming, Portland, 16-18 January 2002, 191-202. https://doi.org/10.1145/503272.503291</mixed-citation></ref><ref id="scirp.125885-ref31"><label>31</label><mixed-citation publication-type="book" xlink:type="simple">Fehnker, A., Brauer, J., Huuck, R. and Seefried, S. (2008) Goanna: Syntactic Software Model Checking. In: Cha, S., Choi, J.Y., Kim, M., Lee, I. and Viswanathan, M., Eds., ATVA 2008: Automated Technology for Verification and Analysis, Springer, Berlin, 216-221. https://link.springer.com/chapter/10.1007/978-3-540-88387-6_17</mixed-citation></ref><ref id="scirp.125885-ref32"><label>32</label><mixed-citation publication-type="other" xlink:type="simple">Griesmayer, A. (2007) Debugging Software from Verification to Repair. Ph.D. Thesis, Graz University of Technology, Austria, 1-108</mixed-citation></ref><ref id="scirp.125885-ref33"><label>33</label><mixed-citation publication-type="other" xlink:type="simple">Li, Y. (2014) Symbolic Abstraction with SMT Solvers. Proceedings of the 41st ACM SIGPLAN-SIGACT Symposium on Principles of Programming, San Diego, 22-24 January 2014, 607-618. https://doi.org/10.1145/2535838.2535857</mixed-citation></ref><ref id="scirp.125885-ref34"><label>34</label><mixed-citation publication-type="other" xlink:type="simple">Lomuscio, A. and Michaliszyn, J. (2015) Verifying Multi-Agent Systems by Model Checking Three-valued Abstractions. Proceedings of the 2015 International Conference on Autonomous Agents and Multiagent, Istanbul, 4-8 May 2015, 189-198.</mixed-citation></ref><ref id="scirp.125885-ref35"><label>35</label><mixed-citation publication-type="other" xlink:type="simple">Clarke, E., Biere, A., Rami, R. and Zhu, Y. (2001) Bounded Model Checking Using Satisfiability Solving. Formal Method in System Design, 19, 7-34. https://doi.org/10.1023/A:1011276507260</mixed-citation></ref><ref id="scirp.125885-ref36"><label>36</label><mixed-citation publication-type="book" xlink:type="simple">Merz, F., Falke, S. and Sinz, C. (2012) LLBMC: Bounded Model Checking of C and C++ Programs Using a Compiler IR. In: Joshi, R., Müller, P. and Podelski, A., Eds., VSTTE 2012: Verified Software: Theories, Tools, Experiments, Springer, Berlin, 146-161. https://doi.org/10.1007/978-3-642-27705-4_12</mixed-citation></ref><ref id="scirp.125885-ref37"><label>37</label><mixed-citation publication-type="other" xlink:type="simple">Peled, D. (2001) Model Checking. Department of Computer Science, Bar llan University, Ramat Gan.</mixed-citation></ref><ref id="scirp.125885-ref38"><label>38</label><mixed-citation publication-type="other" xlink:type="simple">Guo, H.Y., Wu, M., Zhou, L.D., Hu, G., Yang, J.F. and Zhang L. (2011) Practical Software Model Checking via Dynamic Interface Reduction. Proceedings of the Twenty-Third ACM Symposium on Operating Systems Principles, Cascais, 23-26 October 2011, 265-278. https://doi.org/10.1145/2043556.2043582</mixed-citation></ref><ref id="scirp.125885-ref39"><label>39</label><mixed-citation publication-type="other" xlink:type="simple">Nguyen, V.Y. and Ruys, T.C. (2013) Selected Dynamic Issues in Software Model Checking. International Journal on Software Tools for Technology Transfer, 15, 337-362. https://doi.org/10.1007/s10009-012-0261-y</mixed-citation></ref><ref id="scirp.125885-ref40"><label>40</label><mixed-citation publication-type="book" xlink:type="simple">Gupta, A., Kahlon, V., Qadeer, S. and Touili, T. (2018) Model Checking Concurrent Programs. In: Clarke, E., Henzinger, T., Veith, H. and Bloem, R., Eds., Handbook of Model Checking, Springer, Cham, 573-611. https://doi.org/10.1007/978-3-319-10575-8_18</mixed-citation></ref><ref id="scirp.125885-ref41"><label>41</label><mixed-citation publication-type="other" xlink:type="simple">Santos, I.S., Rocha, L.S., Santos-Neto, P.A. and Andrade, R.M.C. (2016) Model Verification of Dynamic Software Product Lines. Proceedings of the XXX Brazilian Symposium on Software Engineering, Maringá, 19-23 September 2016, 113-122. https://doi.org/10.1145/2973839.2973852</mixed-citation></ref><ref id="scirp.125885-ref42"><label>42</label><mixed-citation publication-type="other" xlink:type="simple">Avgerinos, T., Rebert, A., Cha, S.K. and Brumley, D. (2014) Enhancing Symbolic Execution with Veritesting. Proceedings of the 36th International Conference on Software Engineering, Hyderabad, 31 May-7 June 2014, 1083-1094. https://doi.org/10.1145/2568225.2568293</mixed-citation></ref><ref id="scirp.125885-ref43"><label>43</label><mixed-citation publication-type="other" xlink:type="simple">Bohme, M., Pham, V.T. and Roychoudhury, A. (2017) Coverage-Based Greybox Fuzzing as Markov Chain. IEEE Transactions on Software Engineering, 45, 489-506. https://doi.org/10.1109/TSE.2017.2785841</mixed-citation></ref><ref id="scirp.125885-ref44"><label>44</label><mixed-citation publication-type="other" xlink:type="simple">Gulzar, M.A., Musuvathi, M. and Kim, M. (2020) BigTest: A Symbolic Execution Based Systematic Test Generation Tool for Apache Spark. Proceedings of the ACM/IEEE 42nd International Conference on Software Engineering: Companion Proceedings, Seoul South, 27 June-19 July 2020, 61-64. https://doi.org/10.1145/3377812.3382145</mixed-citation></ref><ref id="scirp.125885-ref45"><label>45</label><mixed-citation publication-type="book" xlink:type="simple">Chalupa, M., Jasek, T., Movak, J., Rechtackova, A., Sokova, V. and Strejcek, J. (2021) Symbiotic 8: Beyond Symbolic Execution. In: Groote, J.F. and Larsen, K.G., Eds., TACAS 2021: Tools and Algorithms for the Construction and Analysis of Systems, Springer, Cham, 453-457. https://doi.org/10.1007/978-3-030-72013-1_31</mixed-citation></ref><ref id="scirp.125885-ref46"><label>46</label><mixed-citation publication-type="book" xlink:type="simple">Mrazek, J., Bauch, P., Lauko, H. and Barnat, J. (2016) SymDIVINE: Tool for Control-Explicit Data-Symbolic State Space Exploration. In: Bo&amp;#353;na&amp;#269;ki, D. and Wijs, A., Eds., SPIN 2016: Model Checking Software, Springer, Cham, 208-213. https://doi.org/10.1007/978-3-319-32582-8_14</mixed-citation></ref><ref id="scirp.125885-ref47"><label>47</label><mixed-citation publication-type="other" xlink:type="simple">Visser, W., Pasareanu, C.S. and Khurshid, S. (2004) Test Input Generation with Java Pathfinder. ACM SIGSOFT Software Engineering Notes, 29, 97-107. https://doi.org/10.1145/1013886.1007526</mixed-citation></ref><ref id="scirp.125885-ref48"><label>48</label><mixed-citation publication-type="other" xlink:type="simple">Penczek, W., Szreter, M., Gerth, R. and Kuiper, R. (2000) Improving Partial Order Reductions for Universal Branching Time Properties. Fundameta Informaticae, 43, 245-267. https://doi.org/10.3233/FI-2000-43123413</mixed-citation></ref><ref id="scirp.125885-ref49"><label>49</label><mixed-citation publication-type="other" xlink:type="simple">Burch, J.R., Clarke, E.M., McMillan, K.L., Dill, D.L. and Hwang, L.J. (1992) Symbolic Model Checking: 1020 States and Beyond. Information and Computation, 98, 142-170. https://doi.org/10.1016/0890-5401(92)90017-A</mixed-citation></ref><ref id="scirp.125885-ref50"><label>50</label><mixed-citation publication-type="other" xlink:type="simple">Havelund, K. and Pressburger, T. (1999) Model Checking Java Programs Using Java PathFinder. International Journal on Software Tools for Technology Transfer, 2, 366-381. https://doi.org/10.1007/s100090050043</mixed-citation></ref><ref id="scirp.125885-ref51"><label>51</label><mixed-citation publication-type="other" xlink:type="simple">Cadar, C., Dunbar, D. and Engler, D.R. (2008) KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs. Proceedings of the 8th USENIX Conference on Operating Systems Design and Implementation, San Diego, 8-10 December 2008, 209-224.</mixed-citation></ref><ref id="scirp.125885-ref52"><label>52</label><mixed-citation publication-type="other" xlink:type="simple">Clarke, E.M., Grumberg, O., Kroening D., Peled, D. and Veith H. (2018) Model Checking. 2nd Edition, MIT Press, Cambridge.</mixed-citation></ref><ref id="scirp.125885-ref53"><label>53</label><mixed-citation publication-type="book" xlink:type="simple">McMillan, K.L. (1999) Symbolic Model Checking. In: Inan, M.K. and Kurshan, R.P., Eds., Verification of Digital and Hybrid Systems, Springer, Berlin, 117-137. https://doi.org/10.1007/978-3-642-59615-5_6</mixed-citation></ref><ref id="scirp.125885-ref54"><label>54</label><mixed-citation publication-type="other" xlink:type="simple">Godefroid, P. (1996) Partial-Order Methods for the Verification of Concurrent Systems: An Approach to the State-Explosion Problem. Springer, Berlin. https://doi.org/10.1007/3-540-60761-7</mixed-citation></ref><ref id="scirp.125885-ref55"><label>55</label><mixed-citation publication-type="other" xlink:type="simple">Sen, K., Marinov, D., Agha, G. and Sridharan, M. (2016) Guiding Symbolic Execution towards Unexplored Code. Proceedings of the 2016 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages and Applications, Amsterdam, 2-4 November 2016, 753-771.</mixed-citation></ref><ref id="scirp.125885-ref56"><label>56</label><mixed-citation publication-type="other" xlink:type="simple">Bao, X., Yin, H., Chen, X. and Zhang, L. (2018) Speeding Up Symbolic Model Checking with Machine Learning. Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering, Montpellier, 3-7 September 2018, 570-580.</mixed-citation></ref><ref id="scirp.125885-ref57"><label>57</label><mixed-citation publication-type="other" xlink:type="simple">Ma, L., Zhang, F.Y., et al. (2018) DeepGauge: Multi-Granularity Testing Criteria for Deep Learning Systems. ArXiv: 1803.07519.</mixed-citation></ref><ref id="scirp.125885-ref58"><label>58</label><mixed-citation publication-type="other" xlink:type="simple">Durrelli, V.H.S., Durelli, R.S., Borges, S.S., Endo, A.T., Eler, M.M., Dias, D.R.C. and Guimaraes, M.P. (2019) Machine Learning Applied to Software Testing: A Systematic Mapping Study. IEEE Transactions on Realiability, 68, 1189-1212. https://doi.org/10.1109/TR.2019.2892517</mixed-citation></ref><ref id="scirp.125885-ref59"><label>59</label><mixed-citation publication-type="book" xlink:type="simple">Vardhan, A., Sen, K., Viswanathan, M. and Agha, G. (2004) Learning to Verify Safety Properties. In: Davies, J., Schulte, W. and Barnett, M., Eds., ICFEM 2004: Formal Methods and Software Engineering, Springer, Berlin, 274-289. https://doi.org/10.1007/978-3-540-30482-1_26</mixed-citation></ref><ref id="scirp.125885-ref60"><label>60</label><mixed-citation publication-type="other" xlink:type="simple">Kalyan, A., Mohta, A., Polozov, O., Batra, D., Jain, P. and Gulwani, S. (2018) Neural-Guided Deductive Search for Real-Time Program Synthesis from Examples. ArXiv: 1804.01186. https://arxiv.org/abs/1804.01186</mixed-citation></ref><ref id="scirp.125885-ref61"><label>61</label><mixed-citation publication-type="book" xlink:type="simple">Gennari, J., Gurfinkel, A., Kahsai, T., Navas, J.A. and Schwartz, E.J. (2018) Executable Counterexamples in Software Model Checking. In: Piskac, R. and Rümmer, P., Eds., VSTTE 2018: Verified Software: Theories, Tools and Experiments, Vol. 11294, Springer, Cham, 17-37. https://doi.org/10.1007/978-3-030-03592-1_2</mixed-citation></ref><ref id="scirp.125885-ref62"><label>62</label><mixed-citation publication-type="other" xlink:type="simple">Utting, M. and Legeard, B. (2006) Practical Model-Based Testing: A Tools Approach. Morgan Kaufmann, San Francisco.</mixed-citation></ref><ref id="scirp.125885-ref63"><label>63</label><mixed-citation publication-type="other" xlink:type="simple">Havelund, K. and Rosu, G. (2002) Monitoring Programs Using Rewriting. Proceedings of the 14th International Conference on Computer Aided Verification, Copenhagen, 27-31 July 2002, 450-462.</mixed-citation></ref><ref id="scirp.125885-ref64"><label>64</label><mixed-citation publication-type="other" xlink:type="simple">Pacheco, C., Lahiri, S.K., Ernst, M.D. and Ball, T. (2007) Feedback-Directed Random Test Generation. 29th International Conference on Software Engineering, Minneapolis, MN, 20-26 May 2007, 75-84. https://doi.org/10.1109/ICSE.2007.37</mixed-citation></ref><ref id="scirp.125885-ref65"><label>65</label><mixed-citation publication-type="other" xlink:type="simple">Harman, M. and Sthamer, H. (2002) Search-Based Software Testing. Proceedings of the 2002 International Symposium on Software Testing and Analysis, Roma, 22-24 July 2002, 249-258.</mixed-citation></ref><ref id="scirp.125885-ref66"><label>66</label><mixed-citation publication-type="other" xlink:type="simple">King, J.C. (1976) Symbolic Execution and Program Testing. Communications of the ACM, 19, 385-394. https://doi.org/10.1145/360248.360252</mixed-citation></ref><ref id="scirp.125885-ref67"><label>67</label><mixed-citation publication-type="other" xlink:type="simple">Liang, G., Liao, L., Xu, X., Du, J., Li, G. and Zhao, H. (2013) Effective Fuzzing Based on Dynamic Taint Analysis. 2013 Ninth International Conference on Computational Intelligence and Security, Emeishan, 14-15 December 2013, 615-619. https://doi.org/10.1109/CIS.2013.135</mixed-citation></ref><ref id="scirp.125885-ref68"><label>68</label><mixed-citation publication-type="book" xlink:type="simple">Kwiatkowska, M., Norman, G. and Parker, D. (2018) Probabilistic Model Checking: Advances and Applications. In: Drechsler, R., Ed., Formal System Verification, Springer, Cham, 73-121. https://doi.org/10.1007/978-3-319-57685-5_3</mixed-citation></ref><ref id="scirp.125885-ref69"><label>69</label><mixed-citation publication-type="other" xlink:type="simple">Sen, K., Marinov, D. and Agha, G. (2005) CUTE: A Concolic Unit Testing Engine for C. Proceedings of the 10th European Software Engineering Conference Held Jointly with 13th ACM SIGSOFT International Symposium on Foundations of Software Engineering (ESEC/FSE-13), Chicago, 5-9 September 2005, 263-272.</mixed-citation></ref><ref id="scirp.125885-ref70"><label>70</label><mixed-citation publication-type="other" xlink:type="simple">Satpathy, M. and Ramesh, S. (2007) Test Case Generation from Formal Models through Abstraction Refinement and Model Checking. Proceedings of the 3rd International Workshop on Advances in Model-Based Testing, London, 9-12 July 2007, 85-94. https://doi.org/10.1145/1291535.1291544</mixed-citation></ref><ref id="scirp.125885-ref71"><label>71</label><mixed-citation publication-type="other" xlink:type="simple">Emerson, E.A. and Namjoshi, K.S. (1998) Automatic Verification of Finite-State Concurrent Systems Using Temporal Logic Specifications. ACM Transactions on Programming Languages and Systems, 8, 244-263.</mixed-citation></ref><ref id="scirp.125885-ref72"><label>72</label><mixed-citation publication-type="other" xlink:type="simple">Lamport, L. (1986) On Interprocess Communication. Distributed Computing, 1, 77-85. https://doi.org/10.1007/BF01786227</mixed-citation></ref><ref id="scirp.125885-ref73"><label>73</label><mixed-citation publication-type="other" xlink:type="simple">Alur, R., Bodík, R., Juniwal, G. and Seshia, S.A. (2015) Synthesis of Cyber-Physical Systems. Proceedings of the IEEE, 103, 1589-1609.</mixed-citation></ref><ref id="scirp.125885-ref74"><label>74</label><mixed-citation publication-type="other" xlink:type="simple">Gurfinkel, A. and Chaki, S. (2015) Combining Static Analysis and Model Checking for Program Analysis. Formal Methods in System Design, 47, 62-91.</mixed-citation></ref><ref id="scirp.125885-ref75"><label>75</label><mixed-citation publication-type="other" xlink:type="simple">Zhang, L., Chen, Y., Zhang, Y. and Liu, Y. (2020) A Critical Survey of Machine Learning-Assisted Verification. IEEE Transactions on Software Engineering, 47, 1064-1087.</mixed-citation></ref><ref id="scirp.125885-ref76"><label>76</label><mixed-citation publication-type="other" xlink:type="simple">Pei, K., Cao, Y., Yang, J. and Jia, Z. (2017) Deep Learning-Based Software-Defined Networking for IoT Security. IEEE Network, 31, 80-85.</mixed-citation></ref><ref id="scirp.125885-ref77"><label>77</label><mixed-citation publication-type="other" xlink:type="simple">Gao, Y., Wei, Y., Sun, J. and Zhang, X. (2019) Learning-Based Abstraction Refinement for Software Model Checking. Frontiers of Information Technology and Electronic Engineering, 20, 372-382.</mixed-citation></ref><ref id="scirp.125885-ref78"><label>78</label><mixed-citation publication-type="other" xlink:type="simple">Zhang, X., Liu, Y., Huang, L. and Zhang, Y. (2021) Reinforcement Learning-Based Heuristic for Accelerating Software Model Checking. Journal of Systems and Software, 174, Article ID: 110950.</mixed-citation></ref></ref-list></back></article>