<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.4 20241031//EN" "JATS-journalpublishing1-4.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article" dtd-version="1.4" xml:lang="en">
  <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-3124</issn>
      <issn pub-type="ppub">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.2026.193004</article-id>
      <article-id pub-id-type="publisher-id">jsea-150155</article-id>
      <article-categories>
        <subj-group>
          <subject>Article</subject>
        </subj-group>
        <subj-group>
          <subject>Computer Science</subject>
          <subject>Communications</subject>
        </subj-group>
      </article-categories>
      <title-group>
        <article-title>SymPcNSGA-Testing: A Hybrid Approach to Mitigate Path Explosion in Software Programs</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Kimbi</surname>
            <given-names>Xaveria Djam Youh</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <contrib-id contrib-id-type="orcid">0009-0006-6787-3713</contrib-id>
          <name name-style="western">
            <surname>Sipewa</surname>
            <given-names>Sandra Maïla Modjeu</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Djombissie</surname>
            <given-names>Levinne Clemence Djeumeni</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Nkenang</surname>
            <given-names>Flavie Davila Ndemafo</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
      </contrib-group>
      <aff id="aff1"><label>1</label> Department of Computer Science, Faculty of Science, University of Yaoundé 1, Yaoundé, Cameroon </aff>
      <author-notes>
        <fn fn-type="conflict" id="fn-conflict">
          <p>The authors declare no conflicts of interest regarding the publication of this paper.</p>
        </fn>
      </author-notes>
      <pub-date pub-type="epub">
        <day>11</day>
        <month>03</month>
        <year>2026</year>
      </pub-date>
      <pub-date pub-type="collection">
        <month>03</month>
        <year>2026</year>
      </pub-date>
      <volume>19</volume>
      <issue>03</issue>
      <fpage>55</fpage>
      <lpage>72</lpage>
      <history>
        <date date-type="received">
          <day>27</day>
          <month>08</month>
          <year>2025</year>
        </date>
        <date date-type="accepted">
          <day>13</day>
          <month>03</month>
          <year>2026</year>
        </date>
        <date date-type="published">
          <day>16</day>
          <month>03</month>
          <year>2026</year>
        </date>
      </history>
      <permissions>
        <copyright-statement>© 2026 by the authors and Scientific Research Publishing Inc.</copyright-statement>
        <copyright-year>2026</copyright-year>
        <license license-type="open-access">
          <license-p> This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license ( <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link> ). </license-p>
        </license>
      </permissions>
      <self-uri content-type="doi" xlink:href="https://doi.org/10.4236/jsea.2026.193004">https://doi.org/10.4236/jsea.2026.193004</self-uri>
      <abstract>
        <p>The path explosion problem poses a significant barrier in the domain of software testing, making it nearly impossible to exhaustively explore all execution paths in large or complex software. Despite the extensive use of symbolic execution in the literature, the issue of path explosion remains largely unresolved. To address this limitation, we propose SymPcNSGA-Testing (Symbolic execution, Path Clustering, and Non-dominated Sorting Genetic Algorithm-II Testing), a hybrid methodology combining symbolic execution, path clustering, and multi-objective optimization using NSGA-II (Non-dominated Sorting Genetic Algorithm-II). Our approach aims to select a reduced yet representative set of execution paths that ensures maximum branch coverage while minimizing redundancy. SymPcNSGA-Testing operates in three stages: 1) symbolic execution with KLEE to explore the path space, 2) clustering of paths using the Ktest-cluster algorithm to group similar execution behaviors, and 3) multi-objective path optimization using NSGA-II, which selects representative paths that balance high branch coverage and minimal path set size. We evaluated our methodology on ten open-source programs from the Coreutils 9.5 package and compared it against several KLEE exploration strategies (DFS, BFS, NURS, Merging, and Covering-New). The results demonstrate that SymPcNSGA-Testing outperforms some of KLEE’s strategies by achieving high branch coverage while effectively mitigating the path explosion problem. This study highlights the benefits of combining symbolic analysis and evolutionary multi-objective optimization to enhance test efficiency in complex software systems.</p>
      </abstract>
      <kwd-group kwd-group-type="author-generated" xml:lang="en">
        <kwd>Multi-Objective Optimization</kwd>
        <kwd>NSGA-II</kwd>
        <kwd>Path Clustering</kwd>
        <kwd>Path Explosion</kwd>
        <kwd>Symbolic Execution</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec1">
      <title>1. Introduction</title>
      <p>The path explosion problem poses a significant barrier in the domain of software testing, making it nearly impossible to exhaustively explore all execution paths in large or complex software. Many techniques have been used, such as Symbolic Execution, which explores multiple execution paths by interpreting program inputs as symbolic variables and resolving constraints using SMT solvers. This technique has been adopted in several widely used tools, such as KLEE, due to its ability to systematically and automatically uncover hard-to-find execution paths [<xref ref-type="bibr" rid="B1">1</xref>]. However, as software systems grow in complexity, so does the number of potential execution paths, which makes exhaustive exploration increasingly impractical.</p>
      <p>One of the main obstacles encountered in symbolic execution is the path explosion phenomenon, in which the number of possible execution paths grows exponentially as the complexity of the program increases. This explosion renders full exploration infeasible, even for relatively small programs, and limits the scalability and effectiveness of symbolic analysis. As a result, some tools find it difficult to achieve high branch coverage efficiently, both in terms of time and computational resources. This leads us to a critical research question: How can we efficiently reduce the number of paths to be analyzed while preserving maximum branch coverage?</p>
      <p>Many strategies have been proposed to mitigate path explosion. Tools such as KLEE implement search heuristics like Depth-First Search (DFS), Breadth-First Search (BFS), and various NURS strategies to guide path exploration. Other techniques include state merging, where similar program states are combined to reduce redundancy [<xref ref-type="bibr" rid="B2">2</xref>], and state pruning, which discards states deemed less promising [<xref ref-type="bibr" rid="B2">2</xref>]. Meanwhile, Search-Based Software Testing (SBST) introduces metaheuristics like genetic algorithms to explore input domains and maximize coverage [<xref ref-type="bibr" rid="B3">3</xref>]. More recent approaches include machine learning-guided exploration [<xref ref-type="bibr" rid="B4">4</xref>] and concolic testing [<xref ref-type="bibr" rid="B2">2</xref>].</p>
      <p>While these techniques provide valuable insights, they each have significant limitations. Heuristic-based search strategies may suffer from local optima, failing to explore diverse paths. State merging and pruning risk losing critical execution behaviors. Search-Based Software Testing techniques, like genetic algorithms, although powerful in searching input spaces, often lack structural awareness of symbolic paths and do not exploit similarities among them. Furthermore, few existing works systematically integrate path similarity reduction prior to optimization, resulting in redundancy and suboptimal selection of test paths.</p>
      <p>To address these shortcomings, we introduce SymPcNSGA-Testing (Symbolic execution, Path clustering and NSGA-II Testing), a novel hybrid methodology for mitigating path explosion in symbolic execution. Our approach consists of three phases: </p>
      <p>1) Symbolic execution using KLEE to generate a diverse set of execution paths; </p>
      <p>2) Clustering of symbolic paths using the Ktest-cluster algorithm to group structurally similar paths; </p>
      <p>3) Multi-objective optimization via NSGA-II to select a minimal, representative subset of paths that ensures maximum branch coverage. </p>
      <p>The key research questions we explore are:</p>
      <p><bold>RQ1</bold>: How can the combination of symbolic execution, a path clustering strategy, and multi-objective evolutionary algorithms improve the efficiency of software testing in the face of path explosion? <bold>RQ2</bold>: How effective is SymPcNSGA-Testing in achieving maximum branch coverage while mitigating path explosion? </p>
    </sec>
    <sec id="sec2">
      <title>2. Related Work</title>
      <p>The path explosion problem is one of the most critical challenges in symbolic execution and search-based software testing. A wide range of techniques has been proposed to address it, including parallelization, heuristics, clustering, and evolutionary multi-objective algorithms. This section reviews existing approaches and highlights their contributions and limitations in relation to our proposed SymPcNSGA-Testing methodology.</p>
      <sec id="sec2dot1">
        <title>2.1. Parallel and Distributed Symbolic Execution</title>
        <p>Several works have focused on parallelizing symbolic execution to reduce exploration time. Staats and Păsăreanu [<xref ref-type="bibr" rid="B5">5</xref>] introduced Simple Static Partitioning, a method that partitions the symbolic execution tree using preconditions and assigns partitions to different processors. This method achieved significant speedups (up to 90×), but its static nature may leave relevant paths unexplored.</p>
        <p>Cloud9 [<xref ref-type="bibr" rid="B6">6</xref>], proposed by Bucur <italic>et al</italic>., tackles path explosion by distributing symbolic execution over clusters of commodity machines. Cloud9 offers linear scalability and integrates well with existing test suites. However, it does not reduce the number of paths explored, nor does it include any strategy to eliminate redundant or similar paths.</p>
      </sec>
      <sec id="sec2dot2">
        <title>2.2. Heuristics and Search-Guided Execution</title>
        <p>Heuristics have been introduced to guide symbolic execution toward unexplored or critical paths. van Vliet [<xref ref-type="bibr" rid="B7">7</xref>] extended the OOX verification engine with several heuristics, including minimal-distance-to-uncovered, random-path, and round-robin combinations. While they improve coverage in some cases, these heuristics do not eliminate redundant paths after execution.</p>
        <p>Xiao <italic>et al</italic>. [<xref ref-type="bibr" rid="B8">8</xref>] addressed path explosion using heuristic learning, search strategies, and function abstraction to improve vulnerability discovery. Yet, the absence of empirical comparisons and a lack of path reduction mechanisms limit the scope of their contributions.</p>
        <p>Zhang <italic>et al</italic>. [<xref ref-type="bibr" rid="B9">9</xref>] proposed MuSE (Multiplex Symbolic Execution), a technique that integrates constraint solving directly into symbolic path exploration, enabling concurrent exploration of multiple paths. MuSE achieved significant speedups across multiple solvers. Nonetheless, it does not reduce the total number of paths or apply selection heuristics such as genetic algorithms.</p>
        <p>Bessler <italic>et al</italic>. [<xref ref-type="bibr" rid="B10">10</xref>] introduced Metrinome, a tool that statically estimates the potential severity of path explosion based on structural complexity metrics (e.g., cyclomatic complexity, loop depth). Although useful for planning symbolic analysis, Metrinome does not propose any execution or optimization mechanism to reduce the number of generated paths.</p>
      </sec>
      <sec id="sec2dot3">
        <title>2.3. Evolutionary and Feedback-Based Approaches</title>
        <p>Genetic algorithms have been employed in several works to improve test generation. Gong <italic>et al</italic>. [<xref ref-type="bibr" rid="B11">11</xref>] proposed ATCG-PC, a multi-objective genetic algorithm where paths are grouped and optimized in parallel using subpopulations. While this improves coverage, no selection mechanism is applied to extract a minimal subset of relevant paths.</p>
        <p>Zhu <italic>et al</italic>. [<xref ref-type="bibr" rid="B12">12</xref>] improved test generation by grouping paths based on similarity, identifying common prefix paths, and guiding symbolic execution with reduced constraints. This results in performance gains but still does not explicitly minimize the number of selected paths for testing.</p>
        <p>Semujju <italic>et al</italic>. [<xref ref-type="bibr" rid="B13">13</xref>] introduced a feedback-driven approach that removes path groups from the search space if they show no improvement across generations. This mechanism prevents wasting search efforts on unreachable paths. However, this strategy may inadvertently drop critical paths if the dropout condition is too strict.</p>
      </sec>
      <sec id="sec2dot4">
        <title>2.4. State Reduction Techniques</title>
        <p>State merging and pruning are also explored to mitigate path explosion. Copeland [<xref ref-type="bibr" rid="B2">2</xref>] combined dynamic state merging and pruning in a KLEE prototype, outperforming the baseline on several Coreutils programs. However, merging can complicate constraint tracking and does not address test selection or redundancy reduction.</p>
      </sec>
    </sec>
    <sec id="sec3">
      <title>3. Motivating Example</title>
      <p>Let consider the following <xref ref-type="fig" rid="fig1">Figure 1</xref>, which represents the C code of a program and its Control Flow Graph. It contains 101 independent conditions, each controlling the increment of a counter if a specific value is met. The critical state (ERROR) is reached only if all 100 conditions are met simultaneously. Each <italic>if</italic>(<italic>inp</italic>[<italic>i</italic>] == <italic>i</italic> + 1) condition generates two possible branches: either the condition is true or it is false. Given that there are 101 independent conditions, the total number of execution paths is: <italic><bold>Number</bold></italic><italic><bold>of</bold></italic><italic><bold>paths</bold></italic> = 2<sup>101</sup> ≈ 2.53 × 10<sup>30</sup>. The critical state (<italic>ERROR</italic>) is reached only if all conditions are met—in other words, only 1 path out of 2<sup>101</sup> leads to the error. This makes the probability of reaching this path by chance almost zero and reinforces the importance of optimization or path selection methods. This image clearly highlights the problem of path explosion encountered during software testing.</p>
      <fig id="fig1">
        <label>Figure 1</label>
        <graphic xlink:href="https://html.scirp.org/file/9303441-rId15.jpeg?20260316022047" />
      </fig>
      <p><bold>Figure 1.</bold> Motivating example of path explosion problem.</p>
    </sec>
    <sec id="sec4">
      <title>4. Problem Formulation</title>
      <p>The path explosion problem in testing leads to a combinatorial explosion of execution paths, making exhaustive analysis intractable. The goal of SymPcNSGA-Testing is to mitigate this explosion while ensuring representative and diverse test coverage. To this end, we formulate the selection of execution paths as a multi-objective optimization problem addressed using NSGA-II.</p>
      <sec id="sec4dot1">
        <title>4.1. Aim</title>
        <p>Given a set of execution paths <inline-formula><mml:math><mml:mrow><mml:mi> P </mml:mi><mml:mo> = </mml:mo><mml:mrow><mml:mo> { </mml:mo><mml:mrow><mml:msub><mml:mi> p </mml:mi><mml:mn> 1 </mml:mn></mml:msub><mml:mo> , </mml:mo><mml:msub><mml:mi> p </mml:mi><mml:mn> 2 </mml:mn></mml:msub><mml:mo> , </mml:mo><mml:mo> ⋯ </mml:mo><mml:mo> , </mml:mo><mml:msub><mml:mi> p </mml:mi><mml:mi> n </mml:mi></mml:msub></mml:mrow><mml:mo> } </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> partitioned into <inline-formula><mml:math><mml:mi> K </mml:mi></mml:math></inline-formula> clusters <inline-formula><mml:math><mml:mrow><mml:mi> C </mml:mi><mml:mo> = </mml:mo><mml:mrow><mml:mo> { </mml:mo><mml:mrow><mml:msub><mml:mi> C </mml:mi><mml:mn> 1 </mml:mn></mml:msub><mml:mo> , </mml:mo><mml:msub><mml:mi> C </mml:mi><mml:mn> 2 </mml:mn></mml:msub><mml:mo> , </mml:mo><mml:mo> ⋯ </mml:mo><mml:mo> , </mml:mo><mml:msub><mml:mi> C </mml:mi><mml:mi> K </mml:mi></mml:msub></mml:mrow><mml:mo> } </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> obtained using a clustering algorithm, we aim to construct a subset <inline-formula><mml:math><mml:mrow><mml:mi> I </mml:mi><mml:mo> ⊆ </mml:mo><mml:mi> P </mml:mi></mml:mrow></mml:math></inline-formula> (an individual) such that: </p>
        <p>At least one path is selected from each cluster: <inline-formula><mml:math><mml:mrow><mml:mo> ∀ </mml:mo><mml:msub><mml:mi> C </mml:mi><mml:mi> k </mml:mi></mml:msub><mml:mo> ∈ </mml:mo><mml:mi> C </mml:mi></mml:mrow></mml:math></inline-formula> , <inline-formula><mml:math><mml:mrow><mml:mo> ∃ </mml:mo><mml:mi> p </mml:mi><mml:mo> ∈ </mml:mo><mml:mi> I </mml:mi><mml:mo> ∩ </mml:mo><mml:msub><mml:mi> C </mml:mi><mml:mi> k </mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> . The selected subset <inline-formula><mml:math><mml:mi> I </mml:mi></mml:math></inline-formula> maximizes branch coverage across all paths it contains. The number of selected paths is minimized to reduce redundancy. </p>
      </sec>
      <sec id="sec4dot2">
        <title>4.2. Decision Variables</title>
        <p>Each individual <inline-formula><mml:math><mml:mrow><mml:mi> I </mml:mi><mml:mo> = </mml:mo><mml:mrow><mml:mo> { </mml:mo><mml:mrow><mml:msub><mml:mi> p </mml:mi><mml:mrow><mml:msub><mml:mi> i </mml:mi><mml:mn> 1 </mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo> , </mml:mo><mml:msub><mml:mi> p </mml:mi><mml:mrow><mml:msub><mml:mi> i </mml:mi><mml:mn> 2 </mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo> , </mml:mo><mml:mo> ⋯ </mml:mo><mml:mo> , </mml:mo><mml:msub><mml:mi> p </mml:mi><mml:mrow><mml:msub><mml:mi> i </mml:mi><mml:mi> m </mml:mi></mml:msub></mml:mrow></mml:msub></mml:mrow><mml:mo> } </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> is a combination of execution paths selected from the original path set <inline-formula><mml:math><mml:mi> P </mml:mi></mml:math></inline-formula> . The size <inline-formula><mml:math><mml:mi> m </mml:mi></mml:math></inline-formula> of each individual is variable but must satisfy the coverage constraint for all clusters.</p>
      </sec>
      <sec id="sec4dot3">
        <title>4.3. Objectives Functions</title>
        <p>We define the problem as a bi-objective minimization problem:</p>
        <p><bold>Objective</bold><bold>1</bold><bold>(</bold><bold>Maximize</bold><bold>Coverage):</bold></p>
        <disp-formula id="FD1">
          <label>(1)</label>
          <mml:math>
            <mml:mrow>
              <mml:msub>
                <mml:mi>f</mml:mi>
                <mml:mn>1</mml:mn>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mi>I</mml:mi>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mo>=</mml:mo>
              <mml:munder>
                <mml:mrow>
                  <mml:mtext>max</mml:mtext>
                </mml:mrow>
                <mml:mrow>
                  <mml:mi>p</mml:mi>
                  <mml:mo>∈</mml:mo>
                  <mml:mi>I</mml:mi>
                </mml:mrow>
              </mml:munder>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:mfrac>
                    <mml:mrow>
                      <mml:mtext>Number of covered branches in</mml:mtext>
                      <mml:mtext>
                         
                      </mml:mtext>
                      <mml:mi>p</mml:mi>
                    </mml:mrow>
                    <mml:mrow>
                      <mml:mtext>Total number of branches</mml:mtext>
                    </mml:mrow>
                  </mml:mfrac>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p><bold>Objective</bold><bold>2</bold><bold>(</bold><bold>Minimize</bold><bold>Path</bold><bold>Set</bold><bold>Size):</bold></p>
        <disp-formula id="FD2">
          <label>(2)</label>
          <mml:math>
            <mml:mrow>
              <mml:msub>
                <mml:mi>f</mml:mi>
                <mml:mn>2</mml:mn>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mi>I</mml:mi>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mo>=</mml:mo>
              <mml:mrow>
                <mml:mo>|</mml:mo>
                <mml:mi>I</mml:mi>
                <mml:mo>|</mml:mo>
              </mml:mrow>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>Objective 1 aims to maximize branch coverage. Although NSGA-II is traditionally formulated for minimization problems, the algorithm is used here in a configuration that directly supports maximization objectives. Consequently, individuals exhibiting higher coverage values are systematically favored during the selection process.</p>
      </sec>
      <sec id="sec4dot4">
        <title>4.4. Constraints</title>
        <p>To ensure representativity across all clusters, we introduce the constraint: </p>
        <disp-formula id="FD3">
          <label>(3)</label>
          <mml:math>
            <mml:mrow>
              <mml:mo>∀</mml:mo>
              <mml:msub>
                <mml:mi>C</mml:mi>
                <mml:mi>k</mml:mi>
              </mml:msub>
              <mml:mo>∈</mml:mo>
              <mml:mi>C</mml:mi>
              <mml:mo>,</mml:mo>
              <mml:mtext>
                 
              </mml:mtext>
              <mml:mtext>
                 
              </mml:mtext>
              <mml:mo>∃</mml:mo>
              <mml:mi>p</mml:mi>
              <mml:mo>∈</mml:mo>
              <mml:mi>I</mml:mi>
              <mml:mo>∩</mml:mo>
              <mml:msub>
                <mml:mi>C</mml:mi>
                <mml:mi>k</mml:mi>
              </mml:msub>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>This guarantees that each individual includes at least one path from every cluster, promoting diversity and representativity.</p>
      </sec>
      <sec id="sec4dot5">
        <title>4.5. Optimization Strategy</title>
        <p>The NSGA-II algorithm is applied to evolve a population of such individuals, balancing the trade-off between maximizing branch coverage and minimizing the number of selected paths. The non-dominated sorting and crowding distance mechanisms of NSGA-II ensure the preservation of diversity and the convergence toward a Pareto-optimal front of path subsets.</p>
      </sec>
    </sec>
    <sec id="sec5">
      <title>5. Methodology</title>
      <p>In this section, we describe the proposed SymPcNSGA-Testing methodology, which aims to mitigate the path explosion problem while maximizing branch coverage during test phase. This combined methodology brings together symbolic execution, clustering of execution paths, and optimization using genetic algorithms in a structured and complementary sequence of steps. The entire process comprises three main phases, which can be seen in <xref ref-type="fig" rid="fig2">Figure 2</xref>.</p>
      <sec id="sec5dot1">
        <title>5.1. Symbolic Execution with KLEE</title>
        <p>The first step of the SymPcNSGA-Testing methodology is based on the use of symbolic execution using the KLEE 3.2 tool. KLEE 3.2 is an open-source symbolic execution engine that automatically generates test cases by exploring all possible execution paths of a program, based on symbolic inputs. During this phase, the program’s inputs are rendered symbolic so that KLEE can follow all conditional branches encountered. At each conditional branch, KLEE generates a new path based on the accumulated constraints.</p>
        <fig id="fig2">
          <label>Figure 2</label>
          <graphic xlink:href="https://html.scirp.org/file/9303441-rId42.jpeg?20260316022050" />
        </fig>
        <p><bold>Figure 2.</bold> SymPcNSGA-testing architecture.</p>
        <p>For each path explored, KLEE generates a .ktest file, which contains the concrete values of the inputs used to follow that specific path. It also generates a .path file representing the decision sequence taken through branches. These two types of generated files will be essential in the next steps of our methodology. The process can be described by the following algorithm (<bold>Algorithm 1</bold>).</p>
      </sec>
      <sec id="sec5dot2">
        <title>5.2. Path Clustering with Ktest-Cluster</title>
        <p>The second step of our methodology aims to group execution paths into sets to reduce redundancy, facilitate selection, and limit the impact of combinatorial explosion. To this end, we propose KTest-Cluster (K, the number of cluster, that we will produce), an innovative clustering algorithm based not on symbolic paths or executed branches, but directly on the .ktest files produced by KLEE.</p>
        <p><bold>Algorithm 1.</bold> Symbolic execution with KLEE.</p>
        <fig id="fig3">
          <label>Figure 3</label>
          <graphic xlink:href="https://html.scirp.org/file/9303441-rId43.jpeg?20260316022050" />
        </fig>
        <p>Unlike traditional approaches that analyze paths from concrete values generated, KTest-Cluster leverages input values contained in .ktest files, which represent the test cases associated with each execution.</p>
        <p><bold>Step</bold><bold>1:</bold><bold>Data</bold><bold>Preparation</bold></p>
        <p>Each .ktest file contains the concrete inputs associated with a given path. These files are first processed to extract the input data in a structured manner using KLEE’s ktest-tool. Each .ktest file is then transformed into a numerical vector, where each component represents an input variable.</p>
        <p><bold>Step</bold><bold>2:</bold><bold>Vector</bold><bold>Normalization</bold></p>
        <p>Before clustering, the vectors are normalized. The vectors are padded with zeros at the end so that they all have the same maximum length. This is to prevent certain large dimensions from overwhelming others in the distance calculation.</p>
        <p><bold>Step</bold><bold>3:</bold><bold>Applying</bold><bold>K-means</bold><bold>with</bold><bold>Euclidean</bold><bold>Distance</bold></p>
        <p>The normalized vectors are then clustered using the K-means algorithm, using Euclidean distance as the similarity measure. In this work, K-means clustering with Euclidean distance was selected due to the numerical and fixed-length representation of execution paths, where each path is encoded as a vector of branch coverage features and execution characteristics. Euclidean distance provides an intuitive measure of similarity in this vector space by capturing the overall geometric proximity between paths in terms of covered branches and execution. K-means was chosen for its computational efficiency and scalability, which is particularly important given the large number of paths generated by symbolic execution.</p>
        <p>Alternative distance metrics (e.g., cosine or Jaccard distance) and clustering algorithms (e.g., hierarchical or density-based clustering) could also be considered. However, these approaches either introduce higher computational costs or require additional parameters that are difficult to tune in large-scale symbolic execution settings. In this study, the choice of K (the number of clusters) is based on the Rule of thumb [<xref ref-type="bibr" rid="B14">14</xref>] technique in which <inline-formula><mml:math><mml:mrow><mml:mi> k </mml:mi><mml:mo> = </mml:mo><mml:msqrt><mml:mrow><mml:mfrac><mml:mi> N </mml:mi><mml:mn> 2 </mml:mn></mml:mfrac></mml:mrow></mml:msqrt></mml:mrow></mml:math></inline-formula> where <inline-formula><mml:math><mml:mi> N </mml:mi></mml:math></inline-formula> is the number of data points. In our case, <inline-formula><mml:math><mml:mi> N </mml:mi></mml:math></inline-formula> is the number of total path executions produced by Symbolic Execution. The result of this process is a partitioning of the paths into coherent groups of similar input behaviors. A systematic comparison of clustering techniques is left as future work (<bold>Algorithm 2</bold>). </p>
        <p><bold>Algorithm 2.</bold> Ktest-Cluster algorithm.</p>
        <fig id="fig4">
          <label>Figure 4</label>
          <graphic xlink:href="https://html.scirp.org/file/9303441-rId50.jpeg?20260316022050" />
        </fig>
      </sec>
      <sec id="sec5dot3">
        <title>5.3. Optimization with Non-Dominated Sorting Genetic Algorithm-II (NSGA-II)</title>
        <p>The final phase of the <italic>SymPcNSGA-Testing</italic> methodology focuses on reducing path explosion through a multi-objective optimization using NSGA-II (Non-dominated Sorting Genetic Algorithm-II). This step seeks to balance two conflicting goals: 1) maximize branch coverage and 2) minimize the number of selected execution paths. Each individual in the population represents a subset of symbolic paths and is evaluated by a fitness pair <inline-formula><mml:math><mml:mrow><mml:mrow><mml:mo> ( </mml:mo><mml:mrow><mml:msub><mml:mi> f </mml:mi><mml:mn> 1 </mml:mn></mml:msub><mml:mrow><mml:mo> ( </mml:mo><mml:mi> I </mml:mi><mml:mo> ) </mml:mo></mml:mrow><mml:mo> , </mml:mo><mml:msub><mml:mi> f </mml:mi><mml:mn> 2 </mml:mn></mml:msub><mml:mrow><mml:mo> ( </mml:mo><mml:mi> I </mml:mi><mml:mo> ) </mml:mo></mml:mrow></mml:mrow><mml:mo> ) </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> where:</p>
        <p><inline-formula><mml:math><mml:mrow><mml:msub><mml:mi> f </mml:mi><mml:mn> 1 </mml:mn></mml:msub><mml:mrow><mml:mo> ( </mml:mo><mml:mi> I </mml:mi><mml:mo> ) </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> denotes the <italic>branch</italic><italic>coverage</italic><italic>ratio</italic>; <inline-formula><mml:math><mml:mrow><mml:msub><mml:mi> f </mml:mi><mml:mn> 2 </mml:mn></mml:msub><mml:mrow><mml:mo> ( </mml:mo><mml:mi> I </mml:mi><mml:mo> ) </mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula> denotes the <italic>number</italic><italic>of</italic><italic>paths</italic> in the subset. </p>
        <p>Branch coverage was computed using KLEE’s branch coverage instrumentation, where each conditional branch is represented as a binary value indicating whether it was exercised by at least one execution path, and coverage is reported at the source-level branch granularity as the percentage of covered branches over the total number of branches.</p>
        <p>NSGA-II applies non-dominated sorting to classify individuals into Pareto fronts. An individual <inline-formula><mml:math><mml:mrow><mml:msub><mml:mi> I </mml:mi><mml:mn> 1 </mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> is said to dominate another <inline-formula><mml:math><mml:mrow><mml:msub><mml:mi> I </mml:mi><mml:mn> 2 </mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> (denoted <inline-formula><mml:math><mml:mrow><mml:msub><mml:mi> I </mml:mi><mml:mn> 1 </mml:mn></mml:msub><mml:mo> ≺ </mml:mo><mml:msub><mml:mi> I </mml:mi><mml:mn> 2 </mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> ) if:</p>
        <disp-formula id="FD4">
          <mml:math>
            <mml:mrow>
              <mml:msub>
                <mml:mi>f</mml:mi>
                <mml:mn>1</mml:mn>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:msub>
                    <mml:mi>I</mml:mi>
                    <mml:mn>1</mml:mn>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mo>≥</mml:mo>
              <mml:msub>
                <mml:mi>f</mml:mi>
                <mml:mn>1</mml:mn>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:msub>
                    <mml:mi>I</mml:mi>
                    <mml:mn>2</mml:mn>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mtext>
                 
              </mml:mtext>
              <mml:mtext>
                 
              </mml:mtext>
              <mml:mtext>and</mml:mtext>
              <mml:mtext>
                 
              </mml:mtext>
              <mml:mtext>
                 
              </mml:mtext>
              <mml:msub>
                <mml:mi>f</mml:mi>
                <mml:mn>2</mml:mn>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:msub>
                    <mml:mi>I</mml:mi>
                    <mml:mn>1</mml:mn>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mo>≤</mml:mo>
              <mml:msub>
                <mml:mi>f</mml:mi>
                <mml:mn>2</mml:mn>
              </mml:msub>
              <mml:mrow>
                <mml:mo>(</mml:mo>
                <mml:mrow>
                  <mml:msub>
                    <mml:mi>I</mml:mi>
                    <mml:mn>2</mml:mn>
                  </mml:msub>
                </mml:mrow>
                <mml:mo>)</mml:mo>
              </mml:mrow>
              <mml:mo>,</mml:mo>
            </mml:mrow>
          </mml:math>
        </disp-formula>
        <p>with at least one strict inequality. This mechanism identifies optimal trade-offs between coverage and cost.</p>
        <p>Evolutionary operators such as <italic>crossover</italic> and <italic>mutation</italic> are applied to ensure that each individual maintains at least one path per cluster, thus preserving structural diversity.</p>
        <p>The algorithm iterates over a fixed number of generations, gradually improving the population. At the end of the process, the first Pareto front offers a set of non-dominated solutions representing various trade-offs. These allow testers to select configurations with high coverage, minimal redundancy, or a balanced compromise, depending on testing goals and resources (<bold>Algorithm 3</bold>). </p>
        <p><bold>Algorithm 3.</bold> SymPcNSGA-II optimization.</p>
        <fig id="fig5">
          <label>Figure 5</label>
          <graphic xlink:href="https://html.scirp.org/file/9303441-rId65.jpeg?20260316022050" />
        </fig>
      </sec>
    </sec>
    <sec id="sec6">
      <title>6. Experimental Setup</title>
      <p>To evaluate the effectiveness of our proposed methodology, <bold>SymPcNSGA-Testing</bold>, we conducted a series of experiments on 10 real-world programs from the GNU Coreutils 9.5 suite. This section presents the experimental environment, datasets used, and parameter settings.</p>
      <sec id="sec6dot1">
        <title>6.1. Environment Configuration</title>
        <p>All experiments were conducted on a machine running Linux Mint 21 with the following hardware specifications:</p>
        <p><bold>CPU:</bold> Intel® Core™ i5-11th generation @ 2.90 GHz (8 cores).<bold>RAM:</bold> 16 GB.<bold>Storage:</bold> HDD 1 TB.<bold>KLEE</bold><bold>Version:</bold> 3.2 with LLVM 14.0.0, Clang 14.0.0, GCC 11.4.0.<bold>Python</bold><bold>Version:</bold> 3.10.<bold>Scikit-learn</bold><bold>Version:</bold> 1.2.0.<bold>Clustering:</bold> Implemented via Scikit-learn (K-means).<bold>Genetic</bold><bold>Algorithm:</bold> Implemented in Python.</p>
      </sec>
      <sec id="sec6dot2">
        <title>6.2. Programs under Test</title>
        <p>To evaluate the <bold>SymPcNSGA-Testing</bold> methodology, we selected 10 diverse programs from GNU Coreutils 9.5: basename, cut, csplit, dirname, echo, expr, printf, sort, tr, uniq. These programs present a variety of input/output behaviors and logical complexities.</p>
        <p>Each program was executed <bold>20</bold><bold>times</bold>, with a single execution taking approximately <bold>2</bold><bold>hours</bold>, totaling: </p>
        <p>20 runs × 10 programs × 2 hours = 400 <bold>hours</bold><bold>of</bold><bold>experimentation</bold></p>
      </sec>
      <sec id="sec6dot3">
        <title>6.3. Methodology Parameters</title>
        <p>This subsection presents the parameters used at each stage of the SymPcNSGA-Testing methodology. Each parameter is crucial for optimizing the performance of the genetic algorithm, clustering, and symbolic execution. </p>
        <p>6.3.1. Symbolic Execution Parameters</p>
        <p>The following <bold>Table 1</bold> presents the different parameters that we have used for Symbolic Execution. </p>
        <p><bold>Table 1</bold><bold>.</bold> Symbolic execution parameters.</p>
        <table-wrap id="tbl1">
          <label>Table 1</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Parameter</bold>
                </td>
                <td>
                  <bold>Description</bold>
                </td>
              </tr>
              <tr>
                <td>––libc=uclibc</td>
                <td>Uses the minimal uClibc library for standard C functions</td>
              </tr>
              <tr>
                <td>––posix-runtime</td>
                <td>Enables POSIX-like environment simulation for command-line arguments, stdin, and file I/O</td>
              </tr>
              <tr>
                <td>––sym-arg N</td>
                <td>Declares one symbolic argument of up to N characters</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>6.3.2. Clustering Parameter</p>
        <p>The following <bold>Table 2</bold> presents the description of the parameter <italic><bold>k</bold></italic> that is essential for clustering step. </p>
        <p><bold>Table 2</bold><bold>.</bold> Clustering parameter.</p>
        <table-wrap id="tbl2">
          <label>Table 2</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Parameter</bold>
                </td>
                <td>
                  <bold>Description</bold>
                </td>
                <td>
                  <bold>Value</bold>
                  <bold>Used</bold>
                </td>
              </tr>
              <tr>
                <td>
                  Number of clusters
                  <inline-formula>
                    <mml:math>
                      <mml:mi>k</mml:mi>
                    </mml:math>
                  </inline-formula>
                </td>
                <td>Specifies the number of groups formed from symbolic execution paths</td>
                <td>
                  <inline-formula>
                    <mml:math>
                      <mml:mrow>
                        <mml:mi>k</mml:mi>
                        <mml:mo>=</mml:mo>
                        <mml:msqrt>
                          <mml:mrow>
                            <mml:mfrac>
                              <mml:mi>N</mml:mi>
                              <mml:mn>2</mml:mn>
                            </mml:mfrac>
                          </mml:mrow>
                        </mml:msqrt>
                      </mml:mrow>
                    </mml:math>
                  </inline-formula>
                  , where
                  <inline-formula>
                    <mml:math>
                      <mml:mi>N</mml:mi>
                    </mml:math>
                  </inline-formula>
                  is the number of paths
                </td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>6.3.3. NSGA-II Parameters</p>
        <p>The following <bold>Table 3</bold> presents the different parameters that we have used for running NSGA-II algorithm.</p>
        <p><bold>Table 3</bold><bold>.</bold> NSGA-II parameters.</p>
        <table-wrap id="tbl3">
          <label>Table 3</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Parameter</bold>
                </td>
                <td>
                  <bold>Description</bold>
                </td>
                <td>
                  <bold>Value</bold>
                </td>
              </tr>
              <tr>
                <td>Population size</td>
                <td>Number of individuals per generation</td>
                <td>50</td>
              </tr>
              <tr>
                <td>Number of generations</td>
                <td>Number of evolutionary iterations</td>
                <td>100</td>
              </tr>
              <tr>
                <td>Selection method</td>
                <td>Based on Pareto ranking and diversity</td>
                <td>Binary Tournament</td>
              </tr>
              <tr>
                <td>Crossover type</td>
                <td>Recombination of individuals</td>
                <td>One-Point Crossover</td>
              </tr>
              <tr>
                <td>Crossover rate</td>
                <td>Probability of crossover per pair</td>
                <td>100%</td>
              </tr>
              <tr>
                <td>Mutation type</td>
                <td>Replacement of a path with another from the same cluster</td>
                <td>Intra-cluster replacement</td>
              </tr>
              <tr>
                <td>Mutation rate</td>
                <td>Probability of mutation per individual</td>
                <td>10%</td>
              </tr>
              <tr>
                <td>Termination criteria</td>
                <td>Stopping condition</td>
                <td>100 Generations</td>
              </tr>
              <tr>
                <td>Individual size</td>
                <td>Variable size; each individual includes at least one path per cluster</td>
                <td>
                  <inline-formula>
                    <mml:math>
                      <mml:mrow>
                        <mml:mo>≥</mml:mo>
                        <mml:mi>k</mml:mi>
                      </mml:mrow>
                    </mml:math>
                  </inline-formula>
                </td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>The NSGA-II algorithm was configured with a population size of 50 individuals and executed for 100 generations. Each individual represents a variable-length combination of execution paths, with the constraint that it must be greater than and at least one path is selected from each cluster to ensure representativeness.</p>
        <p>One-point crossover operator was used with a probability of Pc = 100%, enabling the recombination of path subsets between individuals. Mutation was applied with probability Pm = 10%, where mutation consists of randomly adding, removing, or replacing a path within a cluster. These operators were selected to preserve cluster coverage while maintaining population diversity.</p>
        <p>Parameter values were chosen empirically based on preliminary experiments and commonly adopted settings in SBST literature, providing a trade-off between convergence speed and solution diversity. </p>
      </sec>
      <sec id="sec6dot4">
        <title>6.4. Comparative Tools</title>
        <p>The following <bold>Table 4</bold> lists the different KLEE configurations used for comparison with our proposed methodology. Each configuration aims to tackle the path explosion problem using various strategies.</p>
        <p><bold>Table 4</bold><bold>.</bold> Comparative KLEE techniques.</p>
        <table-wrap id="tbl4">
          <label>Table 4</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>No</bold>
                  <bold>.</bold>
                </td>
                <td>
                  <bold>Technique</bold>
                </td>
                <td>
                  <bold>Purpose</bold>
                </td>
                <td>
                  <bold>KLEE</bold>
                  <bold>Parameters</bold>
                </td>
              </tr>
              <tr>
                <td>0</td>
                <td>KLEE-BASE</td>
                <td>Standard configuration with symbolic execution using POSIX system calls</td>
                <td>––posix-runtime––libc=uclibc</td>
              </tr>
              <tr>
                <td>1</td>
                <td>Covering-New</td>
                <td>Reduces redundant outputs by generating tests only for new code coverage</td>
                <td>––only-output-states-covering-new</td>
              </tr>
              <tr>
                <td>2</td>
                <td>NURS-Depth</td>
                <td>Explores longer execution paths first to reach deep branches</td>
                <td>––search=nurs:depth</td>
              </tr>
              <tr>
                <td>3</td>
                <td>BFS + Merge</td>
                <td>Combines breadth-first search with state merging and new coverage focus</td>
                <td>––search=bfs – use-merge––only-output-states-covering-new</td>
              </tr>
              <tr>
                <td>4</td>
                <td>Random-Path</td>
                <td>Introduces randomness in path selection for diversity</td>
                <td>––search=random-path</td>
              </tr>
              <tr>
                <td>5</td>
                <td>DFS</td>
                <td>Depth-first search explores long paths first, may ignore breadth</td>
                <td>––search=dfs</td>
              </tr>
              <tr>
                <td>6</td>
                <td>State-Merge</td>
                <td>Merges execution states to limit the number of paths explored</td>
                <td>––use-merge</td>
              </tr>
              <tr>
                <td>7</td>
                <td>Covering-New + Merge</td>
                <td>Enhances coverage while merging redundant states</td>
                <td>––only-output-states-covering-new––use-merge</td>
              </tr>
              <tr>
                <td>8</td>
                <td>MD2U</td>
                <td>Prioritizes paths closer to uncovered instructions to guide search</td>
                <td>––search=nurs:md2u––only-output-states-covering-new</td>
              </tr>
              <tr>
                <td>9</td>
                <td>NURS CovNew + DFS</td>
                <td>Combines depth-first andcoverage-guided heuristics</td>
                <td>––search=nurs:covnew––search=dfs</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
      </sec>
    </sec>
    <sec id="sec7">
      <title>7. Results and Discussion</title>
      <sec id="sec7dot1">
        <title>7.1. Answer to RQ1</title>
        <p>The first research question (RQ1) aims to analyze the contribution of our SymPcNSGA-Testing methodology compared to different KLEE techniques in the context of generating execution paths. More specifically, we seek to evaluate whether SymPcNSGA-Testing better manages the combinatorial explosion of paths in the tested program. </p>
        <p>The analysis of our experimental results, illustrated in <bold>Table 5</bold>, shows that <bold>SymPcNSGA-Testing</bold> systematically generates fewer paths than <bold>KLEE-BASE</bold> and its different advanced techniques. This reduction in the number of paths demonstrates the ability of our approach to control path explosion, a major challenge in symbolic execution.</p>
        <p><bold>Table 5</bold><bold>.</bold> Number of paths generated by each KLEE input and by SymPcNSGA-Testing.</p>
        <table-wrap id="tbl5">
          <label>Table 5</label>
          <table>
            <tbody>
              <tr>
                <td rowspan="2">
                  <bold>Programs</bold>
                </td>
                <td colspan="10">
                  <bold>KLEE</bold>
                  <bold>Input</bold>
                </td>
                <td>
                  <bold>Our</bold>
                  <bold>Approach</bold>
                </td>
              </tr>
              <tr>
                <td>
                  <bold>KLEE-BASE</bold>
                </td>
                <td>
                  <bold>A</bold>
                </td>
                <td>
                  <bold>B</bold>
                </td>
                <td>
                  <bold>C</bold>
                </td>
                <td>
                  <bold>D</bold>
                </td>
                <td>
                  <bold>E</bold>
                </td>
                <td>
                  <bold>F</bold>
                </td>
                <td>
                  <bold>G</bold>
                </td>
                <td>
                  <bold>H</bold>
                </td>
                <td>
                  <bold>I</bold>
                </td>
                <td>
                  <bold>SymPcNSGA-Testing</bold>
                </td>
              </tr>
              <tr>
                <td>basename</td>
                <td>110</td>
                <td>27</td>
                <td>34</td>
                <td>23</td>
                <td>27</td>
                <td>29</td>
                <td>30</td>
                <td>30</td>
                <td>30</td>
                <td>33</td>
                <td>
                  <bold>39</bold>
                </td>
              </tr>
              <tr>
                <td>csplit</td>
                <td>5306</td>
                <td>45</td>
                <td>48</td>
                <td>39</td>
                <td>44</td>
                <td>46</td>
                <td>47</td>
                <td>48</td>
                <td>47</td>
                <td>51</td>
                <td>
                  <bold>64</bold>
                </td>
              </tr>
              <tr>
                <td>cut</td>
                <td>1244</td>
                <td>56</td>
                <td>69</td>
                <td>51</td>
                <td>57</td>
                <td>55</td>
                <td>59</td>
                <td>57</td>
                <td>68</td>
                <td>68</td>
                <td>
                  <bold>62</bold>
                </td>
              </tr>
              <tr>
                <td>dirname</td>
                <td>2314</td>
                <td>22</td>
                <td>34</td>
                <td>22</td>
                <td>22</td>
                <td>21</td>
                <td>23</td>
                <td>23</td>
                <td>24</td>
                <td>34</td>
                <td>66</td>
              </tr>
              <tr>
                <td>echo</td>
                <td>3363</td>
                <td>7</td>
                <td>13</td>
                <td>9</td>
                <td>10</td>
                <td>10</td>
                <td>11</td>
                <td>11</td>
                <td>11</td>
                <td>31</td>
                <td>
                  <bold>68</bold>
                </td>
              </tr>
              <tr>
                <td>expr</td>
                <td>1375</td>
                <td>25</td>
                <td>37</td>
                <td>23</td>
                <td>25</td>
                <td>25</td>
                <td>25</td>
                <td>25</td>
                <td>27</td>
                <td>35</td>
                <td>
                  <bold>69</bold>
                </td>
              </tr>
              <tr>
                <td>printf</td>
                <td>10593</td>
                <td>133</td>
                <td>129</td>
                <td>96</td>
                <td>115</td>
                <td>109</td>
                <td>129</td>
                <td>129</td>
                <td>120</td>
                <td>133</td>
                <td>
                  <bold>22</bold>
                </td>
              </tr>
              <tr>
                <td>sort</td>
                <td>6186</td>
                <td>75</td>
                <td>77</td>
                <td>61</td>
                <td>64</td>
                <td>59</td>
                <td>86</td>
                <td>85</td>
                <td>92</td>
                <td>87</td>
                <td>
                  <bold>62</bold>
                </td>
              </tr>
              <tr>
                <td>tr</td>
                <td>5286</td>
                <td>36</td>
                <td>42</td>
                <td>31</td>
                <td>36</td>
                <td>40</td>
                <td>39</td>
                <td>39</td>
                <td>42</td>
                <td>44</td>
                <td>
                  <bold>50</bold>
                </td>
              </tr>
              <tr>
                <td>uniq</td>
                <td>3530</td>
                <td>5</td>
                <td>7</td>
                <td>5</td>
                <td>10</td>
                <td>5</td>
                <td>5</td>
                <td>5</td>
                <td>5</td>
                <td>6</td>
                <td>
                  <bold>68</bold>
                </td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>A: Covering-New; B: Covering-New + NURS-Depth; C: Covering-New + BFS + Merge; D: Covering-New + Random; E: Covering-New + DFS; F: Covering-New + Merge; G: Covering-New + NURS-CovNew + Merge; H: Covering-New + NURS-MD2U; I: Covering-New + NURS-CovNew + DFS.</p>
        <p>Among the ten tested programs, <bold>SymPcNSGA-Testing</bold> produces fewer paths than KLEE-BASE in all cases:</p>
        <p>basename: 39 paths vs 110 (KLEE-BASE).csplit: 64 paths vs 5306 (KLEE-BASE).cut: 62 paths vs 1244 (KLEE-BASE).dirname: 66 paths vs 2314 (KLEE-BASE).echo: 68 paths vs 3363 (KLEE-BASE). expr: 69 paths vs 1375 (KLEE-BASE). printf: 22 paths vs 10593 (KLEE-BASE). sort: 60 paths vs 6186 (KLEE-BASE). tr: 50 paths vs 5286 (KLEE-BASE). uniq: 68 paths vs 3580 (KLEE-BASE). </p>
        <p>Comparison with Advanced KLEE Strategies</p>
        <p>In most cases, <bold>SymPcNSGA-Testing</bold> generates fewer paths than advanced KLEE techniques using specific strategies such as NURS, BFS, DFS, random-path, and use-merge.</p>
        <p>For example: </p>
        <p>On expr, SymPcNSGA-Testing generates 69 paths while Covering-New + NURS-Depth produces 37 and Covering-New + DFS generates 35. SymPcNSGA-Testing is more efficient in reducing the number of paths. On sort, SymPcNSGA-Testing generates 60 paths, fewer than most techniques except Covering-New + DFS (59 paths). On all the programs, Sampans-Testing outperforms KLEE-BASE. </p>
        <p>Case Study: basename—Drastic Reduction of Path Explosion</p>
        <p><bold>KLEE-BASE</bold><bold>:</bold> 110 paths.<bold>Best</bold><bold>advanced</bold><bold>KLEE</bold><bold>technique</bold><bold>:</bold> Covering-New + BFS + Merge = 23 paths.<bold>SymPcNSGA-Testing</bold>: 39 paths.</p>
        <p><bold>Interpretation:</bold> basename processes text inputs and includes multiple branches based on arguments, leading to significant path growth. SymPcNSGA-Testing eliminates redundant paths while maintaining sufficient coverage. This illustrates the effectiveness of clustering and genetic algorithms.</p>
        <p>Case Study: cut—Drastic Reduction of Path Explosion</p>
        <p><bold>KLEE-BASE</bold><bold>:</bold> 1244 paths.<bold>Advanced</bold><bold>KLEE</bold><bold>strategies</bold><bold>:</bold> All above 60 paths.<bold>SymPcNSGA-Testing</bold><bold>:</bold> 62 paths.</p>
        <p><bold>Interpretation:</bold> cut manipulates structured inputs and contains many conditions. SymPcNSGA-Testing reduces the number of execution paths by over 95%, while maintaining branch representativity.</p>
        <p>Case Study: printf—Exceptional Path Reduction</p>
        <p><bold>KLEE-BASE</bold><bold>:</bold> 10,593 paths.<bold>Advanced</bold><bold>KLEE</bold><bold>options</bold><bold>:</bold> All greater than 100 paths.<bold>SymPcNSGA-Testing</bold><bold>:</bold> 22 paths.</p>
        <p><bold>Interpretation:</bold> printf includes multiple formats and features, leading to exponential path explosion. Our approach reduces the number of paths by more than 99% while retaining the essential test cases. This confirms its suitability for highly combinatorial programs.</p>
        <p>These results confirm that <bold>SymPcNSGA-Testing</bold> is a robust and effective approach for mitigating the path explosion problem in symbolic execution while maintaining sufficient test coverage.</p>
      </sec>
      <sec id="sec7dot2">
        <title>7.2. Answer to RQ2</title>
        <p>The second research question (RQ2) aims to evaluate whether reducing the number of paths tested compromises the quality of the generated tests and, consequently, the reliability of the tested software. The goal is to examine whether the SymPcNSGA-Testing methodology maintains sufficient test coverage while optimizing path exploration to limit combinatorial explosion.</p>
        <p>Among the ten tested programs, <bold>SymPcNSGA-Testing</bold> achieves branch coverage rates comparable to those obtained with <bold>KLEE-BASE</bold> and its different techniques. <bold>Table 6</bold> presents these results. For example:</p>
        <p><bold>Table 6</bold><bold>.</bold> Comparison of branch coverage (C) generated by KLEE inputs and SymPcNSGA-Testing for each program.</p>
        <table-wrap id="tbl6">
          <label>Table 6</label>
          <table>
            <tbody>
              <tr>
                <td>
                  <bold>Program</bold>
                </td>
                <td>
                  <bold>Metric</bold>
                </td>
                <td>
                  <bold>KLEE-BASE</bold>
                </td>
                <td>
                  <bold>A</bold>
                </td>
                <td>
                  <bold>B</bold>
                </td>
                <td>
                  <bold>C</bold>
                </td>
                <td>
                  <bold>D</bold>
                </td>
                <td>
                  <bold>E</bold>
                </td>
                <td>
                  <bold>F</bold>
                </td>
                <td>
                  <bold>G</bold>
                </td>
                <td>
                  <bold>H</bold>
                </td>
                <td>
                  <bold>I</bold>
                </td>
                <td>
                  <bold>SymPcNSGA-Testing</bold>
                </td>
              </tr>
              <tr>
                <td>basename</td>
                <td>C (%)</td>
                <td>73.19</td>
                <td>72.96</td>
                <td>73.19</td>
                <td>72.96</td>
                <td>72.96</td>
                <td>72.97</td>
                <td>72.96</td>
                <td>72.96</td>
                <td>72.96</td>
                <td>73.19</td>
                <td>
                  <bold>73.19</bold>
                </td>
              </tr>
              <tr>
                <td>csplit</td>
                <td>C (%)</td>
                <td>84.70</td>
                <td>81.03</td>
                <td>75.04</td>
                <td>74.12</td>
                <td>79.40</td>
                <td>78.12</td>
                <td>80.21</td>
                <td>80.28</td>
                <td>80.82</td>
                <td>79.76</td>
                <td>
                  <bold>84.28</bold>
                </td>
              </tr>
              <tr>
                <td>cut</td>
                <td>C (%)</td>
                <td>85.12</td>
                <td>79.27</td>
                <td>78.76</td>
                <td>78.52</td>
                <td>79.85</td>
                <td>78.90</td>
                <td>78.82</td>
                <td>78.86</td>
                <td>83.61</td>
                <td>78.80</td>
                <td>85.07</td>
              </tr>
              <tr>
                <td>dirname</td>
                <td>C (%)</td>
                <td>73.03</td>
                <td>81.03</td>
                <td>75.04</td>
                <td>74.12</td>
                <td>79.40</td>
                <td>78.12</td>
                <td>80.21</td>
                <td>80.28</td>
                <td>80.82</td>
                <td>79.76</td>
                <td>
                  <bold>73.00</bold>
                </td>
              </tr>
              <tr>
                <td>echo</td>
                <td>C (%)</td>
                <td>70.05</td>
                <td>71.50</td>
                <td>59.87</td>
                <td>74.91</td>
                <td>56.14</td>
                <td>59.85</td>
                <td>59.80</td>
                <td>59.80</td>
                <td>59.80</td>
                <td>67.46</td>
                <td>
                  <bold>69.40</bold>
                </td>
              </tr>
              <tr>
                <td>expr</td>
                <td>C (%)</td>
                <td>75.40</td>
                <td>75.28</td>
                <td>75.28</td>
                <td>75.28</td>
                <td>75.28</td>
                <td>74.92</td>
                <td>74.92</td>
                <td>75.24</td>
                <td>75.28</td>
                <td>75.25</td>
                <td>
                  <bold>75.28</bold>
                </td>
              </tr>
              <tr>
                <td>printf</td>
                <td>C (%)</td>
                <td>76.36</td>
                <td>74.01</td>
                <td>71.86</td>
                <td>77.13</td>
                <td>73.41</td>
                <td>77.71</td>
                <td>71.86</td>
                <td>71.87</td>
                <td>71.92</td>
                <td>71.86</td>
                <td>
                  <bold>73.00</bold>
                </td>
              </tr>
              <tr>
                <td>sort</td>
                <td>C (%)</td>
                <td>92.09</td>
                <td>79.63</td>
                <td>89.65</td>
                <td>80.48</td>
                <td>75.30</td>
                <td>76.92</td>
                <td>70.53</td>
                <td>70.59</td>
                <td>70.19</td>
                <td>75.37</td>
                <td>
                  <bold>86.03</bold>
                </td>
              </tr>
              <tr>
                <td>tr</td>
                <td>C (%)</td>
                <td>84.93</td>
                <td>76.53</td>
                <td>79.64</td>
                <td>74.18</td>
                <td>76.99</td>
                <td>80.55</td>
                <td>79.47</td>
                <td>79.42</td>
                <td>80.36</td>
                <td>79.32</td>
                <td>
                  <bold>84.44</bold>
                </td>
              </tr>
              <tr>
                <td>uniq</td>
                <td>C (%)</td>
                <td>72.56</td>
                <td>72.02</td>
                <td>72.22</td>
                <td>72.60</td>
                <td>72.43</td>
                <td>72.13</td>
                <td>72.02</td>
                <td>72.02</td>
                <td>72.16</td>
                <td>72.12</td>
                <td>
                  <bold>72.56</bold>
                </td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>A: Covering-New; B: Covering-New + NURS-Depth; C: Covering-New + BFS + Merge; D: Covering-New + Random; E: Covering-New + DFS; F: Covering-New + Merge; G: Covering-New + NURS-CovNew + Merge; H: Covering-New + NURS-MD2U; I: Covering-New + NURS-CovNew + DFS.</p>
        <p><bold>csplit</bold><bold>:</bold>84.28% for SymPcNSGA-Testing compared to 84.70% for KLEE-BASE, which achieves the best coverage. The difference is only 0.42%.<bold>cut</bold><bold>:</bold> 85.07% for SymPcNSGA-Testing compared to 85.12% for KLEE-BASE. The difference is only 0.05%.<bold>dirname</bold><bold>:</bold> 73.00% for SymPcNSGA-Testing compared to 73.03% for KLEE-BASE and 81.03% for Covering-New, which achieves the best coverage. Differences of 0.03% and 8.03% respectively.<bold>echo</bold><bold>:</bold> 69.40% for SymPcNSGA-Testing compared to 70.05% for KLEE-BASE and 71.50% for Covering-New. Differences of 0.65% and 2.1%.<bold>printf</bold><bold>:</bold> 73% for SymPcNSGA-Testing compared to 76.36% for KLEE-BASE and 77.71% for Covering-New + DFS. Differences of 3.36% and 4.71%.<bold>sort</bold><bold>:</bold>86.03% for SymPcNSGA-Testing compared to 92.09% for KLEE-BASE, which achieves the best coverage. </p>
        <p>These results show that although SymPcNSGA-Testing explores far fewer paths than KLEE, the difference in branch coverage remains minimal.</p>
        <p><bold>Specific</bold><bold>Cases</bold></p>
        <p><bold>Program</bold><italic><bold>uniq</bold></italic><bold>:</bold></p>
        <p>KLEE-BASE explores 3530 paths and achieves 72.56% coverage (best). Covering-New + BFS + Merge explores 5 paths and achieves 72.60% coverage. SymPcNSGA-Testing retains 68 paths and achieves 72.56% coverage. </p>
        <p><italic>Interpretation</italic>: </p>
        <p>98.07% reduction in the number of tested paths. Minimal drop in coverage (−0.01%). SymPcNSGA-Testing achieves the same coverage as KLEE-BASE despite drastically reducing the number of paths. This confirms the effectiveness of SymPcNSGA-Testing in generating fewer, but more representative paths. </p>
        <p><bold>Program</bold><italic><bold>basename</bold></italic><bold>:</bold></p>
        <p>KLEE-BASE explores 110 paths with 73.19% coverage. Covering-New + NURS-Depth and Covering-New + NURS-CovNew + DFS both achieve 73.19% coverage with only 34 and 33 paths, respectively. SymPcNSGA-Testing retains 39 paths and achieves 73.19% coverage. </p>
        <p><italic>Interpretation</italic>: </p>
        <p>65% reduction in tested paths. Identical coverage rate compared to other KLEE techniques. This demonstrates that SymPcNSGA-Testing not only reduces the number of paths but also maintains high test quality through equivalent branch coverage. </p>
        <p><bold>Program</bold><italic><bold>expr</bold></italic><bold>:</bold></p>
        <p>KLEE-BASE explores 1375 paths with 75.40% coverage (best). SymPcNSGA-Testing retains 69 paths and achieves 75.28% coverage. </p>
        <p><italic>Interpretation:</italic></p>
        <p>94.98% reduction in the number of paths tested. Almost the same coverage rate than advanced KLEE techniques. </p>
        <p><bold>Program</bold><italic><bold>tr</bold></italic><bold>:</bold></p>
        <p>KLEE-BASE explores 5286 paths and achieves 84.93% coverage (best). SymPcNSGA-Testing retains 50 paths and achieves 84.44% coverage. </p>
        <p><italic>Interpretation</italic>: </p>
        <p>99.05% reduction in tested paths. Minimal coverage drop (−0.49%). SymPcNSGA-Testing achieves high coverage while significantly reducing the number of paths. </p>
      </sec>
    </sec>
    <sec id="sec8">
      <title>8. Conclusions</title>
      <p>Our methodology demonstrated a significant reduction in the number of paths analyzed, thus limiting the combinatorial explosion inherent in symbolic execution. The integration of the genetic algorithm optimized path selection by favoring those with a high impact on branch coverage. Moreover, SymPcNSGA-Testing proved more scalable than traditional approaches, especially for programs where KLEE quickly reaches memory saturation.</p>
      <p>The experimental evaluation was conducted on the GNU Coreutils benchmark, which is widely adopted in the symbolic execution and software testing literature, ensuring both reproducibility and comparability of the results. While the evaluation relies on this standard experimental framework, the proposed methodology remains generic and independent of the specific characteristics of the analyzed programs.</p>
      <p>These results highlight the potential of SymPcNSGA-Testing as an effective solution to the path explosion problem in symbolic execution. By combining clustering and evolutionary optimization, this methodology enables better management of the exploration space while ensuring high branch coverage. These advancements offer promising prospects for improving structural testing, making symbolic execution applicable to larger-scale programs.</p>
      <p>Although the SymPcNSGA-Testing methodology has effectively mitigated the path explosion problem, several directions for improvement and extension can be considered to further optimize its performance and broaden its applicability. These include the integration of machine learning techniques, resource optimization, parallel execution, and evaluation on industrial-scale codebases.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <title>References</title>
      <ref id="B1">
        <label>1.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Cadar, C., Dunbar, D., Engler, D.R., <italic>et al</italic>. (2008) KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs. 8 <italic>th USENIX Symp</italic><italic>osium o</italic><italic>n Operating Systems Design and Implementation</italic>, San Diego, 8-10 December 2008, 209-224.</mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Cadar, C.</string-name>
              <string-name>Dunbar, D.</string-name>
              <string-name>Engler, D.R.</string-name>
              <string-name>Implementation, S</string-name>
            </person-group>
            <year>2008</year>
            <article-title>KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs</article-title>
            <source>8th USENIX Symposium on Operating Systems Design and Implementation</source>
            <volume>8</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B2">
        <label>2.</label>
        <citation-alternatives>
          <mixed-citation publication-type="thesis">Copeland, P.T. (2014) Using State Merging and State Pruning to Address the Path Explosion Problem Faced by Symbolic Execution. Master’s Thesis, Air Force Institute of Technology.</mixed-citation>
          <element-citation publication-type="thesis">
            <person-group person-group-type="author">
              <string-name>Copeland, P.T.</string-name>
              <string-name>Thesis, A</string-name>
            </person-group>
            <year>2014</year>
            <article-title>Using State Merging and State Pruning to Address the Path Explosion Problem Faced by Symbolic Execution</article-title>
            <source>Master’s Thesis</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B3">
        <label>3.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Baars, A., Harman, M., Hassoun, Y., Lakhotia, K., McMinn, P., Tonella, P., <italic>et al</italic>. (2011) Symbolic Search-Based Testing. 2011 26 <italic>th IEEE</italic>/ <italic>ACM International Conference on</italic><italic>Autom</italic><italic>ated Software Engineering</italic> ( <italic>ASE</italic> 2011), Lawrence, 6-10 November 2011, 53-62. https://doi.org/10.1109/ase.2011.6100119 <pub-id pub-id-type="doi">10.1109/ase.2011.6100119</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1109/ase.2011.6100119">https://doi.org/10.1109/ase.2011.6100119</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Baars, A.</string-name>
              <string-name>Harman, M.</string-name>
              <string-name>Hassoun, Y.</string-name>
              <string-name>Lakhotia, K.</string-name>
              <string-name>McMinn, P.</string-name>
              <string-name>Tonella, P.</string-name>
            </person-group>
            <year>2011</year>
            <article-title>Symbolic Search-Based Testing</article-title>
            <source>2011 26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011)</source>
            <volume>6</volume>
            <pub-id pub-id-type="doi">10.1109/ase.2011.6100119</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B4">
        <label>4.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">He, J., Sivanrupan, G., Tsankov, P. and Vechev, M. (2021) Learning to Explore Paths for Symbolic Execution. <italic>Proceedings of the</italic> 2021 <italic>ACM SIGSAC Conference on Computer and Communications Security</italic>, 15-19 November 2021, 2526-2540. https://doi.org/10.1145/3460120.3484813 <pub-id pub-id-type="doi">10.1145/3460120.3484813</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3460120.3484813">https://doi.org/10.1145/3460120.3484813</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>He, J.</string-name>
              <string-name>Sivanrupan, G.</string-name>
              <string-name>Tsankov, P.</string-name>
              <string-name>Vechev, M.</string-name>
            </person-group>
            <year>2021</year>
            <article-title>Learning to Explore Paths for Symbolic Execution</article-title>
            <source>Proceedings of the 2021 ACM SIGSAC Conference on Computer and Communications Security</source>
            <volume>15</volume>
            <pub-id pub-id-type="doi">10.1145/3460120.3484813</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B5">
        <label>5.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Staats, M. and Pǎsǎreanu, C. (2010) Parallel Symbolic Execution for Structural Test Generation. <italic>Proceedings of the</italic> 19 <italic>th International Symposium on Software Testing</italic><italic>and Analysis</italic>, Trento, 12-16 July 2010, 183-194. https://doi.org/10.1145/1831708.1831732 <pub-id pub-id-type="doi">10.1145/1831708.1831732</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/1831708.1831732">https://doi.org/10.1145/1831708.1831732</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Staats, M.</string-name>
              <string-name>Analysis, T</string-name>
            </person-group>
            <year>2010</year>
            <article-title>Parallel Symbolic Execution for Structural Test Generation</article-title>
            <source>Proceedings of the 19th International Symposium on Software Testing and Analysis</source>
            <volume>12</volume>
            <pub-id pub-id-type="doi">10.1145/1831708.1831732</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B6">
        <label>6.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Bucur, S., Ureche, V., Zamfir, C. and Candea, G. (2011) Parallel Symbolic Execution for Automated Real-World Software Testing. <italic>Proceedings of the Sixth Conference on Computer Systems</italic>, Salzburg, 10-13 April 2011, 183-198. https://doi.org/10.1145/1966445.1966463 <pub-id pub-id-type="doi">10.1145/1966445.1966463</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/1966445.1966463">https://doi.org/10.1145/1966445.1966463</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Bucur, S.</string-name>
              <string-name>Ureche, V.</string-name>
              <string-name>Zamfir, C.</string-name>
              <string-name>Candea, G.</string-name>
              <string-name>Systems, S</string-name>
            </person-group>
            <year>2011</year>
            <article-title>Parallel Symbolic Execution for Automated Real-World Software Testing</article-title>
            <source>Proceedings of the Sixth Conference on Computer Systems</source>
            <volume>10</volume>
            <pub-id pub-id-type="doi">10.1145/1966445.1966463</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B7">
        <label>7.</label>
        <citation-alternatives>
          <mixed-citation publication-type="thesis">van Vliet, D. (2023) A Heuristic Approach to the Path Explosion Problem for Complex Heap Programs. Master’s Thesis, Utrecht University.</mixed-citation>
          <element-citation publication-type="thesis">
            <person-group person-group-type="author">
              <string-name>Vliet, D.</string-name>
              <string-name>Thesis, U</string-name>
            </person-group>
            <year>2023</year>
            <article-title>A Heuristic Approach to the Path Explosion Problem for Complex Heap Programs</article-title>
            <source>Master’s Thesis</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B8">
        <label>8.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Xiao, X., Zhang, X. and Li, X. (2010) New Approach to Path Explosion Problem of Symbolic Execution. 2010 <italic>First International Conference on Pervasive Computing</italic>, <italic>Signal Processing and Applications</italic>, Harbin, 17-19 September 2010, 301-304. https://doi.org/10.1109/pcspa.2010.80 <pub-id pub-id-type="doi">10.1109/pcspa.2010.80</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1109/pcspa.2010.80">https://doi.org/10.1109/pcspa.2010.80</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Xiao, X.</string-name>
              <string-name>Zhang, X.</string-name>
              <string-name>Li, X.</string-name>
              <string-name>Computing, S</string-name>
              <string-name>Applications, H</string-name>
            </person-group>
            <year>2010</year>
            <article-title>New Approach to Path Explosion Problem of Symbolic Execution</article-title>
            <source>2010 First International Conference on Pervasive Computing</source>
            <volume>17</volume>
            <pub-id pub-id-type="doi">10.1109/pcspa.2010.80</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B9">
        <label>9.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Zhang, Y., Chen, Z., Shuai, Z., Zhang, T., Li, K. and Wang, J. (2020) Multiplex Symbolic Execution: Exploring Multiple Paths by Solving Once. <italic>Proceedings of the</italic> 35 <italic>th IEEE</italic>/ <italic>ACM I</italic><italic>nt</italic><italic>ernational Conference on Automated Software Engineering</italic>, 21-25 December 2020, 846-857. https://doi.org/10.1145/3324884.3416645 <pub-id pub-id-type="doi">10.1145/3324884.3416645</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3324884.3416645">https://doi.org/10.1145/3324884.3416645</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Zhang, Y.</string-name>
              <string-name>Chen, Z.</string-name>
              <string-name>Shuai, Z.</string-name>
              <string-name>Zhang, T.</string-name>
              <string-name>Li, K.</string-name>
              <string-name>Wang, J.</string-name>
            </person-group>
            <year>2020</year>
            <article-title>Multiplex Symbolic Execution: Exploring Multiple Paths by Solving Once</article-title>
            <source>Proceedings of the 35th IEEE/ACM International Conference on Automated Software Engineering</source>
            <volume>21</volume>
            <pub-id pub-id-type="doi">10.1145/3324884.3416645</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B10">
        <label>10.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Bessler, G., Cordova, J., Cullen-Baratloo, S., Dissem, S., Lu, E., Devin, S., <italic>et al</italic>. (2021) Metrinome: Path Complexity Predicts Symbolic Execution Path Explosion. 2021 <italic>IEEE</italic>/ <italic>ACM</italic> 43 <italic>rd International Conference on Software Engineering</italic>: <italic>Companion</italic><italic>Proceedings</italic> ( <italic>ICSE</italic>- <italic>Companion</italic>), Madrid, 25-28 May 2021, 29-32. https://doi.org/10.1109/icse-companion52605.2021.00028 <pub-id pub-id-type="doi">10.1109/icse-companion52605.2021.00028</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1109/icse-companion52605.2021.00028">https://doi.org/10.1109/icse-companion52605.2021.00028</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Bessler, G.</string-name>
              <string-name>Cordova, J.</string-name>
              <string-name>Cullen-Baratloo, S.</string-name>
              <string-name>Dissem, S.</string-name>
              <string-name>Lu, E.</string-name>
              <string-name>Devin, S.</string-name>
            </person-group>
            <year>2021</year>
            <article-title>Metrinome: Path Complexity Predicts Symbolic Execution Path Explosion</article-title>
            <source>2021 IEEE/ACM 43rd International Conference on Software Engineering: Companion Proceedings (ICSE-Companion)</source>
            <volume>25</volume>
            <pub-id pub-id-type="doi">10.1109/icse-companion52605.2021.00028</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B11">
        <label>11.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Gong, D., Zhang, W. and Yao, X. (2011) Evolutionary Generation of Test Data for Many Paths Coverage Based on Grouping. <italic>Journal of Systems and Software</italic>, 84, 2222-2233. https://doi.org/10.1016/j.jss.2011.06.028 <pub-id pub-id-type="doi">10.1016/j.jss.2011.06.028</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/j.jss.2011.06.028">https://doi.org/10.1016/j.jss.2011.06.028</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Gong, D.</string-name>
              <string-name>Zhang, W.</string-name>
              <string-name>Yao, X.</string-name>
            </person-group>
            <year>2011</year>
            <article-title>Evolutionary Generation of Test Data for Many Paths Coverage Based on Grouping</article-title>
            <source>Journal of Systems and Software</source>
            <volume>84</volume>
            <pub-id pub-id-type="doi">10.1016/j.jss.2011.06.028</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B12">
        <label>12.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Zhu, Z.M., Xu, X. and Jiao, L. (2017) Improved Evolutionary Generation of Test Data for Multiple Paths in Search-Based Software Testing. 2017 <italic>IEEE Congress on Evolut</italic><italic>ionary Computation</italic> ( <italic>CEC</italic>), San Sebastian, 5-8 June 2017, 612-620. https://doi.org/10.1109/cec.2017.7969367 <pub-id pub-id-type="doi">10.1109/cec.2017.7969367</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1109/cec.2017.7969367">https://doi.org/10.1109/cec.2017.7969367</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Zhu, Z.M.</string-name>
              <string-name>Xu, X.</string-name>
              <string-name>Jiao, L.</string-name>
            </person-group>
            <year>2017</year>
            <article-title>Improved Evolutionary Generation of Test Data for Multiple Paths in Search-Based Software Testing</article-title>
            <source>2017 IEEE Congress on Evolutionary Computation (CEC)</source>
            <volume>5</volume>
            <pub-id pub-id-type="doi">10.1109/cec.2017.7969367</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B13">
        <label>13.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Semujju, S.D., Huang, H., Liu, F., Xiang, Y. and Hao, Z. (2023) Search-Based Software Test Data Generation for Path Coverage Based on a Feedback-Directed Mechanism. <italic>Complex System Modeling and Simulation</italic>, 3, 12-31. https://doi.org/10.23919/csms.2022.0027 <pub-id pub-id-type="doi">10.23919/csms.2022.0027</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.23919/csms.2022.0027">https://doi.org/10.23919/csms.2022.0027</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Semujju, S.D.</string-name>
              <string-name>Huang, H.</string-name>
              <string-name>Liu, F.</string-name>
              <string-name>Xiang, Y.</string-name>
              <string-name>Hao, Z.</string-name>
            </person-group>
            <year>2023</year>
            <article-title>Search-Based Software Test Data Generation for Path Coverage Based on a Feedback-Directed Mechanism</article-title>
            <source>Complex System Modeling and Simulation</source>
            <volume>3</volume>
            <pub-id pub-id-type="doi">10.23919/csms.2022.0027</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B14">
        <label>14.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Hassan, A., Shah, W., Husein, A., Talib, M.S., Mohammed, A.A.J. and Iskandar, M. (2019) Clustering Approach in Wireless Sensor Networks Based on K-Means: Limitations and Recommendations. <italic>International Journal of Recent Technology and Engi</italic><italic>neering</italic>, 7, 119-126.</mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Hassan, A.</string-name>
              <string-name>Shah, W.</string-name>
              <string-name>Husein, A.</string-name>
              <string-name>Talib, M.S.</string-name>
              <string-name>Mohammed, A.A.J.</string-name>
              <string-name>Iskandar, M.</string-name>
            </person-group>
            <year>2019</year>
            <article-title>Clustering Approach in Wireless Sensor Networks Based on K-Means: Limitations and Recommendations</article-title>
            <source>International Journal of Recent Technology and Engineering</source>
            <volume>7</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
    </ref-list>
  </back>
</article>