making software refactorings safer · 2 public c myc; 3 4 public void m(){5 myc.x = new x(); 6} 7 8...

14
Making Software Refactorings Safer Anna Maria Eilertsen @Sowhow Supervised by: Anya Bagge 1 Volker Stolz 2 1 Inst. for Informatikk, Universitetet i Bergen 2 Inst. for Data- og Realfag, Høgskolen i Bergen Norway July 12, 2016 The results of this thesis has been accepted to the ISOLA 1 conference as a paper. 1 http://www.isola-conference.org/isola2016/ Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Making Software Refactorings Safer July 12, 2016 1 / 14

Upload: others

Post on 23-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Making Software Refactorings Safer

Anna Maria Eilertsen@Sowhow

Supervised by: Anya Bagge1 Volker Stolz 2

1Inst. for Informatikk, Universitetet i Bergen

2Inst. for Data- og Realfag, Høgskolen i BergenNorway

July 12, 2016

The results of this thesis has been accepted to the ISOLA1 conference as a paper.

1http://www.isola-conference.org/isola2016/

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 1 / 14

Page 2: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Software Refactorings

“Behaviour preserving programtransformation”

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 2 / 14

Page 3: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Software Refactoring Tools

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 3 / 14

Page 4: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Unsafe Refactorings

“The primary risk is regression, mostly from

misunderstanding subtle corner cases in the

original code and not accounting for them

in the refactored code.”

– interviewee, Microsoft developer,

Kim et al., 2012

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 4 / 14

Page 5: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Unsafe Refactoring Example

Extract Local Variable

In Java/Eclipse:

Before

1 public void f() {

2 x.n();

3 setX();

4 x.n();

5 }

After

1 public void f() {

2 X temp = x;

3 temp.n();

4 setX();

5 temp.n();

6 }

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 5 / 14

Page 6: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

An analysing problem

x = new X();

setX(); // x = new X();

1 public void f() {

2 X temp = x;

3 temp.n();

4 setX();

5 temp.n();

6 }

Solution:

assert temp == x;

⇤Dog art from Hyperbole and a Half

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 6 / 14

Page 7: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Extract Local Variable

Simplified example:

1 public class C {

2 public X x = new X();

3 {//initializer

4 x.myC = this;

5 }

6

7 public void f(){

8 x.n();

9 x.m();

10 x.n();

11 }

12 }

1 public class X{

2 public C myC;

3

4 public void m(){

5 myC.x = new X();

6 }

7

8 public void n(){

9 System.out.println(

10 this.hashCode());

11 }

12 }

Output:173560005421685669 skip example

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 7 / 14

Page 8: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Extract Local Variable

Refactored:

1 public class C {

2 public X x = new X();

3 {//initializer

4 x.myC = this;

5 }

6

7 public void f(){

8 X temp = x;

9 temp.n();

10 temp.m();

11 temp.n();

12 }

13 }

1 public class X{

2 public C myC;

3

4 public void m(){

5 myC.x = new X();

6 }

7

8 public void n(){

9 System.out.println(

10 this.hashCode());

11 }

12 }

Output:17356000541735600054

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 8 / 14

Page 9: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Extract Local Variable

With dynamic checks:

1 public class C {

2 public X x = new X();

3 {//initializer

4 x.myC = this;

5 }

6 public void f(){

7 X temp = x;

8 assert temp == x;

9 temp.n();

10 assert temp == x;

11 temp.m();

12 assert temp == x;

13 temp.n();

1 public class X{

2 public C myC;

3

4 public void m(){

5 myC.x = new X();

6 }

7

8 public void n(){

9 System.out.println(

10 this.hashCode());

11 }

12 }

Output:1735600054Exception in thread ”main” java.lang.AssertionError

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 9 / 14

Page 10: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Extract And Move Method

A similar problem:

1 public class C {

2 public X x = new X();

3 {//initializer

4 x.myC = this;

5 }

6 public void f(){

7 x.bar(this);

8 }

9 }

1 public class X{

2 ...

3 void bar(C c){

4 this.n();

5 assert this == c.x;

6 this.m();

7 assert this == c.x;

8 this.n();

9 }

10 }

Similar how?Evaluate x once.Refer to that value by this

Substitute every occurrence of x with this

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 10 / 14

Page 11: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Experiment: Case study

Case: Eclipse JDT UI source code

Experiment:

Execute our modified refactorings on Eclipse JDT UI project

Run Eclipse test suite

Look for triggered asserts

Profit!!

Need custom automated refactoring tool.

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 11 / 14

Page 12: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Experiment: Results

Extract Local Extract andVariable Move Method

Executed refactorings 4538 755

Total number of asserts 7665 610

Resulting compile errors 0 14

Successful Tests 2392 2151

Unsuccessful Tests 4 245

Asserts triggered 2 / 136⇤ 0

⇤ 136 instances of the same 2 assert statements

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 12 / 14

Page 13: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Discussion

Take-away and questions:

Extract Local Extract andVariable Move Method

Executed refactorings 4538 755Total number of asserts 7665 610

Resulting compile errors 0 14Successful Tests 2392 2151

Unsuccessful Tests 4 245Asserts triggered 2 / 136 0

Dynamic preconditions can be useful!

Assert statements are incomplete.

Show or hide the asserts from the programmer?

Is reference equivalence too strict?

Thank you!

⇤Art with face is from Hyperbole and a Half

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 13 / 14

Page 14: Making Software Refactorings Safer · 2 public C myC; 3 4 public void m(){5 myC.x = new X(); 6} 7 8 public void n(){9 System.out.println(10 this.hashCode()); 11} 12} Output: 1735600054

Experiment: Development

Eclipse refactoring plug-in

Modify Eclipse’s refactorings to introduce assertsI Extract Local VariableI Extract And Move Method

Automate refactoring processI Execute on Java projectI One refactoring per method

Custom heuristic for finding refactoring targets

Anna Maria Eilertsen @sowhow (Inst. for Informatikk, Universitetet i Bergen, Inst. for Data- og Realfag, Høgskolen i Bergen Norway)Making Software Refactorings Safer July 12, 2016 14 / 14