29
Cross Translational Unit Analysis in Clang Static Analyzer: Prototype and Measurements Gabor Horvath (xazax 1 ), Peter Szecsi (ps95 1 ), Zoltan Gera (gerazo 1 ) Daniel Krupp (daniel.krupp 2 ), Zoltan Porkolab (zoltan.porkolab 2 ) [1] @caesar.elte.hu [2] @ericsson.com

Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

Cross Translational Unit Analysis in Clang Static Analyzer:

Prototype and Measurements Gabor Horvath (xazax1), Peter Szecsi (ps951), Zoltan Gera (gerazo1)

Daniel Krupp (daniel.krupp2), Zoltan Porkolab (zoltan.porkolab2)

[1] @caesar.elte.hu[2] @ericsson.com

Page 2: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

2

Outline

● Motivation

● Overview of the Cross Translation Unit Analysis architecture

● Evaluation on open source projects

● Findings● Performance

● Design questions

● How to organize CTU related code● What to reanalyze, how to scale

● Future work

Page 3: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

3

● Find bugs without running the code

● Exploded Graph

Clang Static Analyzer – Symbolic Execution

void test(int b) { int a,c; switch (b){ case 1: a = b / 0; break; case 4: c = b - 4; a = b / c; break; }}

b: $b

b: $b b: $b b: $b

b: $b b: $bc: 0

b: $bc: 0

switch(b)

default case 4case 1

$b=[1,1]

a = b/0;

$b=[4,4]

c = b-4;

$b=[4,4]

a = b/c;

Page 4: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

4

Motivation

void neg(int *x);void g(int *x) { if (*x > 0) neg(x); if (*x > 0) *x / 0; neg(NULL);}

void neg(int *x) { *x = -(*x);}

A.cpp B.cpp

*x is positive

*x is unknown

API misuse

● We saw useful CTU results reported by closed source analysis tools

● Can we achieve the same using Clang SA?

False positive

Page 5: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

5

High Level Architecture

CTUBuild

AnalyzerAnalysis Results(PLISTS)

Global Call

Graph

Function Definiton

Index

AST dumps

2nd Pass1st Pass

Source Code & JSON Compilation Database

Page 6: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

6

Evaluation

● Open source C projects:● OpenSSL, Curl, Vim, Memcached, ffmpeg,

PostgreSQL, ...● Full details at: http://cc.inf.elte.hu● Improvements needed for C++ support

● Metrics:● Number of new bugs reported● Number of lost bug reports● Quality of new bug reports● Analysis time● Peak memory usage (per process)

Page 7: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

7

Page 8: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

8

Page 9: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

9

Page 10: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

10

Evaluation – Bug Reports

● 2.4X average, 2.1X median, 5X peak

Curl FFMPEG Memcached TMUX VIM0

100

200

300

400

500

600

BaselineCTULost

Page 11: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

11

Bug Path Length of Bug Reports

● The reason for false positives was never the CTU

ffmpeg Curl Memchached Vim0

2

4

6

8

10

12

14

16

18

20

Baseline medianCTU medianNew reports’ median

Page 12: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

12

FFMPEG - Quality of New Bug Reports

● True positive example: http://cc.inf.elte.hu:8080/#baseline=177&newcheck=178&report=17539

● One Definition Rule violation found

core.CallAndMessagecore.DivideZerocore.NonNullParamCheckercore.NullDereferencecore.UndefinedBinaryOpera-torResultcore.uninitialized.Assigncore.uninitialized.Branchunix.Malloc

Page 13: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

13

Page 14: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

14

Page 15: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

15

Same bug multiple times?

void neg(int *x);void g(int *x) { ... neg(NULL); ...}void h(int *x) { ... neg(NULL); ...}

void neg(int *x) { *x = -(*x);}

A.cpp B.cpp

Page 16: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

16

Evaluation – Analysis time

● 2.5X average, 2.1X median, 6.4X peak

Curl

ffmpe

g

Mem

cach

ed

NGIN

X

Open

SSL

Postgre

SQL

Redis

Tiny

XML2

tmux

Vim

0 s

100 s

200 s

300 s

400 s

500 s

600 s

700 s

800 s

900 s

1000 s

BaselineCTU

Page 17: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

17

Evaluation - Memory

● 2.3X average, 2.3X median, 5.5X peak

● AST dumps consume disk space temporarily● ~40GB for LLVM

Curl

ffmpe

g

Mem

cach

ed

NGIN

X

Ope

nSSL

Postgre

SQL

Redis

Tiny

XML2

tmux

Vim

0 MB

100 MB

200 MB

300 MB

400 MB

500 MB

600 MB

700 MB

BaselineCTU

Page 18: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

18

Current Implementation

● Artem Dergachev, Aleksei Sidorin, et al.● Prototype: both for naive CTU and summary based

interprocedural analysis, based on Clang 3.4● http://lists.llvm.org/pipermail/cfe-dev/2015-October/

045730.html● Improved version contributed by Ericsson, only

contains the CTU part, ready for review● https://reviews.llvm.org/D30691● Patch is relatively small, CTU off by default● No changes required to checker

implementations

Page 19: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

19

Order of the Analysis of Functions

A.cpp B.cppvoid f(int x);void g(int x) { f(x);}void h(int x) { g(x);}

void i(int x) {}void f(int x) { i(x);}

h() g() f() i()

f() i()

Page 20: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

20

Incrementality

void f(int *x);void g(int *x) { f(NULL);}

void f(int *x) { *x = -(*x);}

A.cpp B.cpp

Page 21: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

21

Incrementality

void f(int *x);void g(int *x) { f(NULL);}

void f(int *x) { *x = -(*x); if (x == 0) return;}

A.cpp B.cpp

● We need to reanalyze A.cpp too

Page 22: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

22

AST Importer

● Import (merge) one AST into another

● Can import one function/type a time

● Caches the results to avoid multiple imports

● Used by LLDB

● Not a mature component of Clang yet

Page 23: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

23

AST Importer

● Issues with importing source locations from macros

● Suboptimal results for C++ projects● We concentrated on C projects● Fixed C related bugs in the importer

● The analysis can find AST Importer bugs● Running analysis on the imported AST can trigger

asserts● Found invariant violations on imported AST that

otherwise very challenging to write a test for

Page 24: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

24

Coverage● Increased for some files

● Functions evaluated in more contexts● Decreased for others

● Analysis budget runs out due to DFS● Prune more infeasible paths● More issues reported implies stops

● Small overall decrease

void external(int x);void g(int x) { external(x); x / 0;}

()

0

/

x

Page 25: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

25

Coverage● Increased for some files

● Functions evaluated in more contexts● Decreased for others

● Analysis budget runs out due to DFS● Prune more infeasible paths● More issues reported implies stops

● Small overall decrease

void external(int x);void g(int x) { external(x); x / 0;}

Might exhaust budget

()

Page 26: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

26

Getting Started

● Run CTU on your project if interested in additional results

● Run both CTU and non-CTU to get maximal coverage

● Give us feedback about the quality of reports● Analysis errors● True positives● False positives

● CodeChecker supports viewing CTU results!● https://github.com/Ericsson/codechecker

Page 27: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

27

Future Work

● Extend the C++ support of ASTImporter

● New strategies to build an exploded graph with good shape?

● Tune default budget for CTU

● Incremental CTU analysis

● Make the binary AST dumps smaller

● Grouping of bug paths in viewers (CodeChecker, XCode, ...)

Page 28: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

28

Summary

● Improved the CTU prototype

● Evaluated the results on open source projects● CTU found many new potential bugs● Analysis time scales well with CPUs● Bug/time, bug/memory ratio is good● Coverage, quality of reports satisfying

● Works well for C programs

● Improvements needed for C++

● Prepared a patch for upstreaming

Page 29: Cross Translational Unit Analysis in Clang Static …llvm.org/devmtg/2017-03/assets/slides/cross_translation...Cross Translational Unit Analysis in Clang Static Analyzer: Prototype

29

Thank you! Questions?