Download presentation
Presentation is loading. Please wait.
Published byAdrian Boone Modified over 8 years ago
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.