Skip to content

Slice Tool Omits Critical Variable Modifications & Retains Undefined Variable When Slicing main-Defined Variable with Recursive Instance Methods #57

@bystc

Description

@bystc

1.Description
The slicing tool has two critical issues when targeting callCount (in main):
It omits key variable modification logic (constructor assignment of Counter.value and recursive count.value++).
It retains an undefined variable caller in the generated slice, making the code invalid.

2.Steps to Reproduce
Create Example.java with the following code:

public class Example {
    static class Counter {
        int value;
        Counter(int init) { this.value = init; } // Critical assignment
    }

    static class NestedCaller {
        void deepCall(int n, Counter count) {
            if (n > 0) {
                count.value++; // Critical recursive update
                deepCall(n - 1, count);
            }
        }
    }

    public static void main(String[] args) {
        Counter callCount = new Counter(0); // Target variable
        NestedCaller caller = new NestedCaller(); // Define caller
        caller.deepCall(100, callCount);
        System.out.println(callCount.value); // Slicing criterion (line 20)
    }
}

Run the tool with criterion: File Example.java → Line 20 → Variable callCount.

3.Expected Behavior
The slice should retain:
Counter constructor’s this.value = init (to initialize callCount.value),
NestedCaller caller = new NestedCaller() (to define caller),
count.value++ in deepCall (to track how callCount.value is updated),
All original valid logic for callCount’s data flow.

4.Actual Behavior
The generated slice is incomplete and invalid:

/*
	This file was automatically generated as part of a slice with criterion
	file: Example.java, line: 20, variable: callCount
	Original file: C:\Users\59829\Desktop\nju\Metamorphic-slice-master\Metamorphic-slice-master\src\main\java\Example.java
*/
public class Example {

    static class Counter {

        int value;

        Counter(int init) {
        } // MISSING: this.value = init
    }

    static class NestedCaller {

        void deepCall(int n, Counter count) {
            if (n > 0) {
                deepCall(n - 1, count);
            }
        } // MISSING: count.value++
    }

    public static void main(String[] args) {
        Counter callCount = new Counter(0);
        caller.deepCall(100, callCount); // ERROR: caller is undefined
        System.out.println(callCount.value);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions