380 likes | 527 Views
A Slicing Method for Object-Oriented Programs Using Lightweight Dynamic Information. Fumiaki OHATA, Kouya HIROSE, Masato FUJII and Katsuro INOUE Osaka University, JAPAN. Contents. Program Slice Dependence-Cache (DC) Slice Object-Oriented Dependence-Cache (OODC) Slice Implementation
E N D
A Slicing Method forObject-Oriented ProgramsUsingLightweight Dynamic Information Fumiaki OHATA, Kouya HIROSE, Masato FUJII and Katsuro INOUE Osaka University, JAPAN
Contents • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Contents (1/6) • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Program Slice (Slice) • Subprogram which affects the value of slicing criterion <s, v> in p s : Statement v : Variable p : Program • Applications • Program understanding • Program debugging • …
1: scanf("%d", &a); 2: scanf("%d", &b); 3: max = a; 4: min = b; 5: if (a > b) { 6: max = b; 7: min = a; 8: } 9: printf("%d", max); - Correct program - - Incorrect program - 1:scanf("%d", &a); 2: scanf("%d", &b); 3: max = a; 4: min = b; 5: if (a < b) { 6: max = b; 7: min = a; 8: } 9: printf("%d", max); 1:scanf("%d", &a); 2: scanf("%d", &b); 3: max = a; 4: min = b; 5: if (a > b) { 6: max = b; 7: min = a; 8: } 9: printf("%d", max); Slice for <9, max> Application Example [Program Debugging] • Slice is effective on fault localization process. • The slice for <9, max> indicates the statements that might cause the unexpected value of max at line 9, so that we have only to focus on them.
Computation Process Phase 1 : Defined and referred variables extraction Phase 2 : Dependence analysis • Data dependence (DD) analysis • Control dependence (CD) analysis Phase 3 : Program dependence graph (PDG) construction Phase 4 : Slice extraction using PDG traversal
Data Dependence (DD) Analysis Extract DD relations between two statements • DD relation represents data-flow through variable. 1: a = 3; 2: b = 2; 3: scanf("%d", &c); 4: if ( c == 0 ) 5: d = a; 6: else 7: d = a + 1; 8: e = a + b; 9: printf("%d", d); 10: printf("%d", e); d d
Control Dependence (CD) Analysis Extract CD relations between two statements • CD relation represents control-flow from conditional expression to conditional predicate or from method invocation to method definition. 1: a = 3; 2: b = 2; 3: scanf("%d", &c); 4: if ( c == 0 ) 5: d = a; 6: else 7: d = a + 1; 8: e = a + b; 9: printf("%d", d); 10: printf("%d", e);
Static Slice • Scope : all possible execution paths • Target : source code • Execution : not required • Dependence analysis • DD : static • CD : static • Advantage • Small analysis cost • Disadvantage • Imprecise analysis results 1: a = 3; 2: b = 2; 3: scanf("%d", &c); 4: if ( c == 0 ) 5: d = a; 6: else 7: d = a + 1; 8: e = a + b; 9: printf("%d", d); 10: printf("%d", e); d d Slice for <9, d>
Dynamic Slice • Scope : single execution path • Target : execution trace • Execution : required • Dependence analysis • DD : dynamic • CD : dynamic • Advantage • Precise analysis results • Disadvantage • Large analysis cost - input ‘0’ for c - 1: a = 3; 2: b = 2; 3: scanf("%d", &c); 4: if ( c == 0 ) 5: d = a; 6: else 7: d = a + 1; 8: e = a + b; 9: printf("%d", d); 10: printf("%d", e); d d
Contents (2/6) • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Problems • Static slice has two problems, • array indexes problem : it is difficult for us to determine the values of array indices, and • pointer alias problem : it is difficult for us to determine the destination of pointer variables, so that extracted DD relations are imprecise. • Dynamic slice can resolve these problems; however, it requires large analysis cost.
Dependence-Cache (DC) Slice • Scope : single execution path • Target : source code • Execution : required • Dependence analysis • DD : dynamic • CD : static • Advantage • More precise analysis results than static slice • Smaller analysis cost than dynamic slice - input ‘0’ for c - 1: a = 3; 2: b = 2; 3: scanf("%d", &c); 4: if ( c == 0 ) 5: d = a; 6: else 7: d = a + 1; 8: e = a + b; 9: printf("%d", d); 10: printf("%d", e);
Dynamic DD Analysis • DD relation DD(s, t, v) exists when the following conditions are all satisfied: • statement s defines variable v, and • statement t refers v, and • at least one execution path from s to t without re-defining v exists. Dynamic analysis • On program execution, we have only to trace the most-recently defined statement for each variable using cache.
Cache • Cache(v) : statement that defined variable v most-recently. • Operations for caches Before program execution, • For each variable v, Cache(v) . On program execution, • For each statement s, - when v is defined, Cache(v) s. - when v is referred, we extract DD relation “DD(Cache(v), s, v)”.
Comparison withStatic Slice & Dynamic Slice¶ • Analysis precision (slice size) : Static slice DC slice Dynamic slice • Analysis cost (memory space & computation time) : Static slice < DC slice « Dynamic slice ¶Ashida, Y., Ohata, F. and Inoue, K. : “Slicing Methods Using Static and Dynamic Information”, Proceedings of the 6th Asia Pacific Software Engineering Conference, 344-350, 1999.
Contents (3/6) • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Object-Oriented DC (OODC) Slice • Extended DC slice for Object-Oriented (OO) programs • OO languages have concepts which procedural languages do not have. • Class, Object (Instance) • Inheritance, Class hierarchy, Method overriding • Dynamic binding : based on the reference-type of the object, an appropriate overriding method is selected and invoked.
Analysis Policy Character 1 : object is a collection of attributes and methods that operate them. Character 2 : dynamic binding feature exists; however, static analysis can not handle it sufficiently. Policy 1 : when a variable is created, the corresponding cache is also created. Policy 2 : we use dynamic CD analysis for method invocation.
Dynamic CD analysis for Method Invocation • CD relation CD(s, t) about method invocation exists when the following conditions are all satisfied: • statement t is a method definition, and • statement s calls t. Dynamic analysis • On program execution, we have only to watch the execution trace from a method invocation to a method definition.
Contents (4/6) • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Program Slicing Criterion GUI (Graphical User Interface) Preprocessor Program + Analysis Code [Source] Slice Java Compiler Slicer Program + Analysis Code [Bytecode] Java Virtual Machine PDG Analysis Libraries Implementation • DC Slicing System for Java • Analysis libraries • GUI • Developing environment • JDK1.3.0_01 • JavaCC2.0
Analysis Libraries • 10,000 lines • Analysis method : preprocessor style • Preprocessor loads target program p, and generate program p’ that contains p and the code to analyze p dynamically. • Easily development • Easily optimization using JIT or JavaVM
Example [Preprocessed Code] - Original code - - Preprocessed code - • For each statement s, • when variable v is referred, we insert ref(v, s) before s. • when v is defined, we insert def(v, s) before s. 1 : int a = 10; 2 : int b = 20; 3 : int c; 4 : c = a + b; 5 : printf(“%d\n”, c); 0 : initPDG(); 1’: def(a, 1); 1 : int a = 10; 2’: def(b, 2); 2 : int b = 20; 3’: def(c, 3); 3 : int c; 4’: ref(a, 4); 4’: ref(b, 4); 4’: def(c, 4); 4 : c = a + b; 5’: ref(c, 5); 5 : printf(“%d\n”, c); Developed Preprocessor
GUI • 3,000 lines • Features • Program editing • Slice computation
Contents (5/6) • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Metrics Values (1/2) • Sample programs • Analysis precision (slice size) [lines]
Metrics Values (2/2) • Analysis cost • Computation cost (execution time) [ms] T1 : original code, T2 : preprocessed code (original code + analysis code) • Space cost (memory use on execution) [KByte]
Evaluation • Analysis precision • Slice size : 30-60% of Static slice • Static slice DC slice Dynamic slice¶ • Analysis cost • Additional cost for dynamic DD analysis and dynamic CD analysis for method invocation is not so large. - Computation cost : 4.2 - Space cost : 1.2 ¶Ashida, Y., Ohata, F. and Inoue, K. : “Slicing Methods Using Static and Dynamic Information”, Proceedings of the 6th Asia Pacific Software Engineering Conference, 344-350, 1999.
Contents (6/6) • Program Slice • Dependence-Cache (DC) Slice • Object-Oriented Dependence-Cache (OODC) Slice • Implementation • Evaluation • Summary and Future Work
Summary • Classification of slicing methods • OODC slice • An intermediate slice between static slice and dynamic slice for OO programs • Dynamic DD analysis • Dynamic CD analysis for method invocation • Static CD analysis (except method invocation) • Implementation (DC Slicing System for Java) • Evaluation (Experimentation using sample Java programs)
Future Work • Application of dynamic CD analysis to other dynamically determined elements in Java • Exception • Thread • Experimental comparison with other slicing methods on analysis cost • Application of OODC slice to large programs • JavaVM-based (interpreter style) DC Slicing System for Java (now developing)
Data dependence (DD) relation 16: sum = a + b + c; 17: x = (float) sum / 3.0; sum Example [Phase 2] (DD Analysis) 1: #include <stdio.h> 2: 3: float absolute(float x) 4: { 5: if(x < 0) { 6: x = -1 * x; 7: } 8: return x; 9: } 10: 11: float ave(int a, int b, int c) 12: { 13: int sum; 14: float x; 15: 16: sum = a + b + c; 17: x = (float) sum / 3.0; 18: x = absolute(x); 19: return x; 20: } 21: 22: int main(void) 23: { 24: int a, b, c; 25: float x; 26: 27: printf("Input a b c ?"); 28: scanf("%d %d %d", &a, &b, &c); 29: 30: x = ave(a, b, c); 31: printf("Ave = %9.3f\n", x); 32: return 0; 33: }
Control dependence (CD) relation [intra-method] Control dependence (CD) relation [inter-method] 3: float absolute(float x) 4: { 5: if(x < 0) { 6: x = -1 * x; 7: } 8: return x; 9: } 5: if (x < 0) { 6: x = -1 * x; 7: } call return 11: float ave(int a, int b, int c) 12: { 18: x = absolute(x); 20: } Example [Phase 2] (CD Analysis) 1: #include <stdio.h> 2: 3: float absolute(float x) 4: { 5: if(x < 0) { 6: x = -1 * x; 7: } 8: return x; 9: } 10: 11: float ave(int a, int b, int c) 12: { 13: int sum; 14: float x; 15: 16: sum = a + b + c; 17: x = (float) sum / 3.0; 18: x = absolute(x); 19: return x; 20: } 21: 22: int main(void) 23: { 24: int a, b, c; 25: float x; 26: 27: printf("Input a b c ?"); 28: scanf("%d %d %d", &a, &b, &c); 29: 30: x = ave(a, b, c); 31: printf("Ave = %9.3f\n", x); 32: return 0; 33: }
28 11 3 a b c x a b c 16 30 5 sum x x 17 31 6 x x 27 18 8 x DD 19 CD Example [Phase 3] 1: #include <stdio.h> 2: 3: float absolute(float x) 4: { 5: if(x < 0) { 6: x = -1 * x; 7: } 8: return x; 9: } 10: 11: float ave(int a, int b, int c) 12: { 13: int sum; 14: float x; 15: 16: sum = a + b + c; 17: x = (float) sum / 3.0; 18: x = absolute(x); 19: return x; 20: } 21: 22: int main(void) 23: { 24: int a, b, c; 25: float x; 26: 27: printf("Input a b c ?"); 28: scanf("%d %d %d", &a, &b, &c); 29: 30: x = ave(a, b, c); 31: printf("Ave = %9.3f\n", x); 32: return 0; 33: } • Node : statement or conditional expression • Edge : dependence relation between two nodes
28 11 3 a b c x a b c 16 30 5 sum x x x 17 31 6 x x 27 18 8 x 19 Example [Phase 4] (Slice for <30, x>) 1: #include <stdio.h> 2: 3: float absolute(float x) 4: { 5: if(x < 0) { 6: x = -1 * x; 7: } 8: return x; 9: } 10: 11: float ave(int a, int b, int c) 12: { 13: int sum; 14: float x; 15: 16: sum = a + b + c; 17: x = (float) sum / 3.0; 18: x = absolute(x); 19: return x; 20: } 21: 22: int main(void) 23: { 24: int a, b, c; 25: float x; 26: 27: printf("Input a b c ?"); 28: scanf("%d %d %d", &a, &b, &c); 29: 30: x = ave(a, b, c); 31: printf("Ave = %9.3f\n", x); 32: return 0; 33: } • We start PDG traversal from the slicing criterion node in reverse order. • The corresponding statements to the reachable nodes form the slice.