Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Using Clang to Visualize Large Codebases
Nathan Hawes and Ben Barham Oracle Labs Australia October 2014
Frappé: a code comprehension tool for large codebases
1
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Safe Harbour The following is intended to provide some insight into a line of research in Oracle Labs. It is intended for informaMon purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or funcMonality, and should not be relied upon in making purchasing decisions. Oracle reserves the right to alter its development plans and pracMces at any Mme, and the development, release, and Mming of any features or funcMonality described in connecMon with any Oracle product or service remains at the sole discreMon of Oracle. Any views expressed in this presentaMon are my own and do not necessarily reflect the views of Oracle.
Frappé: a code comprehension tool for large codebases 2
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Code Comprehension The truth is in the source!
Frappé: a code comprehension tool for large codebases 3
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
But what if that source is large?
Frappé: a code comprehension tool for large codebases 4
10 million lines
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
But what if that source is large?
Frappé: a code comprehension tool for large codebases 5
10 million lines
50 lines
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
But what if that source is large?
Frappé: a code comprehension tool for large codebases 6
10 million lines
50 lines
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Code Comprehension in IDEs
• Go to definiMon, find uses, class overview, type hierarchy, etc.
• IDEs impracMcal to use for large C/C++ codebases – Imprecise language recogniMon – Issues with custom build systems
Frappé: a code comprehension tool for large codebases 7
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
static VALUE mnew(…) { … data-‐>id = rid; … }
Find definiMon method.h:70
node.h:244 thread_pthread.c:594 (+ 17 more)
Actual definiMon (14th) proc.c:21
Current PracMce For large C/C++ codebases
• Text editors and text-‐search tools – vim, emacs – grep, sed, cscope
• Fast and simple • But imprecise à – Symbol types, scopes, linking informaMon, preprocessor
• Low-‐level focus
Frappé: a code comprehension tool for large codebases 8
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Aims
• Provide precise dependency informaMon – With easy build integraMon
• Allow users to specify higher-‐level queries directly – Not just defs or refs
• Show users the broader context of the system
Frappé: a code comprehension tool for large codebases 9
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Overview
Oracle ConfidenMal -‐ Restricted 10
Source Code Dependency Graph User
QUERY
DISPLAY EXTRACT
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Dependency Graph
• Natural representaMon of the code – Call graphs, type hierarchies, control flow graphs, etc.
• Nodes and edges – Build system: modules, files, and linking informaMon between them – File system: directories and files – Preprocessor: includes, macros, their expansion and interrogaMons – Symbols: funcMons, locals, types, and relaMons between them
• High-‐level quesMons become graph queries
Oracle ConfidenMal -‐ Restricted 11
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 12
Go to DefiniMon
scope{} .buf main()
foo() bar()
writes contains
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 13
Go to DefiniMon
scope{} .buf main()
foo() bar()
writes contains
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 14
Go to DefiniMon
scope{} .buf main()
foo() bar()
writes contains
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 15
Find References
scope{} .buf main()
foo() bar()
writes contains
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 16
Find References
scope{} .buf main()
foo() bar()
writes contains
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 17
Find References
scope{} .buf main()
foo() bar()
writes contains
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 18
Impact EsMmaMon
first() pop() insert()
#PREV #FIRST expands
init()
#NULL
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 19
Impact EsMmaMon
first() pop() insert()
#PREV #FIRST expands
init()
#NULL
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 20
Impact EsMmaMon
first() pop() insert()
#PREV #FIRST expands
init()
#NULL
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Oracle ConfidenMal -‐ Restricted 21
Impact EsMmaMon
first() pop() insert()
#PREV #FIRST expands
init()
#NULL
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Architecture
Oracle ConfidenMal -‐ Restricted 22
EXTRACTOR IMPORTER
EDITOR PLUGINS
CLI SCRIPTS
WEB UI
Source Code .fo Server User
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Architecture
Oracle ConfidenMal -‐ Restricted 23
EXTRACTOR IMPORTER
EDITOR PLUGINS
CLI SCRIPTS
WEB UI
Source Code .fo Server User
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Extractor Simple Build IntegraLon
Frappé: a code comprehension tool for large codebases 24
Compiler Wrappers
NaMve Compiler
Clang + Plugin .fo
.o
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Extractor Simple Build IntegraLon
Frappé: a code comprehension tool for large codebases 25
Compiler Wrappers
NaMve Compiler
Clang + Plugin .fo
.o
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Extractor Simple Build IntegraLon
Frappé: a code comprehension tool for large codebases 26
Compiler Wrappers
NaMve Compiler
Clang + Plugin .fo
.o
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Extractor Clang Plugin
• PPCallbacks – Includes, macros, their expansions and interrogaMons
• RecursiveASTVisitor – Visit all declaraMons, types, and expressions
• Easy to use interface – Provides detailed locaMon informaMon
Frappé: a code comprehension tool for large codebases 27
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Architecture
Oracle ConfidenMal -‐ Restricted 28
EXTRACTOR IMPORTER
EDITOR PLUGINS
CLI SCRIPTS
WEB UI
Source Code .fo Server User
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Architecture
Oracle ConfidenMal -‐ Restricted 29
EXTRACTOR IMPORTER
EDITOR PLUGINS
CLI SCRIPTS
WEB UI
Source Code .fo Server User
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Architecture
Oracle ConfidenMal -‐ Restricted 30
EXTRACTOR IMPORTER
EDITOR PLUGINS
CLI SCRIPTS
WEB UI
Source Code .fo Server User
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Frappé Architecture
Oracle ConfidenMal -‐ Restricted 31
EXTRACTOR IMPORTER
EDITOR PLUGINS
CLI SCRIPTS
WEB UI
Source Code .fo Server User
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Code Maps Visualising large codebases
Frappé: a code comprehension tool for large codebases 32
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Code Maps Using a cartographic map metaphor
• ConMnent/country/state/city à module/sub-‐module/file/funcMon • DisMncMve shape and posiMons serve as landmarks • Can overlay a variety of informaMon
Frappé: a code comprehension tool for large codebases 33
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Overlay Search Results
Visual filtering Contextual search
Frappé: a code comprehension tool for large codebases 34
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Overlay Paths
Path in stack trace Path on map
Frappé: a code comprehension tool for large codebases 35
java.lang.RuntimeException: bad at Foobar.setup(Foobar.java:74) at Foobar.launch(Foobar.java:43) at Bar.launch(Bar.java:39) at Bar.bar(Bar.java:97) at Foo.foo(Foo.java:35) at Main.main(Main.java:104)
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Overlay Metrics
Fine granularity Coarse granularity
Frappé: a code comprehension tool for large codebases 36
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
But how?
Frappé: a code comprehension tool for large codebases 37
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
ExisMng Approaches
Deline, R. Staying oriented with soOware terrain maps In proc. of the workshop of visual languages and computaMon, 2005
Kuhn, A.; Erni, D.; Loretan, P.; Nierstrasz, O. SoOware cartography: themaLc soOware visualizaLon with consistent layout Journal of Sopware Maintenance and EvoluMon, 2010
Frappé: a code comprehension tool for large codebases 38
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Input • AbstracMon hierarchy – Abstracts files into higher level groupings – Use directory structure by default
• Dependency graph – Represents dependencies between files as a weighted edge – Use references
Frappé: a code comprehension tool for large codebases 39
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Map GeneraMon
Graph layout
Frappé: a code comprehension tool for large codebases 40
Implicit surface generaMon Surface subdivision Recursive subdivision
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Map GeneraMon
Frappé: a code comprehension tool for large codebases 41
Recursive subdivision Nocaj, A. & Brandes, U. CompuLng Voronoi Treemaps: Faster, Simpler,
and ResoluLon-‐independent Computer Graphics Forum, Blackwell Publishing Ltd, 2012, 31, 855-‐864
Graph layout Noack, A. & Lewerentz, C. A space of layout styles for hierarchical graph models of soOware systems Proceedings of the 2005 ACM symposium on Sopware visualizaMon, ACM, 2005, 155-‐164
Implicit surface generaMon
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
DemonstraMon Linux
Frappé: a code comprehension tool for large codebases 42
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Future Work • More detailed dependency graph – Find calls where third argument is macro FLAG – Find all funcMons the pointer fptr could point to
• More overlays – Test coverage, profiling data
• Store mulMple versions – Impact esMmaMon – Code map evoluMon (stability)
Frappé: a code comprehension tool for large codebases 43
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Nathan Hawes and Ben Barham [email protected] [email protected] Oracle Labs Australia hsp://labs.oracle.com/locaMons/australia Research Director [email protected]
Frappé: a code comprehension tool for large codebases
44