Facebook London
Jules Villard <jul@fb.com>
Finding Inter-procedural Bugs at Scale with Infer Jules Villard - - PowerPoint PPT Presentation
Finding Inter-procedural Bugs at Scale with Infer Jules Villard <jul@fb.com> Facebook London Open-source static analyser Inter-procedural analyses + linters Infer For Java and C/C++/Objective-C Infer architecture PROJECT SOURCE CODE
Facebook London
Jules Villard <jul@fb.com>
Inter-procedural analyses + linters
For Java and C/C++/Objective-C
Open-source static analyser
SIL BACKEND SPECS REPORT
FRONTEND PROJECT BUILD SYSTEM
SOURCE CODE
And quite a few build system integrations
SIL
clang
+ clang plugin CLANG AST to backend...
javac
JAVA BYTECODE REPORT PROJECT BUILD SYSTEM
SOURCE CODE SOURCE FILES +COMPILE COMMANDS
Capture calls to the compiler Java frontend C/C++/ObjC frontend linters
SIL BACKEND SPECS REPORT
FRONTEND PROJECT BUILD SYSTEM
SOURCE CODE
"Allocates Memory" checker case study
void foo() { ... Bar.bar(); ... } @NoAllocation void goo() { ... foo(); ... }
Foo.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12 void bar() { ... new MyObject(); ... } void baz() { ... }
Bar.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
"Allocates Memory" checker case study
void foo() { ... Bar.bar(); ... } @NoAllocation void goo() { ... foo(); ... }
Foo.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
Allocation via call to foo() line 10
void bar() { ... new MyObject(); ... } void baz() { ... }
Bar.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
Allocation via call to bar() line 3 Allocation line 3 ERROR
Percentages of inter-procedural reports for different types of bugs
One procedure One file Interprocedural One file Interprocedural Inter-file Allocates Memory 2 98 Null Dereference (Java) 43 9 48 Null Dereference (Objective-C) 73 5 24 RacerD 36 12 53 Bad Pointer Comparison (linter) 100
https://code.facebook.com/posts/1537144479682247/finding-inter-procedural-bugs-at-scale-with-infer-static-analyzer/
DEVELOPER CI SYSTEM PHABRICATOR CODE REVIEWERS CI SYSTEM PRODUCT INFER PERFORMANCE TESTS
PERFORMANCE TESTS DEVELOPER CI SYSTEM PHABRICATOR CODE REVIEWERS CI SYSTEM PRODUCT INFER
"Allocates Memory" checker case study
+++ Foo.java @NoAllocation void goo() { ... + foo(); ... }
difg
void foo() { ... Bar.bar(); ... } @NoAllocation void goo() { ... foo(); ... }
Foo.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
"Allocates Memory" checker case study
+++ Foo.java @NoAllocation void goo() { ... + foo(); ... }
difg with difg
void bar() { ... new MyObject(); ... } void baz() { ... }
Bar.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
void foo() { ... Bar.bar(); ... } @NoAllocation void goo() { ... foo(); ... }
Foo.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
Allocation via call to foo() line 10 Allocation via call to bar() line 3 ERROR
"Allocates Memory" checker case study
+++ Foo.java @NoAllocation void goo() { ... + foo(); ... }
difg with difg
void bar() { ... new MyObject(); ... } void baz() { ... }
Bar.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
Allocation line 3
+++ Foo.java @NoAllocation void goo() { ... + foo(); ... }
difg
"Allocates Memory" checker case study
void foo() { ... Bar.bar(); ... } @NoAllocation void goo() { ... ... }
Foo.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12 void bar() { ... new MyObject(); ... } void baz() { ... }
Bar.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
Allocation line 3 base
+++ Foo.java @NoAllocation void goo() { ... + foo(); ... }
difg
"Allocates Memory" checker case study
void foo() { ... Bar.bar(); ... } @NoAllocation void goo() { ... ... }
Foo.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12 void bar() { ... new MyObject(); ... } void baz() { ... }
Bar.java (SIL)
1 2 3 4 5 6 7 8 9 10 11 12
No allocation Allocation line 3 Allocation via call to bar() line 3 base
+++ Foo.java @NoAllocation void goo() { ... + foo(); ... }
difg
"Allocates Memory" checker case study
base difg No report ERROR foo() allocates memory on line 10 diff - base = ERROR foo() allocates memory on line 10
DIFFERENTIAL REPORT
Easy to deploy new checks Help developers move fast
Facebook London
Jules Villard <jul@fb.com>