recommending method invocation context changes

Post on 25-May-2015

1.047 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

software evolution & architecture lab

University of ZurichDepartment of Informatics

ChangeCommander

Beat Fluri, Jonas Zuberbühler, and Harald C. Galls.e.a.l. - software evolution & architecture labDepartment of InformaticsUniversity of Zurich, Switzerland

Recommending Method InvocationContext Changes

Which changes fix bugs?

Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE

15% of bugs fixes contain context changes of method invocation statements

Which changes fix bugs?

Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE

15% of bugs fixes contain context changes of method invocation statements

Method Invocation Context ChangeMoving a method invocation into the then or the else-part of an if-statement.

Which changes fix bugs?

Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE

15% of bugs fixes contain context changes of method invocation statements

Method Invocation Context ChangeMoving a method invocation into the then or the else-part of an if-statement.

visited.add(outputFolder);

Which changes fix bugs?

Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE

15% of bugs fixes contain context changes of method invocation statements

Method Invocation Context ChangeMoving a method invocation into the then or the else-part of an if-statement.

visited.add(outputFolder);

if (!visited.contains(outputFolder)) {

}

Similar conditions for all methods

Context changes tend to be similar

Similar conditions for specific methods

Similar conditions for all methods

Context changes tend to be similar

Similar conditions for specific methods

if (myObject != null) { list.add(myObject);}

if (list != null) { list.add(myObject);}

Similar conditions for all methods

Context changes tend to be similar

Similar conditions for specific methods

if (myObject != null) { list.add(myObject);}

if (list != null) { list.add(myObject);}

if (!list.contains(myObject)) { list.add(myObject);}

Pattern extraction process

Pattern extraction process

Contextchanges

Pattern extraction process

Contextchanges

Pattern extraction process

Contextchanges

Pattern extraction process

Contextchanges

Invocationaggregation

Pattern extraction process

Contextchanges

Invocationaggregation

Patternextraction

Pattern extraction process

Contextchanges

Invocationaggregation

Patternextraction

Invocation aggregation

list.add(myObject) java.util.List.add(MyClass)

Method invocations Invocation signature

Invocation aggregation

list.add(myObject) java.util.List.add(MyClass)

Method invocations Invocation signature

Invocation aggregation

list.add(myObject) java.util.List.add(MyClass)

Method invocations Invocation signature

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)Method invocation Invocation signature

Same Package

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)Method invocation Invocation signature

Imports

Same Package

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)Method invocation Invocation signature

Imports

Same Package

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)

JDT

Method invocation Invocation signature

Imports

Same Package

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)

JDT

Method invocation Invocation signature

Imports

Same Package

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)

JDT

Method invocation Invocation signature

Post Resolver

Match in scopevariables

Match in imports

...

Imports

Same Package

Invocation aggregation

list.add(anObject) java.util.List.add(MyClass)

JDT

Method invocation Invocation signature

Post Resolver

Match in scopevariables

Match in imports

...

!<qualifier>.contains(<argument_0>)

Pattern extraction

list.add(myObject)

Aggregated invocations Context change patterns

!list.contains(myObject)

list != null && <qualifier> != null

!<qualifier>.contains(<argument_0>)

Pattern extraction

list.add(myObject)

Aggregated invocations Context change patterns

!list.contains(myObject)

list != null && <qualifier> != null

!<qualifier>.contains(<argument_0>)

Pattern extraction

list.add(myObject)

Aggregated invocations Context change patterns

!list.contains(myObject)

list != null && <qualifier> != null

!<qualifier>.contains(<argument_0>)

Pattern extraction

Aggregated invocations Context change patterns

!list.contains(myObject)list != null && <qualifier> != null

Split compound conditions into single conditions

!<qualifier>.contains(<argument_0>)

Pattern extraction

Aggregated invocations Context change patterns

!list.contains(myObject)list != null && <qualifier> != null

Split compound conditions into single conditions

Token streams for- conditions- method invocation

!<qualifier>.contains(<argument_0>)

Pattern extraction

Aggregated invocations Context change patterns

!list.contains(myObject)list != null && <qualifier> != null

Split compound conditions into single conditions

Token streams for- conditions- method invocation

!<qualifier>.contains(<argument_0>)

Pattern extraction

Aggregated invocations Context change patterns

!list.contains(myObject)list != null && <qualifier> != null

Split compound conditions into single conditions

Token streams for- conditions- method invocation

list.add(myObject)

!<qualifier>.contains(<argument_0>)

Pattern extraction

Aggregated invocations Context change patterns

!list.contains(myObject)list != null && <qualifier> != null

Split compound conditions into single conditions

Token streams for- conditions- method invocation

list.add(myObject)

!<qualifier>.contains(<argument_0>)

Pattern extraction

Aggregated invocations Context change patterns

!list.contains(myObject)list != null && <qualifier> != null

Split compound conditions into single conditions

Token streams for- conditions- method invocation

list.add(myObject)

Recommendation

Recommendation

Recommendation

Recommendation

java.util.List.add(MyClass)

Recommendation

java.util.List.add(MyClass)

Recommendation

java.util.List.add(MyClass)

Recommendation

java.util.List.add(MyClass)

Surrounding if already contains condition

Filter predefined method invocations

xx

Recommendation

java.util.List.add(MyClass)

Surrounding if already contains condition

Filter predefined method invocations

xx

ChangeCommander

A first validation

Split history

Training set: Past context changes up to a certain release

Test set: Context changes after that particular release

Recommended context change

True positive (TP): in test setFalse positive (FP): not in test setFalse negative (FN): context change in test set but not recommended

A first validation

Project TP #B FP FN

ArgoUML 29 11 4675 75

Azureus 15 3 - 82

Eclipse JDT 51 27 - 158

Eclipse PDE 35 25 8011 46

jEdit 1 0 1307 13

A first validation

Project TP #B FP FN

ArgoUML 29 11 4675 75

Azureus 15 3 - 82

Eclipse JDT 51 27 - 158

Eclipse PDE 35 25 8011 46

jEdit 1 0 1307 13

Conclusions

Recommending context changesWe leverages context change data to suggest corresponding modifications on existing or newly added method invocations.

ChangeCommanderBy integrating our recommendation approach into the development process, we aim at reducing future bugs.

top related