semantic slicing of software version histories
play

Semantic Slicing of Software Version Histories Yi Li / U Toronto - PowerPoint PPT Presentation

Semantic Slicing of Software Version Histories Yi Li / U Toronto Julia Rubin / MIT Marsha Chechik / U Toronto ASE 2015 / Lincoln, NE Motivation Feb, 2015 release [1.3.8] v1.3.8 make groovy.sandbox.blacklist append-only avoid


  1. Semantic Slicing of Software Version Histories Yi Li / U Toronto Julia Rubin / MIT Marsha Chechik / U Toronto ASE 2015 / Lincoln, NE

  2. Motivation Feb, 2015 release [1.3.8] v1.3.8 … make ’groovy.sandbox.blacklist’ append-only avoid NullPointerException if optional Groovy jar is removed 30 authors 67 commits make groovy sandbox method blacklist dynamically additive 87 files changed … prepare for next development iteration (1.3.7-SNAPSHOT) updated docs to use v1.3.6 as current Nov, 2014 release [1.3.6] v1.3.6 2

  3. Motivation Feb, 2015 release [1.3.8] v1.3.8 … make ’groovy.sandbox.blacklist’ append-only avoid NullPointerException if optional Groovy jar is removed 30 authors 67 commits make groovy sandbox method blacklist dynamically additive 87 files changed … prepare for next development iteration (1.3.7-SNAPSHOT) updated docs to use v1.3.6 as current Nov, 2014 release [1.3.6] v1.3.6 2

  4. Motivation Feb, 2015 release [1.3.8] v1.3.8 … make ’groovy.sandbox.blacklist’ append-only avoid NullPointerException if optional Groovy jar is removed 30 authors 67 commits make groovy sandbox method blacklist dynamically additive 87 files changed … prepare for next development iteration (1.3.7-SNAPSHOT) updated docs to use v1.3.6 as current Nov, 2014 release [1.3.6] v1.3.6 2

  5. Motivation Feb, 2015 release [1.3.8] v1.3.8 … make ’groovy.sandbox.blacklist’ append-only avoid NullPointerException if optional Groovy jar is removed 30 authors 67 commits make groovy sandbox method blacklist dynamically additive 87 files changed … prepare for next development iteration (1.3.7-SNAPSHOT) updated docs to use v1.3.6 as current Nov, 2014 release [1.3.6] v1.3.6 2

  6. Why is it so hard? target base 3

  7. Why is it so hard? Options? target 1. Pick target commits 2. Pick the whole history 3. Manually identify necessary commits base 3

  8. Why is it so hard? Options? target 1. Pick target commits 2. Pick the whole history 3. Manually identify necessary commits base 3

  9. Why is it so hard? Options? target 1. Pick target commits 2. Pick the whole history 3. Manually identify necessary commits base 3

  10. Why is it so hard? Options? target 1. Pick target commits // comment int boo1() { 2. Pick the whole history - {return 0;} + {return (new Bar()).y;} } 3. Manually identify necessary commits class Bar { + int y = 0; static int bar1(int x) {return x - 1;} Existing version control tools: • Code treated as plain texts • Do not understand the semantics • User provided semantic/logical grouping is inaccurate! base 3

  11. What can we do? Exploit existing artifacts: target • Strictly structured data • Well-defined language syntax and semantics • Carefully designed test suites base 4

  12. What can we do? Exploit existing artifacts: target • Strictly structured data • Well-defined language syntax and semantics • Carefully designed test suites base 4

  13. Solution: Semantic Slicing Exploit existing artifacts: target target • Strictly structured data • Well-defined language syntax and semantics • Carefully designed test suites base History: Sub-history: sequence of commits well-formed: compiles + & Criterion: semantic preserving: set of tests passing tests base 4

  14. Outline 1. Introduction 2. Dependency Hierarchy 3. CSlicer Algorithm 4. Evaluation 5. Related Work & Conclusion 5

  15. Running Example class A { int g() {return 0;} } class B { static int f(int x) v1.0 {return x + 1;} } 6

  16. Running Example class A { // comment int g() {return 0;} class A { } + // comment C 1 int g() class B { {return 0;} static int f(int x) v1.0 {return x + 1;} } 6

  17. Running Example class A { class A { static int f(int x) { // comment - {return x + 1;} C 2 + {return x - 1;} int g() } {return 0;} class A { } + // comment C 1 int g() class B { {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  18. Running Example // comment int g() { - {return 0;} + {return (new B()).y;} class A { C 3 } class A { // comment class B { static int f(int x) { + int y = 0; int g() - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} {return (new B()).y;} } } class A { class B { + // comment C 1 int g() int y = 0; {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  19. Running Example class A { C 4 + int x; // comment // comment int g() { int g() class A { - {return 0;} + {return (new B()).y;} int x; C 3 } class A { // comment class B { static int f(int x) { + int y = 0; int g() - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} {return (new B()).y;} } } class A { class B { + // comment C 1 int g() int y = 0; {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  20. Running Example Test case: class TestA { a.g()==-1 public void t1() class A { A a = new A(); int x; v1.1 {assertEquals(-1, a.g();} + int g() C 5 + {return B.f(x);} } // comment int h() class A { class A { C 4 + int x; // comment int x; // comment int g() { int g() int g() - {return 0;} + {return (new B()).y;} {return B.f(x);} C 3 } class A { // comment class B { static int f(int x) { + int y = 0; int h() - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} {return (new B()).y;} } } class A { class B { + // comment C 1 int g() int y = 0; {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  21. Running Example Test case: class TestA { a.g()==-1 public void t1() class A { A a = new A(); int x; v1.1 {assertEquals(-1, a.g();} + int g() C 5 + {return B.f(x);} } // comment int h() class A { C 4 + int x; // comment class A { // comment int g() { int g() int x; - {return 0;} + {return (new B()).y;} int g() C 3 } class A { {return B.f(x);} class B { static int f(int x) { + int y = 0; // comment - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} int h() } {return 0;} class A { } + // comment C 1 int g() class B{ {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  22. Running Example Test case: class TestA { a.g()==-1 public void t1() class A { A a = new A(); int x; v1.1 {assertEquals(-1, a.g();} + int g() C 5 + {return B.f(x);} } // comment int h() class A { C 4 + int x; // comment class A { // comment int g() { int g() int x; - {return 0;} + {return (new B()).y;} int g() C 3 } class A { {return B.f(x);} class B { static int f(int x) { + int y = 0; // comment - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} int h() } {return 0;} class A { } + // comment C 1 int g() class B{ {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  23. Running Example Test case: class TestA { a.g()==-1 public void t1() class A { A a = new A(); int x; v1.1 {assertEquals(-1, a.g();} + int g() C 5 + {return B.f(x);} } // comment int h() class A { C 4 + int x; // comment class A { // comment int g() { int g() int x; - {return 0;} + {return (new B()).y;} int g() C 3 } class A { {return B.f(x);} class B { static int f(int x) { + int y = 0; // comment - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} int h() } {return 0;} class A { } + // comment C 1 int g() class B{ {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  24. Running Example Test case: class TestA { a.g()==-1 public void t1() class A { A a = new A(); int x; v1.1 {assertEquals(-1, a.g();} + int g() C 5 + {return B.f(x);} } // comment int h() class A { C 4 + int x; // comment class A { // comment int g() { int g() int x; - {return 0;} + {return (new B()).y;} int g() C 3 } class A { {return B.f(x);} class B { static int f(int x) { + int y = 0; // comment - {return x + 1;} static int f(int x) C 2 + {return x - 1;} {return x - 1;} int h() } {return 0;} class A { } + // comment C 1 int g() class B{ {return 0;} static int f(int x) v1.0 {return x - 1;} } 6

  25. Dependency Hierarchy Dependency Examples Definitions Types class A { required for maintaining the static int f(int x) { - {return x + 1;} Functional semantic behaviours (e.g., pass C 2 + {return x - 1;} } the same tests) required for maintaining the class A { C 4 wellformedness of the program + int x; Compilation // comment (e.g., free from compilation int g() errors) class A { specific to text-based version + // comment Hunk C 1 int g() control systems (e.g., Git) {return 0;} 7

  26. Dependency Hierarchy Dependency Examples Definitions Dependency Hierarchy Types class A { Correctness required for maintaining the static int f(int x) { - {return x + 1;} Functional Functional semantic behaviours (e.g., pass C 2 + {return x - 1;} } Core the same tests) required for maintaining the Well-formedness class A { Structural C 4 wellformedness of the program + int x; Compilation // comment Glue Code (e.g., free from compilation int g() errors) class A { specific to text-based version Applicability + // comment Hunk Textual Contexts C 1 int g() control systems (e.g., Git) {return 0;} 7

  27. Outline 1. Introduction 2. Dependency Hierarchy 3. CSlicer Algorithm 4. Evaluation 5. Related Work & Conclusion 8

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend