npefix

Automatic repair of NPE

License

License

GroupId

GroupId

fr.inria.gforge.spirals
ArtifactId

ArtifactId

npefix
Last Version

Last Version

0.7
Release Date

Release Date

Type

Type

jar
Description

Description

npefix
Automatic repair of NPE
Project URL

Project URL

https://github.com/SpoonLabs/npefix
Source Code Management

Source Code Management

https://github.com/SpoonLabs/npefix

Download npefix

How to add to project

<!-- https://jarcasting.com/artifacts/fr.inria.gforge.spirals/npefix/ -->
<dependency>
    <groupId>fr.inria.gforge.spirals</groupId>
    <artifactId>npefix</artifactId>
    <version>0.7</version>
</dependency>
// https://jarcasting.com/artifacts/fr.inria.gforge.spirals/npefix/
implementation 'fr.inria.gforge.spirals:npefix:0.7'
// https://jarcasting.com/artifacts/fr.inria.gforge.spirals/npefix/
implementation ("fr.inria.gforge.spirals:npefix:0.7")
'fr.inria.gforge.spirals:npefix:jar:0.7'
<dependency org="fr.inria.gforge.spirals" name="npefix" rev="0.7">
  <artifact name="npefix" type="jar" />
</dependency>
@Grapes(
@Grab(group='fr.inria.gforge.spirals', module='npefix', version='0.7')
)
libraryDependencies += "fr.inria.gforge.spirals" % "npefix" % "0.7"
[fr.inria.gforge.spirals/npefix "0.7"]

Dependencies

compile (11)

Group / Artifact Type Version
junit : junit jar 4.11
org.json : json jar 20160212
org.hamcrest : hamcrest-core jar 1.3
fr.inria.gforge.spoon : spoon-core jar 7.1.0
org.slf4j : slf4j-simple jar 1.7.6
log4j : log4j jar 1.2.17
com.cloudbees : diff4j jar 1.2
org.eclipse.core : org.eclipse.core.runtime jar 3.6.0.v20100505
org.eclipse.core : org.eclipse.core.resources jar 3.6.0.v20100526-0737
org.glassfish.tyrus.bundles : tyrus-standalone-client jar 1.13.1
org.apache.maven : maven-model jar 3.5.0

Project Modules

There are no modules declared in this project.

NPEFix Build Status Coverage Status

NPEFix is a system that automatically generates patches for NullPointerException, aka automatic bug fixing for NPE. This code is research code, released under the GPL licence, developed at Inria Lille.

If you use this code, please cite:

Thomas Durieux, Benoit Cornu, Lionel Seinturier and Martin Monperrus, "Dynamic Patch Generation for Null Pointer Exceptions Using Metaprogramming", In IEEE International Conference on Software Analysis, Evolution and Reengineering, 2017, doi:10.1109/SANER.2017.7884635.

@inproceedings{durieuxNpeFix,
    title = {{Dynamic Patch Generation for Null Pointer Exceptions Using Metaprogramming}},
    author = {Durieux, Thomas and Cornu, Benoit and Seinturier, Lionel and Monperrus, Martin},
    url = {https://hal.archives-ouvertes.fr/hal-01419861/document},
    booktitle = {{IEEE International Conference on Software Analysis, Evolution and Reengineering}},
    doi = {10.1109/SANER.2017.7884635},
    year = {2017},
}

Using maven-repair

Maven-repair is a Maven plugin for bug-fixing, see https://github.com/Spirals-Team/repairnator/tree/master/maven-repair

Command line

Install:

git clone https://github.com/Spirals-Team/npefix/
cd npefix
mvn install

Run:

java -jar target/npefix.jar \\
    --test failing_test
    --iteration 100
    --complianceLevel 8
    --workingdirectory . 
    --source path_source:path_test
    --classpath a.jar:b.jar;
    --repairStrategy <fully qualified name of a repair strategy>

Reproduce the Scientific Evaluation

To reproduce the evaluation from the paper:

  1. Gets the NPE Dataset: https://github.com/Spirals-Team/npe-dataset
  2. Installs each bug on your system, in order to download the dependencies
  3. Configures the location of the dataset in src/main/resources/config.ini
  4. Creates the jar with all dependencies: mvn clean compile assembly:single
  5. Execute java -jar target/npefix-0.3-jar-with-dependencies.jar (see the execution usage below)

Execution usage

java -jar target/npefix-0.2-jar-with-dependencies.jar
                          (-p|--project) <math-1117...> [(-m|--mode) <mode>] [(-x|--working) <workingDirectory>] [(-k|--m2) <~/.m2>] [(-e|--epsilon) <0.2>] [(-s|--seed) <randomSeed>] [(-l|--laps) <nbLaps>] [(-t|--timeout) <testTimeout>]

  (-p|--project) <math-1117...>
        The name of the buggy program to execute (e.g. collection-360, math-1117, ...).

  [(-m|--mode) <mode>]
        The execution mode:
            * normal: Executes n times (the option --laps) the program and use the Epsilon Greedy algorithm to select the decision.
            * exploration: Explores all possible decision sequences with a limit of n laps (defined by --laps)

  [(-x|--working) <workingDirectory>]
        The path to the evaluation working directory.

  [(-k|--m2) <~/.m2>]
        The m2 folder. (default: ~/.m2)

  [(-e|--epsilon) <0.2>]
        The Epsilon-Greedy epsilon (the probability to use the exploration vs exploitation). (default: 0.2)

  [(-s|--seed) <randomSeed>]
        The seed of the random generator.

  [(-l|--laps) <nbLaps>]
        Defines the number of laps. (default: 100)

  [(-t|--timeout) <testTimeout>]
        Defines the timeout in second of the each test execution. (default: 5)

Execution output

{
  "executions": [
    /* all laps */
    {
      "result": {
        "error": "<the exception>",
        "type": "<the oracle type>",
        "success": true
      },
      /* all decisions points */
      "locations": [{
        "sourceEnd": 12234,
        "executionCount": 0,
        "line": 352,
        "class": "org.apache.commons.collections.iterators.CollatingIterator",
        "sourceStart": 12193
      }],
      /* the runned test */
      "test": {
        "name": "testNullComparator",
        "class": "org.apache.commons.collections.iterators.TestCollatingIterator"
      },
      /* all decision made during the laps */
      "decisions": [{
        /* the location of the laps */
        "location": {
          "sourceEnd": 12234,
          "line": 352,
          "class": "org.apache.commons.collections.iterators.CollatingIterator",
          "sourceStart": 12193
        },
        /* the value used by the decision */
        "value": {
          "variableName": "leastObject",
          "value": "leastObject",
          "type": "int"
        },
        /* the value of the epsilon */
        "epsilon": 0.4,
        // the name of the strategy
        "strategy": "Strat4 VAR",
        "used": true,
        /* the decision type (new, best, random) */
        "decisionType": "new"
      }],
      "startDate": 1453918743999,
      "endDate": 1453918744165,
      "metadata": {"seed": 10}
    },
    ...
  ],
  "searchSpace": [
    /* all detected decisions */
    {
      "location": {
        "sourceEnd": 12234,
        "line": 352,
        "class": "org.apache.commons.collections.iterators.CollatingIterator",
        "sourceStart": 12193
      },
      "value": {
        "value": "1",
        "type": "int"
      },
      "epsilon": 0,
      "strategy": "Strat4 NEW",
      "used": false,
      "decisionType": "random"
    },
    ...
  ],
  "date": "Wed Jan 27 19:19:37 CET 2016"
}
fr.inria.gforge.spirals
The laboratory for Java source code analysis and transformation using Spoon

Versions

Version
0.7