Idea of Data Flow Analysis
We introduce the ide of data-flow analysis
- a form of semantic analysis
Why it is useful
Automatically derive information about the program
Use this information for:
- correctness checks (initialization, correct order of operations, absence of errors)
- safely enabling optimizations
Type Checking versus Data-Flow Analysis
We have seen one kind of semantic analysis - type checking
- points out type errors, wrong operand application
Example of code fragments
var y : Boolean var x : Int
x = 0 y = x + 1
another example:
var x : Int var y : Int
x = 0 y = x + 1
What was rule for type checking a sequence of statements?
Note how type checking rules ignore order of statements
- Permute the statements - same environment, same type checking result
- This type of analysis is called flow insensitive
Consider now a different problem: variable initialization
- ensure that each local variable is initialized before its first use
Compare this method body:
public void f() {
int x, y;
x = 0;
y = x + 1;
}
public void g() {
int x, y;
y = x + 1;
x = 0;
}
Test.java:9: variable x might not have been initialized
y = x + 1;
^
Variable initialization is flow sensitive data-flow analysis
- depends on the order of operations
Data-flow analysis is a good framework for checking such flow-sensitive properties
Control-Flow Graphs
Syntax trees are not best medium for analysis
- evaluation order not obvious from tree
- many kinds of statements - many cases to handle in analysis
Bytecode or machine code:
- specific for architecture
- many kinds of instructions
- useful information on e.g. types is lost
We therefore introduce control-flow graph representation
- good for analysis
- also good for code generation
Example program:
int i = n;
while (i > 1) {
System.out.println(i);
if (i % 2 == 0) {
i = i / 2;
} else {
i = 3*i + 1;
}
}
What is its control-flow graph?
How can we interpret control-flow graph?
- running it with e.g. n=3
Running the program “abstractly”
- show that x=0;y=x+1 initialized
Abstractly Interepreting the example CFG