240 likes | 323 Views
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. Overview. Background Global Variables Identifying Globals
E N D
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
Overview • Background • Global Variables • Identifying Globals • Annotating Globals • Re-engineering Globals • ASIS • Conclusions
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
Overview • Background • Global Variables • Identifying Globals • Annotating Globals • Re-engineering Globals • ASIS • Conclusions
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;
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
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
Overview • Background • Global Variables • Identifying Globals • Annotating Globals • Re-engineering Globals • ASIS • Conclusions
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; Y is local A is a parameter
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; X is global B is a parameter
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; Symbol Table
Overview • Background • Global Variables • Identifying Globals • Annotating Globals • Re-engineering Globals • ASIS • Conclusions
Annotating Global Variables • One option in our tool is to add SPARK annotation --# global <mode> <variable name>; 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 • To determine mode of global, look at DEF and REF 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; REF set: { B, X } DEF set: { B, X }
Overview • Background • Global Variables • Identifying Globals • Annotating Globals • Re-engineering Globals • ASIS • Conclusions
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...
Re-engineering Global Variables 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; Add as formal Add as actual
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...
Re-engineering Global Variables 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; Y is a global
Re-engineering Global Variables 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; Need Y here Y is a global
Re-engineering Global Variables 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; Add Y as formal Add Y as formal Add Y as actual Add Y as actual
Overview • Background • Global Variables • Identifying Globals • Annotating Globals • Re-engineering Globals • ASIS • Conclusions
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
Conclusions • Need to develop a graphical user interface • Target re-engineering efforts • Also automatic refactoring applications