...collaborate on

Chopachops Report

This page is under construction...

Introdution

ChopaChops is a project for slicing and chopping in program graphs. Starting from the Java program source code, this tool can generate graphs with relation information.

Objectives

Work already done - PackageGraphs

On the moment I took the project, much work was already done. ChopaChops could already do things like:

  • Java parsing to an haskell abstract syntax tree
  • Creation of Package Graphs, which contains class-based relations like:
    • Imports
    • Inheritance
    • Implementation
    • Nesting
  • Visualization of these relations in a graph
  • Metrics on graphs
  • Implementation of slicing and chopping on the graphs

My Extension - Call Graphs

Starting from the work done, I extended the libraries, adding some method-based relations:

  • Method invocation
  • Method nesting in classes

Call Graphs in haskell

-- | Call Graphs are labeled relations
type CallGraph
  = LRel CGNode CGNode CGEdgeType

-- | A node may be either a Class or a Method
data CGNode = CGClass ClassName
            | CGMethod  ClassName MethodName [ParameterType]
...
-- | Function to create a CallGraph for an AST
java2ccg :: (Term a, MonadPlus m) 
           => CGNode                     -- Current node  
           -> Declarations               -- Declarations context
           -> a                                -- Term to convert to Call Graph
           -> m CallGraph

-- | Function to convert a Call Graph to dot format, ready to feed the GraphViz tool
cg2dot :: String -> CallGraph -> String

Declarations Environment

I provide a basic API for Declarations manipulation

Here is an extract of it:

emptyDec :: Declarations
appendDec :: Declarations -> Declarations -> Declarations
addGlobalDec :: Declarations -> (ClassName, MemberName) -> TypeName -> Declarations
...
-- | General funcion for getting a variable's/member's type
getType :: (MonadPlus m) => Declarations -> ClassName -> MemberName -> m TypeName

-- | Generic function to collect global variable declarations, providing the AST
collectMembers :: (Term a, MonadPlus m) => ClassName -> a -> m Declarations

Type Inference System

To determine which classes were getting method invocations, it was necessary to buid a type inference system. To accomplish that task I used strafunsky to do generic AST traversals. So, I came up wit a function called findTypeOf which has the flollowing type signature:

findTypeOf :: (Term a, MonadPlus m) => Declarations -> ClassName -> a -> m TypeName

This function (tries) to find out the type of any entity, provided it is an instance of Term. We have to provide the environment (Declarations) and the class name on wich we are trying to find the type of an entity.

The Tool - ChopaChopsOnline

ChopaChopsOnline is a tool, developed with WASH, wich interfaces the developed librarires with the user. Basicaly, it is a web , wich can be run from a Web Server. The user, with this tool, can perform operations like:

  • Upload zip archives, containing Java source files (all other filetypes are simply discarded)
  • Visualize both Package and Call Graphs
  • Visualize some graph metrics such as:
    • Tree impurity
    • Level count (strongly connected components)
    • Non singleton levels
    • Size of the largest level
    • ...

  • Perform slicing and chopping on these graphs (Package and Call graphs), given the sources and sinks sets

Web interface:
Web interface

Chopping:
Chpping

Example

  • Class Foo:
    Code foo

  • Class Bar:
    Code bar

  • Callgraph:
    Callgraph

Future Work

Although much progress has been done regarding program slicing, I must state that this project is far from being a complete approach to Java Program Slicing.

So, there is still much work to do in the future, to extend this tool. I will enumerate some ways to evolve, although there may be others:

  • Extend the type inference system to support more types
  • Compute more graph metrics
  • Continue to move to lower level relations:
    • Data flow
    • Control

Problems

  • Hard to understand big graphs (real world java programs)
  • Type inference system not fully implemented
  • Not working with compiled classes
  • Does not handle some java features
    • Inheritance / Implementation
    • Static methods
    • Exception handling

Conclusion

  • Nice progresses towards full program slicing in Java
  • At the moment there is no support for many Java features
  • Easy to extend
  • Part of the UMinho Haskell Library
    • ChopaChopsOnline (tools)
    • CallGraph?
  • Much work to be done in the future...

r7 - 04 Mar 2005 - 19:36:39 - PatrickMachado?
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
Syndicate this site RSSATOM