32
Crystal-izing Sophisticated Code Analyses Ciera Jaspan Kevin Bierhoff http://code.google.com/p/ crystalsaf

Crystal-izing Sophisticated Code Analyses

  • Upload
    laird

  • View
    26

  • Download
    0

Embed Size (px)

DESCRIPTION

Crystal-izing Sophisticated Code Analyses. Ciera Jaspan Kevin Bierhoff http://code.google.com/p/crystalsaf. Crystal. What is crystal, intro slide. This tutorial. Install Crystal Register an analysis Create a simple AST walker for nullness Add a simple flow analysis Add annotations - PowerPoint PPT Presentation

Citation preview

Page 1: Crystal-izing Sophisticated Code Analyses

Crystal-izing SophisticatedCode Analyses

Ciera JaspanKevin Bierhoff

http://code.google.com/p/crystalsaf

Page 2: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Crystal

•What is crystal, intro slide

Page 3: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

This tutorial

• Install Crystal• Register an analysis• Create a simple AST walker for nullness• Add a simple flow analysis• Add annotations• Add branch-sensitivity

• We’ll provide sample analyses and sample assignments for classes• For more information, visit our wiki

Page 4: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Installation

• Pre-requisites• Eclipse with• Java Development Tools (JDT)• Plugin Development Environment (PDE)

• Crystal• Available from our Eclipse update site• http://crystalsaf.googlecode.com/svn/trunk/EclipseUpdate/

• The USB drive contains:• A version of Eclipse with Crystal already

installed• Sample code for several null pointer analyses• Sample test code to run the null analysis on

Page 5: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Crystal in the classroom

•Crystal is used in a professional masters program in software engineering• Course: Analysis of Software Artifacts• Students: Real-world experience, may not have

(or want!) a theoretical background• How can program analysis be used in industry,

now and in the near future?

• Students should• Know what can affect the usability and

precision of a static analysis• Understand what kind of problems static

analysis can solve

Page 6: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Crystal in research

•High transferability from paper to code made Crystal natural for the research students•Currently 4 research analyses written in Crystal• 3 are published

•Allows incremental development to more sophisticated features• Annotations with custom parsers• Branch-sensitivity• Automated testing• Unusual lattice operations

Page 7: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

An incremental approach

• Students typically answer questions on paper first• We’ll note questions we can ask students in red!

• Then, students transfer that knowledge directly to code• We’ll note how to code the answer in blue!

•Use an incremental approach• Instructions on the wiki with verification points• Today, everyone gets through the first three steps

(make a very dumb analysis)• A little faster for the last three (make a smarter

flow analysis)

• You can follow along with the code samples

Page 8: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Everything installed right?

•Crystal menu is where analyses appear• Several built-in ones already available

Page 9: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Register and Run

•Create a new plugin project• Make it depend on Crystal and JDT

• Implement ICrystalAnalysis•Register with the extension-point CrystalAnalysis in the plugin.xml file

• Select Run -> Run Configuration…•Make a new Eclipse configuration•Run! Your analysis name should appear in the Crystal menu.

Page 10: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Relevant packages

• edu.cmu.cs.crystal• Core package for analyses

• org.eclipse.jdt.core.dom• The Eclipse AST

• edu.cmu.cs.crystal.simple• Simple interfaces for flow analyses

• edu.cmu.cs.crystal.tac.model• The interfaces for three address code instructions

• edu.cmu.cs.crystal.annotations• For using annotations

• edu.cmu.cs.crystal.flow• Advanced interfaces for flow analyses

Page 11: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Use an AST walker

•We’re ready to make an analysis now.•What kinds of expressions do we want to check for an null pointer analysis?• Method calls• Field access• Array access

• In analyze method, create an ASTVisitor that gives an error when it encounters these operations.

Page 12: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Everything running?

•Create a new project in the child Eclipse•Add code to analyze• Test with Crystal->MyAnalysis

•Can also run automated tests in JUnit• Will not cover that today• See wiki for more information

Page 13: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Dataflow concepts: review

• Lattice• A finite lattice of the abstract states the program can be

in

• Lattice Element• A single state in the lattice

• Abstraction function• How we translate the concrete state to the abstract state

• Control flow graph• The order of control flow through the nodes of the AST

• Transfer functions• How the states change as the analysis encounters new

program instructions

• Worklist algorithm• Traverses the control flow graph and runs the transfer

functions

Page 14: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Dataflow concepts: review

• Lattice• A finite lattice of the abstract states the program can be

in

• Lattice Element• A single state in the lattice

• Abstraction function• How we translate the concrete state to the abstract state

• Control flow graph• The order of control flow through the nodes of the AST

• Transfer functions• How the states change as the analysis encounters new

program instructions

• Worklist algorithm• Traverses the control flow graph and runs the transfer

functions

Crystal framework handles this

Crystal framework handles this

Page 15: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Lattice review

•Must have finite height to ensure termination• Top of lattice represents least precise info•Bottom of lattice represents an unanalyzed element•Unique least upper bound must exist for any two elements

a b

Page 16: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Transfer function review

•Given• An instruction• An incoming lattice element

• Produce• An outgoing lattice element ’

• (instr, ) = ’•Make a different transfer function on each type of instruction

Page 17: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

• Tuple Lattice: A lattice which maps a key to an element in another lattice• Map all variables to

an element in the lattice below

A simple null analysis

• (x = null, ) =[xNULL]

• (x = y, ) =[x(y)]

• (x = new C(), ) =[xNOT_NULL]

• (x = new C[n], ) =[xNOT_NULL]

• (x = y.m(z1,…,zn), ) =

[yNOT_NULL]

MAYBE_NULL

NOT_NULL NULL

Page 18: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

The lattice

•What are the elements in the lattice?• Null, not null, maybe null, and bottom

•Create a type which represents the elements• This is likely an immutable type, like an enum

• Tuple Lattices• We will use TupleLatticeElement• Just create the type which represents the sub-

lattice

Page 19: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

The lattice

•What is the bottommost element? The topmost?•What is the ordering of elements?•What does the join operation look like?

• Implement SimpleLatticeOperations• LE bottom()• boolean atLeastAsPrecise(LE, LE)• LE join(LE, LE)• LE copy(LE)

Page 20: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Setting up the flow analysis

•What is the lattice element at the start of the method?• Everything may be null (except this is not null)

• If using a tuple lattice, what is the default?• Maybe null

•Extend AbstractingTransferFunction• Implement createEntryValue() and

getLatticeOperations()• (Don’t override the transfer functions yet)

Page 21: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Transfer functions

•Which instructions cause the lattice element to change? How do they change the lattice element?• Null assignment: makes target null• Constructor: makes target non-null • Copying assignment: makes target same as

right side

• In the derived transfer function, override the relevant instructions

Page 22: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Why Three Address Code

•Does mean students work with both Eclipse AST and TAC•However• TAC has no sub-expressions• TAC has many fewer kinds of nodes

• Students able to understand TAC as it matched what they wrote down on paper

Page 23: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Let’s make it better!

•Annotations• Teaches students the power of specifications

•Branch-sensitivity• Teaches students how different levels of

abstraction can change precision

Page 24: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Annotations

•What specifications could we add to make the analysis more precise?• Non-null on method parameters

•Create a Java annotation• Put it in a jar separate from your analysis• Make it available to the code being analyzed

Page 25: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Annotations

•What transfer functions can use this annotation to improve precision?• Initial lattice information• Method call instruction

•Use the AnnotationDatabase• Pass in an AnnotationDatabase to the

transfer functions• Query it to find instances of the @NotNull

annotation

Page 26: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Annotations

•Where can the visitor use annotations for additional checking?• Method call instruction• Assignment to a parameter

•Use the AnnotationDatabase• Query it to find instances of the @NotNull

annotation

Page 27: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Branch-sensitivity

• Take advantage of knowledge gained through tests• Specify different exit paths

through a method• An invariant that doesn’t hold

on exceptional exit

• Labeled branches let us distinguish these• Must return different lattice elements for each label

if (x != null) {

//hey, it’s safe

//to use x in here!

}

else {

//but it’s an

//error in here!

}

Page 28: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

On paper…

• No branch sensitivity(x == y, ) =

• Branch sensitivityT(x == y, ) =

if ((x) != MAYBE_NULL )[y(x)]

else if ((y) != MAYBE_NULL )[x(y)]

else

• Separate definition for the false branch F(x == y, )

Page 29: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Types of labels

• True/false• All conditionals (if, while, ?:, etc.)• Methods calls that return a boolean• Binary relational operators (&&, <, ==, etc.)

•Exceptional• Methods calls that throw exceptions• Throw statements• Catch and Finally statements

• Switch (used on switch)• Iterator (used on enhanced for)•Normal

Page 30: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Changing to branch-sensitive analyses

• Implement ITACBranchSensitiveTransferFunction• Change signatures on transfer functions

• Wrap return lattice in an IResult

• At this point, transfer functions run as they did before

LE transfer(TACInstruction instr, LE value)

IResult<LE> transfer(TACInstruction instr,

List<ILabel> labels, LE value)

return value;

return SingleLabeledResult.createResult(labels, value);

Page 31: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Using the branches

•Which instructions can provide different information on each branch?• x == y• x != y

•Create a new LabeledResult with the labels and a default value• Copy the lattice element for each branch• Change the lattice elements• Put them into the labeled result with the right

label

Page 32: Crystal-izing Sophisticated Code Analyses

http://code.google.com/p/crystalsaf

Crystal Static Analysis Framework

•What is crystal, exit slide