Dulma Churchill
c24ff02bb4
[biabduction] Add to the skip reason when the method comes from a protocol
...
Reviewed By: jvillard
Differential Revision: D7877741
fbshipit-source-id: 5c5d8fd
7 years ago
Ezgi Çiçek
fcb83a949f
implement missing CXXInheritedCtorInitExpr
...
Reviewed By: jvillard
Differential Revision: D7859552
fbshipit-source-id: d7cc63b
7 years ago
Nikos Gorogiannis
c104ea11dc
[racerd] switch to external issue logs
...
Reviewed By: jeremydubreil
Differential Revision: D7889303
fbshipit-source-id: a6d0b19
7 years ago
Nikos Gorogiannis
58f37cb9d8
[starvation] do not report deadlocks when both traces on UI thread
...
Reviewed By: jeremydubreil
Differential Revision: D7894623
fbshipit-source-id: 135e5ff
7 years ago
Nikos Gorogiannis
538bcd9135
[starvation] store issues to issue-logs like linters do
...
Reviewed By: jeremydubreil
Differential Revision: D7876329
fbshipit-source-id: 6572f3a
7 years ago
Brandon Kieft
275f4c3a8c
Add predicates to check for protocols
...
Reviewed By: dulmarod
Differential Revision: D7867975
fbshipit-source-id: 20d599d
7 years ago
Brandon Kieft
439839a9fa
Add is_in_(interface/implementation) predicates
...
Reviewed By: dulmarod
Differential Revision: D7863886
fbshipit-source-id: d8268d9
7 years ago
Brandon Kieft
7d4bd403df
Add is_objc_method_exposed predicate
...
Reviewed By: dulmarod
Differential Revision: D7862233
fbshipit-source-id: da2ee1b
7 years ago
Brandon Kieft
01ee635902
Add is_objc_method_overriding predicate
...
Reviewed By: dulmarod
Differential Revision: D7859827
fbshipit-source-id: 14c58d2
7 years ago
Nikos Gorogiannis
14ec16da12
[starvation] catch calls to AcccountManager.setUserData
...
Summary: Calls to AccountManager.setUserData are associated with ANRs.
Reviewed By: sblackshear
Differential Revision: D7859585
fbshipit-source-id: 215a522
7 years ago
Nikos Gorogiannis
bf501e5a7d
[starvation] treat Future.get as potentially blocking
...
Summary: Calling Future.get from UI thread, or under a lock the UI thread may try to take has been associated with ANRs.
Reviewed By: ddino
Differential Revision: D7859296
fbshipit-source-id: b87bd94
7 years ago
Nikos Gorogiannis
bef38bbf1a
[racerd] recognise std::lock calls
...
Summary: std::lock allows for locking multiple lockable objects, while avoiding deadlock. This will fix some FPs in C++.
Reviewed By: da319
Differential Revision: D7844198
fbshipit-source-id: 2b7140a
7 years ago
Dino Distefano
f2fa8cf0e0
Adding more examples where we get Top as cost
...
Reviewed By: mbouaziz
Differential Revision: D7859180
fbshipit-source-id: e3ff89b
7 years ago
Mehdi Bouaziz
5fe28785bc
Cost: fix min
...
Summary: We were wrongly using the underapproximation of `min` rather than the overapproximation
Reviewed By: ddino
Differential Revision: D7844267
fbshipit-source-id: c9d9247
7 years ago
Brandon Kieft
d7cf002461
Add new ObjC predicates, mostly related to categories
...
Reviewed By: dulmarod
Differential Revision: D7809653
fbshipit-source-id: c21f721
7 years ago
Sam Blackshear
78521419a9
[racerd] make deep ownership work with OwnedIf
...
Reviewed By: ngorogiannis
Differential Revision: D7844585
fbshipit-source-id: 96aedca
7 years ago
Jules Villard
902de9d6e3
[sil] make return value and type mandatory
...
Summary:
This simplifies the frontends and backends in most cases. Before this diff,
returning `void` could be modelled either with a `None` return, or a dummy
return variable with type `Tvoid`. Now it's always the latter.
Reviewed By: sblackshear, dulmarod
Differential Revision: D7832938
fbshipit-source-id: 0a403d1
7 years ago
Mehdi Bouaziz
1deaf7bfd6
Cost: instantiate symbolic cost after call
...
Reviewed By: ddino
Differential Revision: D7397208
fbshipit-source-id: a9647dc
7 years ago
Sam Blackshear
bb2ff197b3
[absint] fix handling of exceptions
...
Summary:
The abstract interpreter tried to handle exceptional control-flow by propagating the *pre* of a block that threw an exception rather than the *post*.
This was a half-measure that isn't correct when an exception-throwing instruction isn't in the middle of a block.
The handling of exceptions wasn't actually used anywhere and was leading to further hacks in `ProcCfg`, so let's get rid of it.
Reviewed By: mbouaziz, jvillard
Differential Revision: D7843872
fbshipit-source-id: 2a4a815
7 years ago
Dino Distefano
dbc8f29835
Added array test where we get TOP
...
Reviewed By: mbouaziz
Differential Revision: D7843528
fbshipit-source-id: 46e23c3
7 years ago
Mehdi Bouaziz
9c14e9d384
[Cost] Fix multiplication by 1
...
Reviewed By: ddino
Differential Revision: D7782184
fbshipit-source-id: dd3c4f1
7 years ago
Dulma Churchill
077d9a534b
[objc frontend] Do not assume that the fast enumeration in ObjC always includes a declaration of the loop variable
...
Reviewed By: sblackshear
Differential Revision: D7831531
fbshipit-source-id: 7d0c816
7 years ago
Jules Villard
0bbdf63957
[clang] do not attempt to translate pointer to member constructs
...
Summary:
C++...
seemsalittlecrazy
Reviewed By: sblackshear
Differential Revision: D7815648
fbshipit-source-id: f36ac4f
7 years ago
Dino Distefano
d4337abcb4
Added predicate for C++ copy constructors
...
Reviewed By: dulmarod
Differential Revision: D7829738
fbshipit-source-id: 73be42f
7 years ago
Dulma Churchill
038c0b92d4
[objc frontend] Raise SelfClassException only inside ObjCMethodCallExpr nodes
...
Reviewed By: jvillard
Differential Revision: D7816329
fbshipit-source-id: 3b46ef5
7 years ago
Sam Blackshear
d718275402
[quandary] fix test expected output
...
Reviewed By: da319, dulmarod
Differential Revision: D7830213
fbshipit-source-id: b754f4b
7 years ago
Sam Blackshear
6b8900746b
[quandary] only treat overrides of service methods as endpoints
...
Reviewed By: jeremydubreil
Differential Revision: D7813903
fbshipit-source-id: 7d77f6a
7 years ago
Jules Villard
4b4517e8ec
[clang] call a skip function in case of unimplemented feature
...
Summary: Returning the list of sub-expressions is not right and can cause assertion failures elsewhere in the frontend.
Reviewed By: dulmarod
Differential Revision: D7813493
fbshipit-source-id: 33ac9c1
7 years ago
Nikos Gorogiannis
dab8e2f17d
[starvation] Catch indirect blocks to the UI thread
...
Reviewed By: jeremydubreil
Differential Revision: D7774011
fbshipit-source-id: fe014b6
7 years ago
Jules Villard
d92e82b379
[clang] fix translation of `UserDefinedLiteral`
...
Summary: User-defined literals are really just function calls.
Reviewed By: sblackshear
Differential Revision: D7813464
fbshipit-source-id: c9302b9
7 years ago
Nikos Gorogiannis
e0a61c0a4a
[starvation] Move to a cluster checker phase for reporting
...
Reviewed By: jeremydubreil
Differential Revision: D7757783
fbshipit-source-id: 341de51
7 years ago
Sam Blackshear
30d7239aff
[quandary] SQL sinks for java
...
Reviewed By: jeremydubreil
Differential Revision: D7799801
fbshipit-source-id: 002079d
7 years ago
Sam Blackshear
ffba5de70c
[quandary] distinguish between SQL reads and writes
...
Reviewed By: mbouaziz
Differential Revision: D7781377
fbshipit-source-id: 9c76e4d
7 years ago
Dino Distefano
c80a2b0940
Test Determinator for MobileLab
...
Reviewed By: martinoluca
Differential Revision: D7709133
fbshipit-source-id: ffb2db2
7 years ago
Dulma Churchill
69392d4192
[biabduction] Log reasons for skipping also in non Java context
...
Reviewed By: mbouaziz, da319
Differential Revision: D7788663
fbshipit-source-id: 466faed
7 years ago
Mehdi Bouaziz
094eb9dcc7
[Cost] Use OneInstrPerNode CFG
...
Summary:
We want instr-granular invariant maps so let's use the OneInstrPerNode CFG in the AI analyzers.
This requires specializing the TransferFunctions.
Keep using the normal CFG where we only need node-granular informations.
Depends on D7587241
Depends on D7608526
Reviewed By: sblackshear
Differential Revision: D7618320
fbshipit-source-id: 73918f0
7 years ago
Jules Villard
73a47d594c
[debug] print procedures in alphabetical order in cfgs
...
Summary:
When looking at large CFGs, at least in `xdot`, it's often difficult to find
the procedure you're looking for. Sorting the proc names puts them in
alphabetical order, which makes searching one procedure easier.
Reviewed By: mbouaziz
Differential Revision: D7758521
fbshipit-source-id: 8e9997f
7 years ago
Nikos Gorogiannis
63aafd3381
[starvation] catch calls to View.getVisibleDisplayFrame
...
Reviewed By: jeremydubreil
Differential Revision: D7758016
fbshipit-source-id: f3ff474
7 years ago
Dulma Churchill
28200b87d7
[objc blocks] Specialize store instructions with current closure in methods specialized with blocks as arguments
...
Reviewed By: mbouaziz, jvillard
Differential Revision: D7744403
fbshipit-source-id: 42ad5f8
7 years ago
Nikos Gorogiannis
e5265ea85b
[starvation] surface caller of blocking calls in reports
...
Reviewed By: jeremydubreil
Differential Revision: D7727380
fbshipit-source-id: 02822ea
7 years ago
Ezgi Çiçek
8f0701a01c
Refine dependency analysis to remove vars at prune exit nodes
...
Reviewed By: ddino
Differential Revision: D7670952
fbshipit-source-id: 832a639
7 years ago
Nikos Gorogiannis
a4a1a9c55e
[starvation] Catch java IO blocking calls on UI thread
...
Reviewed By: sblackshear
Differential Revision: D7685918
fbshipit-source-id: 0ec46f2
7 years ago
Nikos Gorogiannis
7a9009e467
[starvation] Catch CountDownLatch.await calls on main thread
...
Reviewed By: ddino
Differential Revision: D7671323
fbshipit-source-id: 88fca56
7 years ago
Nikos Gorogiannis
b6c8766b11
[starvation] report binder calls on ui thread
...
Reviewed By: sblackshear
Differential Revision: D7670674
fbshipit-source-id: 15b858c
7 years ago
Ezgi Çiçek
523c2f539b
change clang translation to track if_kind (i.e. the type of prune node)
...
Reviewed By: ddino
Differential Revision: D7653684
fbshipit-source-id: d731ccf
7 years ago
Nikos Gorogiannis
196c0e5544
[starvation] harmonize java formatting in tests
...
Reviewed By: ddino
Differential Revision: D7667305
fbshipit-source-id: efee0f8
7 years ago
Sam Blackshear
670ae4a673
[quandary] `WebResourceRequest.getUrl` as source
...
Reviewed By: the-st0rm
Differential Revision: D7336116
fbshipit-source-id: 5d458e5
7 years ago
Sam Blackshear
8084c8fec7
[racerd] treat `@InjectProp` formals as owned
...
Reviewed By: ngorogiannis
Differential Revision: D7641152
fbshipit-source-id: 2dac8df
7 years ago
Sam Blackshear
ce8f958522
[racerd] don't report INTERFACE_NOT_THREAD_SAFE if the receiver of the interface call is marked `ThreadConfined`
...
Summary: We already suppress race reports if the field is marked in this way; makes sense to do the same thing for these reports.
Reviewed By: ngorogiannis
Differential Revision: D7589275
fbshipit-source-id: 8f0aeab
7 years ago
Nikos Gorogiannis
0130c09dfc
[starvation] add infrastructure for blocking events other than lock acquisition
...
Reviewed By: ddino
Differential Revision: D7428995
fbshipit-source-id: 5e1185d
7 years ago
Nikos Gorogiannis
269a1a9b93
[starvation] treat locks in (and accessed from) inner classes properly
...
Reviewed By: sblackshear
Differential Revision: D7427659
fbshipit-source-id: 9abf1ad
7 years ago
Daiva Naudziuniene
94aae8713e
[biabduction] Fix lookup of abduced expression
...
Summary: Currently when we look for already abduced expression and find an assertion [exp|->strexp:typexp], we use typexp rather than strexp.
Reviewed By: sblackshear
Differential Revision: D7617193
fbshipit-source-id: c089720
7 years ago
Ezgi Çiçek
76300d55c7
Tracks variables that affect control flow for a more precise cost analysis
...
Reviewed By: mbouaziz
Differential Revision: D7586777
fbshipit-source-id: 8752679
7 years ago
Ezgi Çiçek
af5265f75d
"Report infinity as error per function"
...
Reviewed By: mbouaziz
Differential Revision: D7600383
fbshipit-source-id: d6387ca
7 years ago
Jules Villard
dee7414aa9
[inferbo] do not include location information in the bug description
...
Summary:
This information is already available in the trace, and can contain absolute
paths to system includes (or infer's own clang runtime), which confuses the
diff analysis.
Reviewed By: mbouaziz
Differential Revision: D7534609
fbshipit-source-id: 5bd8f8b
7 years ago
Dulma Churchill
aa578ea586
[retain cycles] Treat missing fields also angelically when it still happens in rare cases
...
Reviewed By: mbouaziz
Differential Revision: D7550900
fbshipit-source-id: 11703ab
7 years ago
Jeremy Dubreil
2f1d486aab
[eradicate] model com.google.common.base.Strings.isNullOrEmpty(...)
...
Reviewed By: sblackshear
Differential Revision: D7526376
fbshipit-source-id: da60808
7 years ago
Dino Distefano
3b608695af
Improving treatment of default constructor
...
Reviewed By: sblackshear
Differential Revision: D7509019
fbshipit-source-id: 69d99a9
7 years ago
Dulma Churchill
74e16bdb58
[retain cycles] Define custom compare function that is more suited to dedup cycles
...
Reviewed By: mbouaziz
Differential Revision: D7517385
fbshipit-source-id: 00e0433
7 years ago
Mehdi Bouaziz
e9a3913fdb
[Inferbo] Do not propagate all safety conditions
...
Reviewed By: skcho
Differential Revision: D7289292
fbshipit-source-id: 999b14a
7 years ago
Sungkeun Cho
4234288c93
[inferbo] Add a pointer arithmetic test
...
Reviewed By: mbouaziz
Differential Revision: D7484490
fbshipit-source-id: 8d64016
7 years ago
Sungkeun Cho
e12a4a1071
[inferbo] Add traces in lift functions
...
Reviewed By: mbouaziz
Differential Revision: D7484003
fbshipit-source-id: 4411337
7 years ago
Sungkeun Cho
1f6feef448
[inferbo] Revise eval_locs for array blocks
...
Summary:
It renames `eval_locs` to `eval_arr` and we use it for getting array block values the given input expressions are pointing to. For example, when given a program variable `x` as an input, `eval_arr` returns array blocks that `x` is pointing to, on the other hand, `eval` returns an abstract location of `x`.
Depends on D7471891
Reviewed By: mbouaziz
Differential Revision: D7471915
fbshipit-source-id: b994944
7 years ago
Sam Blackshear
94c2cd1d3b
[ownership] tests for pointer arithmetic
...
Reviewed By: jeremydubreil
Differential Revision: D7495530
fbshipit-source-id: 0685772
7 years ago
Sam Blackshear
9180ff56c1
[ownership] handle new kinds of access expressions
...
Reviewed By: jeremydubreil
Differential Revision: D7482554
fbshipit-source-id: c511bda
7 years ago
Sungkeun Cho
a353d69a6e
[inferbo] Fix test code
...
Reviewed By: mbouaziz
Differential Revision: D7483906
fbshipit-source-id: 128ad17
7 years ago
Sungkeun Cho
4aafe8a990
[inferbo][bugfix] Revise gathering safety conditions in sub-exp
...
Reviewed By: mbouaziz
Differential Revision: D7471891
fbshipit-source-id: 2b592b1
7 years ago
Sungkeun Cho
b42d66d557
[inferbo][bugfix] Pointer arithmetics on pointers to non-array
...
Summary: In the pointer arithmetics, it returns top, if we cannot precisely follow the physical memory model, e.g., (&x + 1).
Reviewed By: mbouaziz
Differential Revision: D7453510
fbshipit-source-id: db8738e
7 years ago
Sungkeun Cho
00e1139071
[frontend] Parse binary operator using types of parameters
...
Summary: It parses "+" (and "-") to PlusA and PlusPI (and MinusA, MinusPI, MinusPP) using types of parameters.
Reviewed By: mbouaziz
Differential Revision: D7443048
fbshipit-source-id: bd560c7
7 years ago
Jeremy Dubreil
5dea7c55e2
[infer][java] report nullable inconsistencies on library calls
...
Summary:
Report nullable inconsistencies by relying on the bytecode, and not on the presence of analysis summary on disk.
This use the `--external-java-packages` to avoid reporting inconsistencies outside of the codebase.
Reviewed By: sblackshear
Differential Revision: D7481101
fbshipit-source-id: 281135d
7 years ago
Daiva Naudziuniene
681f2a56ab
[HIL] Explicit dereference
...
Reviewed By: sblackshear
Differential Revision: D7350669
fbshipit-source-id: c316188
7 years ago
Dulma Churchill
436e5340f3
[retain cycles] Move the retain cycle check to sym_exec_wrapper to get the path of the last instruction executed
...
Reviewed By: mbouaziz
Differential Revision: D7443580
fbshipit-source-id: 4512675
7 years ago
Nikos Gorogiannis
462c2e2b2e
[starvation] fix handling of static synchronized methods and static locks
...
Reviewed By: sblackshear
Differential Revision: D7427365
fbshipit-source-id: f23795f
7 years ago
Nikos Gorogiannis
b11dd03fb9
[starvation] ignore local/temp variables as locks
...
Reviewed By: sblackshear
Differential Revision: D7420069
fbshipit-source-id: caea591
7 years ago
Sungkeun Cho
d15894c78a
[inferbo] Add tests for relational analysis
...
Reviewed By: mbouaziz
Differential Revision: D7427283
fbshipit-source-id: a08bf63
7 years ago
Sam Blackshear
33fe8879a5
[quandary] report flows originating from `UserControlledEndpoint` as `_RISK`
...
Reviewed By: fahndrich
Differential Revision: D7420925
fbshipit-source-id: 5f40cb2
7 years ago
Sam Blackshear
f621dda0be
[infer][clang] models off-by-default
...
Reviewed By: jeremydubreil
Differential Revision: D7350715
fbshipit-source-id: e1d28ef
7 years ago
Dulma Churchill
927e2049c3
[backend] Add getter/setter execution to the trace
...
Reviewed By: mbouaziz, jvillard
Differential Revision: D7428857
fbshipit-source-id: 93018b0
7 years ago
Ezgi Çiçek
872daf1ba7
Add estimated cost to trace element
...
Reviewed By: mbouaziz
Differential Revision: D7414240
fbshipit-source-id: b30e4d1
7 years ago
Nikos Gorogiannis
b335fb9c50
[deadlock] rebrand to starvation
...
Reviewed By: sblackshear
Differential Revision: D7415034
fbshipit-source-id: a9789eb
7 years ago
Sam Blackshear
44e5d0564b
[ownership] fix false positives on aggregate locals in loops
...
Summary:
If an aggregate `a` has a field `f` whose type has a constructor (e.g., `std::string`), we translate creating a local aggregate `A { "hi" }` as `string(&(a.f), "hi")`.
This diff makes sure that we recognize this as initializing `a`.
Reviewed By: jeremydubreil
Differential Revision: D7404624
fbshipit-source-id: 0ba90a7
7 years ago
Jeremy Dubreil
2e14f9c9c3
[infer] model android.app.AlarmManager.cancel(PendingIntent) as not accepting a null parameter
...
Reviewed By: sblackshear
Differential Revision: D7378602
fbshipit-source-id: 94281a2
7 years ago
Jeremy Dubreil
8cfbdef7e0
[infer][biabduction] no longer track the resources saved into a container
...
Reviewed By: sblackshear
Differential Revision: D7387371
fbshipit-source-id: 81f34cc
7 years ago
Sam Blackshear
aabf8aec55
[quandary] use `_risk` warning types for endpoint sources in Java
...
Summary: Matching what we do on the C++ side.
Reviewed By: jeremydubreil
Differential Revision: D7374902
fbshipit-source-id: 7b25e6d
7 years ago
Dino Distefano
e54df20eb7
Migrate to Itv.Bound
...
Reviewed By: mbouaziz
Differential Revision: D7351195
fbshipit-source-id: 7f4f57b
7 years ago
Sam Blackshear
7efb5cb549
[ownership] allow placement new on non-var expressions
...
Reviewed By: jeremydubreil
Differential Revision: D7368872
fbshipit-source-id: 43b1ad8
7 years ago
Sam Blackshear
57a8c2f594
[quandary] don't taint dummy Thrift `_return` formals
...
Summary: In C++, Thrift implements return values using these. They shouldn't be tainted.
Reviewed By: mbouaziz
Differential Revision: D7362176
fbshipit-source-id: af8e515
7 years ago
Sam Blackshear
6b3282f619
[ownership] First parameter to constructor is read, not written
...
Reviewed By: jeremydubreil
Differential Revision: D7359197
fbshipit-source-id: 239b44d
7 years ago
Dulma Churchill
862bbdb5fc
[retain cycles] Take weak pointers into account to avoid false positives
...
Reviewed By: mbouaziz
Differential Revision: D7323649
fbshipit-source-id: e05a066
7 years ago
Sam Blackshear
f8dfc2305e
[ownership] simple 2-step traces
...
Summary:
Show where the invalidation occurred in the trace.
Should make things easier to understand.
Reviewed By: jeremydubreil
Differential Revision: D7312182
fbshipit-source-id: 44ba9cc
7 years ago
Sam Blackshear
ec73adc66d
[ownership] support placement new
...
Reviewed By: jeremydubreil
Differential Revision: D7269381
fbshipit-source-id: 7867958
7 years ago
Jeremy Dubreil
245e49e2da
[infer] Eradicate should understand any form of checkNotNull
...
Reviewed By: mbouaziz
Differential Revision: D7286232
fbshipit-source-id: 8046d90
7 years ago
Jeremy Dubreil
e801617488
[infer][java] Eradicate should not report a Return Not Nullable when a method returns the integer 0
...
Summary: This was causing false positives when returning the constant integer 0.
Reviewed By: sblackshear
Differential Revision: D7330143
fbshipit-source-id: 45d19dd
7 years ago
Dulma Churchill
d04a7aed52
[clang] Removed the mangling part of Clang global variables in the error messages
...
Reviewed By: mbouaziz
Differential Revision: D7292524
fbshipit-source-id: 1127751
7 years ago
Sam Blackshear
6d46b0c7be
[cleanup] stop printing `&`'s on `Var.t`'s
...
Reviewed By: jeremydubreil
Differential Revision: D7299568
fbshipit-source-id: ec7b18f
7 years ago
Sungkeun Cho
bd040cf696
[inferbo] Add an issue type for alarms by unknown function call
...
Summary: It adds an issue type, `BUFFER_OVERRUN_U5`, for alarms involving unknown values, i.e., when the trace set includes an unknown function call.
Reviewed By: mbouaziz
Differential Revision: D7178841
fbshipit-source-id: bfe857b
7 years ago
Sam Blackshear
b57aa90d7d
[quandary] don't crash if JSON source/sink is invalid procedure name
...
Summary:
At the moment, Java and Clang sources/sinks live in the same inferconfig entry.
If we try to parse a Java procedure that happens to be an invalid Clang qualified name (e.g., `MyClass.<init>`),
parsing will crash.
As a temporary fix, throw an exception and catch it instead.
In the future, we can avoid this by requiring that JSON source/sink specifications to indicate the language.
Reviewed By: mbouaziz
Differential Revision: D7291880
fbshipit-source-id: f8f4502
7 years ago
Sam Blackshear
4952f1ea3b
[quandary] tests documenting limitations of sanitizers
...
Reviewed By: mbouaziz
Differential Revision: D7257570
fbshipit-source-id: 5f97e31
7 years ago
Nikos Gorogiannis
484480f72f
[deadlock] regression tests
...
Reviewed By: sblackshear
Differential Revision: D7238932
fbshipit-source-id: 923e18e
7 years ago
Sam Blackshear
12ad6c11c1
[ownership] return bottom on early exit or thrown exception
...
Reviewed By: jeremydubreil
Differential Revision: D7230168
fbshipit-source-id: 84f97a5
7 years ago