Presentation is loading. Please wait.

Presentation is loading. Please wait.

AdaSlicer: An Ada Program Slicer Ricky E. Sward Department of Computer Science USAF Academy, CO A.T. Chamillard Computer Science.

Similar presentations


Presentation on theme: "AdaSlicer: An Ada Program Slicer Ricky E. Sward Department of Computer Science USAF Academy, CO A.T. Chamillard Computer Science."— Presentation transcript:

1 AdaSlicer: An Ada Program Slicer Ricky E. Sward Department of Computer Science USAF Academy, CO ricky.sward@usafa.edu A.T. Chamillard Computer Science Department University of Colorado Spring, CO chamillard@cs.uccs.edu

2 Overview Background Global Variables Identifying Globals Annotating Globals Re-engineering Globals ASIS Conclusions

3 Background Identifying global variables is well-defined Discussed in programming language texts Tools available to identify global variables Useful to identify during re-engineering In SPARK, globals are allowed, must annotate Goal is to convert to parameters

4 Overview Background Global Variables Identifying Globals Annotating Globals Re-engineering Globals ASIS Conclusions

5 Global Variables In Ada, each variable must be declared Scope defines where a variable is visible A and B are local variables procedure Local is A : Integer := 0; B : Integer := 3; begin A := B * 2; end Local;

6 Global Variables A non-local variable is defined outside scope A global variable is non-local and also visible to entire program procedure Outer_Procedure is A : Integer := 0; procedure Inner_Procedure is B : Integer := 1; begin A := A + B; end Inner_Procedure; begin A := A + 1; end Outer_Procedure; A is global

7 Global Variables A package variable is in package global scope A package variable is a “good” global package One_Global is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global is procedure Outera (A : in out Integer) is begin X := X + 1; end Outera; end One_Global; Package var X

8 Overview Background Global Variables Identifying Globals Annotating Globals Re-engineering Globals ASIS Conclusions

9 Identifying Global Variables package One_Global is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global is procedure Outera (A : in out Integer) is Y : Integer := 0; procedure Innerb (B : in out Integer) is begin B := X; X := X + 1; end Innerb; begin Y := A; Innerb(A); end Outera; end One_Global; A is a parameter Y is local Using static analysis consider the scope of variables Ignore local variables and parameters

10 Identifying Global Variables Using static analysis consider the scope of variables Ignore local variables and parameters package One_Global is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global is procedure Outera (A : in out Integer) is Y : Integer := 0; procedure Innerb (B : in out Integer) is begin B := X; X := X + 1; end Innerb; begin Y := A; Innerb(A); end Outera; end One_Global; B is a parameter X is global

11 Identifying Global Variables Access declaration information in symbol table Ok if package variable and procedure in outer scope package One_Global is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global is procedure Outera (A : in out Integer) is Y : Integer := 0; procedure Innerb (B : in out Integer) is begin B := X; X := X + 1; end Innerb; begin Y := A; Innerb(A); end Outera; end One_Global; VariableScopeNesting YOutera1 XOne_Global0... Symbol Table

12 Overview Background Global Variables Identifying Globals Annotating Globals Re-engineering Globals ASIS Conclusions

13 Annotating Global Variables One option in our tool is to add SPARK annotation --# global ; package One_Global is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global is procedure Outera (A : in out Integer) is Y : Integer := 0; procedure Innerb (B : in out Integer) is --# global in out X; begin B := X; X := X + 1; end Innerb; begin Y := A; Innerb(A); end Outera; end One_Global;

14 package One_Global is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global is procedure Outera (A : in out Integer) is Y : Integer := 0; procedure Innerb (B : in out Integer) is --# global in out X; begin B := X; X := X + 1; end Innerb; begin Y := A; Innerb(A); end Outera; end One_Global; Annotating Global Variables REF set: { B, X } DEF set: { B, X } To determine mode of global, look at DEF and REF

15 Overview Background Global Variables Identifying Globals Annotating Globals Re-engineering Globals ASIS Conclusions

16 Re-engineering Global Variables Add global as formal parameter Add global as actual parameter in call Use the global definition of the variable to build the parameter Use the DEF and REF set to build the mode –Appears only in REF, build as “in” parameter –Appears only in DEF, build as “out” parameter –Appears in both DEF and REF, build as “in out” using conservative approach For example...

17 package One_Global_New is X : Integer := 10; procedure Outera (A : in out Integer); end One_Global; package body One_Global_New is procedure Outera (A : in out Integer) is Y : Integer := 0; procedure Innerb ( B : in out Integer; X : in out Integer ) is begin B := X; X := X + 1; end Innerb; begin Y := A; Innerb(B => A, X => X); end Outera; end One_Global_New; Re-engineering Global Variables Add as formal Add as actual

18 Re-engineering Global Variables What if a global is nested deeper? May need to change two or more procedures Add global as formal parameter Add global as actual parameter Check to see if actual is global For example...

19 package body Two_Globals is procedure Outera ( A : in out Integer ) is procedure Innerb ( B : in out Integer ) is procedure Innerc ( C : in out Integer ) is begin C := Y; Y := Y + 1; end Innerc; begin B := B + 1; Innerc(C => B); end Innerb; begin Innerb(B => A); end Outera; end Two_Globals; Re-engineering Global Variables Y is a global

20 package body Two_Globals_new is procedure Outera ( A : in out Integer ) is procedure Innerb ( B : in out Integer) is procedure Innerc ( C : in out Integer; Y : in out Integer ) is begin C := Y; Y := Y + 1; end Innerc; begin B := B + 1; Innerc(C => B, Y => Y); end Innerb; begin Innerb(B => A); end Outera; end Two_Globals_new; Re-engineering Global Variables Y is a global Need Y here

21 package body Two_Globals_new is procedure Outera ( A : in out Integer ) is procedure Innerb ( B : in out Integer; Y : in out Integer) is procedure Innerc ( C : in out Integer; Y : in out Integer ) is begin C := Y; Y := Y + 1; end Innerc; begin B := B + 1; Innerc(C => B, Y => Y); end Innerb; begin Innerb(B => A, Y => Y); end Outera; end Two_Globals_new; Re-engineering Global Variables Add Y as formal Add Y as actual Add Y as formal Add Y as actual

22 Overview Background Global Variables Identifying Globals Annotating Globals Re-engineering Globals ASIS Conclusions

23 Ada Semantic Interface Specification (ASIS) Procedures for accessing Ada program structure Used ASIS 3.15a1 & GNAT Ada Compiler 3.15a1 Reasonable learning curve Examples provided with ASIS are great Very powerful tool

24 Conclusions Need to develop a graphical user interface Target re-engineering efforts Also automatic refactoring applications


Download ppt "AdaSlicer: An Ada Program Slicer Ricky E. Sward Department of Computer Science USAF Academy, CO A.T. Chamillard Computer Science."

Similar presentations


Ads by Google