blob: 4cffcb7454e96bc7a5685d1f3dc2846917908de9 [file] [log] [blame]
Jordan Rose25c04002012-08-17 02:11:35 +00001Inlining
2========
3
Jordan Rosede5277f2012-08-31 17:06:49 +00004There are several options that control which calls the analyzer will consider for
Anna Zaksce328902013-01-30 19:12:26 +00005inlining. The major one is -analyzer-config ipa:
Jordan Rosede5277f2012-08-31 17:06:49 +00006
Anna Zaksce328902013-01-30 19:12:26 +00007 -analyzer-config ipa=none - All inlining is disabled. This is the only mode
8 available in LLVM 3.1 and earlier and in Xcode 4.3 and earlier.
Ted Kremenek77df8d92012-08-22 01:20:05 +00009
Anna Zaksce328902013-01-30 19:12:26 +000010 -analyzer-config ipa=basic-inlining - Turns on inlining for C functions, C++
11 static member functions, and blocks -- essentially, the calls that behave
12 like simple C function calls. This is essentially the mode used in
13 Xcode 4.4.
Ted Kremenek77df8d92012-08-22 01:20:05 +000014
Anna Zaksce328902013-01-30 19:12:26 +000015 -analyzer-config ipa=inlining - Turns on inlining when we can confidently find
16 the function/method body corresponding to the call. (C functions, static
Ted Kremenek77df8d92012-08-22 01:20:05 +000017 functions, devirtualized C++ methods, Objective-C class methods, Objective-C
18 instance methods when ExprEngine is confident about the dynamic type of the
19 instance).
20
Anna Zaksce328902013-01-30 19:12:26 +000021 -analyzer-config ipa=dynamic - Inline instance methods for which the type is
Ted Kremenek77df8d92012-08-22 01:20:05 +000022 determined at runtime and we are not 100% sure that our type info is
23 correct. For virtual calls, inline the most plausible definition.
24
Anna Zaksce328902013-01-30 19:12:26 +000025 -analyzer-config ipa=dynamic-bifurcate - Same as -analyzer-config ipa=dynamic,
26 but the path is split. We inline on one branch and do not inline on the
27 other. This mode does not drop the coverage in cases when the parent class
28 has code that is only exercised when some of its methods are overridden.
Jordan Rose25c04002012-08-17 02:11:35 +000029
Anna Zaksce328902013-01-30 19:12:26 +000030Currently, -analyzer-config ipa=dynamic-bifurcate is the default mode.
Jordan Rose25c04002012-08-17 02:11:35 +000031
Anna Zaksce328902013-01-30 19:12:26 +000032While -analyzer-config ipa determines in general how aggressively the analyzer
33will try to inline functions, several additional options control which types of
34functions can inlined, in an all-or-nothing way. These options use the
35analyzer's configuration table, so they are all specified as follows:
Jordan Rosede5277f2012-08-31 17:06:49 +000036
Jordan Rose978869a2012-09-10 21:54:24 +000037 -analyzer-config OPTION=VALUE
Jordan Rosede5277f2012-08-31 17:06:49 +000038
Jordan Rose978869a2012-09-10 21:54:24 +000039### c++-inlining ###
40
41This option controls which C++ member functions may be inlined.
42
43 -analyzer-config c++-inlining=[none | methods | constructors | destructors]
Jordan Rosede5277f2012-08-31 17:06:49 +000044
45Each of these modes implies that all the previous member function kinds will be
46inlined as well; it doesn't make sense to inline destructors without inlining
47constructors, for example.
48
Jordan Rosea11f22f2013-02-27 18:49:43 +000049The default c++-inlining mode is 'constructors', meaning that member functions,
50overloaded operators, and some constructors will be inlined. If a type has a
51non-trivial destructor, however, its constructor will not be inlined. Note that
52no C++ member functions will be inlined under -analyzer-config ipa=none or
Anna Zaksce328902013-01-30 19:12:26 +000053-analyzer-config ipa=basic-inlining.
Jordan Rosede5277f2012-08-31 17:06:49 +000054
Jordan Rose978869a2012-09-10 21:54:24 +000055### c++-template-inlining ###
56
57This option controls whether C++ templated functions may be inlined.
58
59 -analyzer-config c++-template-inlining=[true | false]
60
61Currently, template functions are considered for inlining by default.
62
63The motivation behind this option is that very generic code can be a source
64of false positives, either by considering paths that the caller considers
65impossible (by some unstated precondition), or by inlining some but not all
66of a deep implementation of a function.
67
68### c++-stdlib-inlining ###
69
70This option controls whether functions from the C++ standard library, including
71methods of the container classes in the Standard Template Library, should be
72considered for inlining.
73
74 -analyzer-config c++-template-inlining=[true | false]
75
76Currently, C++ standard library functions are NOT considered for inlining by default.
77
78The standard library functions and the STL in particular are used ubiquitously
79enough that our tolerance for false positives is even lower here. A false
80positive due to poor modeling of the STL leads to a poor user experience, since
81most users would not be comfortable adding assertions to system headers in order
82to silence analyzer warnings.
83
Jordan Rosede5277f2012-08-31 17:06:49 +000084
Jordan Rose25c04002012-08-17 02:11:35 +000085Basics of Implementation
86-----------------------
87
Ted Kremenek77df8d92012-08-22 01:20:05 +000088The low-level mechanism of inlining a function is handled in
89ExprEngine::inlineCall and ExprEngine::processCallExit.
Jordan Rose25c04002012-08-17 02:11:35 +000090
Ted Kremenek77df8d92012-08-22 01:20:05 +000091If the conditions are right for inlining, a CallEnter node is created and added
92to the analysis work list. The CallEnter node marks the change to a new
93LocationContext representing the called function, and its state includes the
94contents of the new stack frame. When the CallEnter node is actually processed,
95its single successor will be a edge to the first CFG block in the function.
96
97Exiting an inlined function is a bit more work, fortunately broken up into
98reasonable steps:
99
1001. The CoreEngine realizes we're at the end of an inlined call and generates a
101 CallExitBegin node.
102
1032. ExprEngine takes over (in processCallExit) and finds the return value of the
104 function, if it has one. This is bound to the expression that triggered the
105 call. (In the case of calls without origin expressions, such as destructors,
106 this step is skipped.)
107
1083. Dead symbols and bindings are cleaned out from the state, including any local
109 bindings.
110
1114. A CallExitEnd node is generated, which marks the transition back to the
112 caller's LocationContext.
113
1145. Custom post-call checks are processed and the final nodes are pushed back
115 onto the work list, so that evaluation of the caller can continue.
Jordan Rose25c04002012-08-17 02:11:35 +0000116
117Retry Without Inlining
Ted Kremenek77df8d92012-08-22 01:20:05 +0000118----------------------
119
Jordan Rosef01ef1052012-08-22 17:13:27 +0000120In some cases, we would like to retry analysis without inlining a particular
Ted Kremenek77df8d92012-08-22 01:20:05 +0000121call.
122
Jordan Rosef01ef1052012-08-22 17:13:27 +0000123Currently, we use this technique to recover coverage in case we stop
Ted Kremenek77df8d92012-08-22 01:20:05 +0000124analyzing a path due to exceeding the maximum block count inside an inlined
125function.
126
127When this situation is detected, we walk up the path to find the first node
128before inlining was started and enqueue it on the WorkList with a special
129ReplayWithoutInlining bit added to it (ExprEngine::replayWithoutInlining). The
130path is then re-analyzed from that point without inlining that particular call.
131
132Deciding When to Inline
Jordan Rose25c04002012-08-17 02:11:35 +0000133-----------------------
134
Ted Kremenek77df8d92012-08-22 01:20:05 +0000135In general, the analyzer attempts to inline as much as possible, since it
136provides a better summary of what actually happens in the program. There are
137some cases, however, where the analyzer chooses not to inline:
Jordan Rose25c04002012-08-17 02:11:35 +0000138
Ted Kremenek77df8d92012-08-22 01:20:05 +0000139- If there is no definition available for the called function or method. In
140 this case, there is no opportunity to inline.
141
Jordan Rosef01ef1052012-08-22 17:13:27 +0000142- If the CFG cannot be constructed for a called function, or the liveness
Ted Kremenek77df8d92012-08-22 01:20:05 +0000143 cannot be computed. These are prerequisites for analyzing a function body,
144 with or without inlining.
145
146- If the LocationContext chain for a given ExplodedNode reaches a maximum cutoff
147 depth. This prevents unbounded analysis due to infinite recursion, but also
148 serves as a useful cutoff for performance reasons.
149
150- If the function is variadic. This is not a hard limitation, but an engineering
151 limitation.
152
153 Tracked by: <rdar://problem/12147064> Support inlining of variadic functions
154
Jordan Rosef01ef1052012-08-22 17:13:27 +0000155- In C++, constructors are not inlined unless the destructor call will be
156 processed by the ExprEngine. Thus, if the CFG was built without nodes for
157 implicit destructors, or if the destructors for the given object are not
Jordan Rose7103d2d2012-08-27 18:39:16 +0000158 represented in the CFG, the constructor will not be inlined. (As an exception,
159 constructors for objects with trivial constructors can still be inlined.)
Jordan Rosef01ef1052012-08-22 17:13:27 +0000160 See "C++ Caveats" below.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000161
Jordan Rose7103d2d2012-08-27 18:39:16 +0000162- In C++, ExprEngine does not inline custom implementations of operator 'new'
Jordan Rose6fe4dfb2012-08-27 18:39:22 +0000163 or operator 'delete', nor does it inline the constructors and destructors
164 associated with these. See "C++ Caveats" below.
Jordan Rose7103d2d2012-08-27 18:39:16 +0000165
Ted Kremenek77df8d92012-08-22 01:20:05 +0000166- Calls resulting in "dynamic dispatch" are specially handled. See more below.
167
Jordan Rosef01ef1052012-08-22 17:13:27 +0000168- The FunctionSummaries map stores additional information about declarations,
169 some of which is collected at runtime based on previous analyses.
170 We do not inline functions which were not profitable to inline in a different
171 context (for example, if the maximum block count was exceeded; see
172 "Retry Without Inlining").
Jordan Rose25c04002012-08-17 02:11:35 +0000173
174
Ted Kremenek77df8d92012-08-22 01:20:05 +0000175Dynamic Calls and Devirtualization
Jordan Rose25c04002012-08-17 02:11:35 +0000176----------------------------------
Jordan Rose25c04002012-08-17 02:11:35 +0000177
Ted Kremenek77df8d92012-08-22 01:20:05 +0000178"Dynamic" calls are those that are resolved at runtime, such as C++ virtual
179method calls and Objective-C message sends. Due to the path-sensitive nature of
Jordan Rosef01ef1052012-08-22 17:13:27 +0000180the analysis, the analyzer may be able to reason about the dynamic type of the
Ted Kremenek77df8d92012-08-22 01:20:05 +0000181object whose method is being called and thus "devirtualize" the call.
Jordan Rose25c04002012-08-17 02:11:35 +0000182
Ted Kremenek77df8d92012-08-22 01:20:05 +0000183This path-sensitive devirtualization occurs when the analyzer can determine what
184method would actually be called at runtime. This is possible when the type
Jordan Rosef01ef1052012-08-22 17:13:27 +0000185information is constrained enough for a simulated C++/Objective-C object that
186the analyzer can make such a decision.
Jordan Rose25c04002012-08-17 02:11:35 +0000187
Ted Kremenek77df8d92012-08-22 01:20:05 +0000188 == DynamicTypeInfo ==
Jordan Rose25c04002012-08-17 02:11:35 +0000189
Jordan Rosef01ef1052012-08-22 17:13:27 +0000190As the analyzer analyzes a path, it may accrue information to refine the
191knowledge about the type of an object. This can then be used to make better
192decisions about the target method of a call.
Jordan Rose25c04002012-08-17 02:11:35 +0000193
Ted Kremenek77df8d92012-08-22 01:20:05 +0000194Such type information is tracked as DynamicTypeInfo. This is path-sensitive
195data that is stored in ProgramState, which defines a mapping from MemRegions to
196an (optional) DynamicTypeInfo.
197
198If no DynamicTypeInfo has been explicitly set for a MemRegion, it will be lazily
199inferred from the region's type or associated symbol. Information from symbolic
200regions is weaker than from true typed regions.
201
202 EXAMPLE: A C++ object declared "A obj" is known to have the class 'A', but a
203 reference "A &ref" may dynamically be a subclass of 'A'.
204
205The DynamicTypePropagation checker gathers and propagates DynamicTypeInfo,
206updating it as information is observed along a path that can refine that type
207information for a region.
208
209 WARNING: Not all of the existing analyzer code has been retrofitted to use
210 DynamicTypeInfo, nor is it universally appropriate. In particular,
211 DynamicTypeInfo always applies to a region with all casts stripped
Jordan Rosef01ef1052012-08-22 17:13:27 +0000212 off, but sometimes the information provided by casts can be useful.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000213
214
Jordan Rosef01ef1052012-08-22 17:13:27 +0000215 == RuntimeDefinition ==
Ted Kremenek77df8d92012-08-22 01:20:05 +0000216
Jordan Rosef01ef1052012-08-22 17:13:27 +0000217The basis of devirtualization is CallEvent's getRuntimeDefinition() method,
218which returns a RuntimeDefinition object. When asked to provide a definition,
219the CallEvents for dynamic calls will use the DynamicTypeInfo in their
220ProgramState to attempt to devirtualize the call. In the case of no dynamic
221dispatch, or perfectly constrained devirtualization, the resulting
222RuntimeDefinition contains a Decl corresponding to the definition of the called
223function, and RuntimeDefinition::mayHaveOtherDefinitions will return FALSE.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000224
Jordan Rosef01ef1052012-08-22 17:13:27 +0000225In the case of dynamic dispatch where our information is not perfect, CallEvent
226can make a guess, but RuntimeDefinition::mayHaveOtherDefinitions will return
227TRUE. The RuntimeDefinition object will then also include a MemRegion
228corresponding to the object being called (i.e., the "receiver" in Objective-C
229parlance), which ExprEngine uses to decide whether or not the call should be
230inlined.
231
232 == Inlining Dynamic Calls ==
233
Anna Zaksce328902013-01-30 19:12:26 +0000234The -analyzer-config ipa option has five different modes: none, basic-inlining,
235inlining, dynamic, and dynamic-bifurcate. Under -analyzer-config ipa=dynamic,
236all dynamic calls are inlined, whether we are certain or not that this will
237actually be the definition used at runtime. Under -analyzer-config ipa=inlining,
238only "near-perfect" devirtualized calls are inlined*, and other dynamic calls
239are evaluated conservatively (as if no definition were available).
Ted Kremenek77df8d92012-08-22 01:20:05 +0000240
241* Currently, no Objective-C messages are not inlined under
Anna Zaksce328902013-01-30 19:12:26 +0000242 -analyzer-config ipa=inlining, even if we are reasonably confident of the type
243 of the receiver. We plan to enable this once we have tested our heuristics
244 more thoroughly.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000245
Anna Zaksce328902013-01-30 19:12:26 +0000246The last option, -analyzer-config ipa=dynamic-bifurcate, behaves similarly to
Ted Kremenek77df8d92012-08-22 01:20:05 +0000247"dynamic", but performs a conservative invalidation in the general virtual case
248in *addition* to inlining. The details of this are discussed below.
Jordan Rose25c04002012-08-17 02:11:35 +0000249
Anna Zaksce328902013-01-30 19:12:26 +0000250As stated above, -analyzer-config ipa=basic-inlining does not inline any C++
251member functions or Objective-C method calls, even if they are non-virtual or
252can be safely devirtualized.
Jordan Rosef01ef1052012-08-22 17:13:27 +0000253
254
Jordan Rose25c04002012-08-17 02:11:35 +0000255Bifurcation
256-----------
Jordan Rose25c04002012-08-17 02:11:35 +0000257
Anna Zaksce328902013-01-30 19:12:26 +0000258ExprEngine::BifurcateCall implements the -analyzer-config ipa=dynamic-bifurcate
Ted Kremenek77df8d92012-08-22 01:20:05 +0000259mode.
Jordan Rose25c04002012-08-17 02:11:35 +0000260
Jordan Rosef01ef1052012-08-22 17:13:27 +0000261When a call is made on an object with imprecise dynamic type information
Anna Zaks2eed8cc2012-08-22 05:38:38 +0000262(RuntimeDefinition::mayHaveOtherDefinitions() evaluates to TRUE), ExprEngine
Jordan Rosef01ef1052012-08-22 17:13:27 +0000263bifurcates the path and marks the object's region (retrieved from the
264RuntimeDefinition object) with a path-sensitive "mode" in the ProgramState.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000265
266Currently, there are 2 modes:
267
268 DynamicDispatchModeInlined - Models the case where the dynamic type information
Anna Zaks2eed8cc2012-08-22 05:38:38 +0000269 of the receiver (MemoryRegion) is assumed to be perfectly constrained so
270 that a given definition of a method is expected to be the code actually
271 called. When this mode is set, ExprEngine uses the Decl from
272 RuntimeDefinition to inline any dynamically dispatched call sent to this
273 receiver because the function definition is considered to be fully resolved.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000274
275 DynamicDispatchModeConservative - Models the case where the dynamic type
Anna Zaks2eed8cc2012-08-22 05:38:38 +0000276 information is assumed to be incorrect, for example, implies that the method
277 definition is overriden in a subclass. In such cases, ExprEngine does not
278 inline the methods sent to the receiver (MemoryRegion), even if a candidate
279 definition is available. This mode is conservative about simulating the
280 effects of a call.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000281
Anna Zaks2eed8cc2012-08-22 05:38:38 +0000282Going forward along the symbolic execution path, ExprEngine consults the mode
283of the receiver's MemRegion to make decisions on whether the calls should be
284inlined or not, which ensures that there is at most one split per region.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000285
286At a high level, "bifurcation mode" allows for increased semantic coverage in
287cases where the parent method contains code which is only executed when the
288class is subclassed. The disadvantages of this mode are a (considerable?)
289performance hit and the possibility of false positives on the path where the
290conservative mode is used.
Jordan Rose25c04002012-08-17 02:11:35 +0000291
292Objective-C Message Heuristics
293------------------------------
Jordan Rose25c04002012-08-17 02:11:35 +0000294
Anna Zaks2eed8cc2012-08-22 05:38:38 +0000295ExprEngine relies on a set of heuristics to partition the set of Objective-C
296method calls into those that require bifurcation and those that do not. Below
297are the cases when the DynamicTypeInfo of the object is considered precise
Ted Kremenek77df8d92012-08-22 01:20:05 +0000298(cannot be a subclass):
299
300 - If the object was created with +alloc or +new and initialized with an -init
301 method.
302
303 - If the calls are property accesses using dot syntax. This is based on the
304 assumption that children rarely override properties, or do so in an
305 essentially compatible way.
306
307 - If the class interface is declared inside the main source file. In this case
308 it is unlikely that it will be subclassed.
309
310 - If the method is not declared outside of main source file, either by the
311 receiver's class or by any superclasses.
Jordan Rose25c04002012-08-17 02:11:35 +0000312
Jordan Rosef01ef1052012-08-22 17:13:27 +0000313C++ Caveats
Jordan Rose25c04002012-08-17 02:11:35 +0000314--------------------
Jordan Rose25c04002012-08-17 02:11:35 +0000315
Ted Kremenek77df8d92012-08-22 01:20:05 +0000316C++11 [class.cdtor]p4 describes how the vtable of an object is modified as it is
317being constructed or destructed; that is, the type of the object depends on
318which base constructors have been completed. This is tracked using
319DynamicTypeInfo in the DynamicTypePropagation checker.
Jordan Rose25c04002012-08-17 02:11:35 +0000320
Ted Kremenek77df8d92012-08-22 01:20:05 +0000321There are several limitations in the current implementation:
Jordan Rose25c04002012-08-17 02:11:35 +0000322
Jordan Rosef01ef1052012-08-22 17:13:27 +0000323- Temporaries are poorly modeled right now because we're not confident in the
324 placement of their destructors in the CFG. We currently won't inline their
Jordan Rose7103d2d2012-08-27 18:39:16 +0000325 constructors unless the destructor is trivial, and don't process their
326 destructors at all, not even to invalidate the region.
Jordan Rose25c04002012-08-17 02:11:35 +0000327
Jordan Rosef01ef1052012-08-22 17:13:27 +0000328- 'new' is poorly modeled due to some nasty CFG/design issues. This is tracked
329 in PR12014. 'delete' is not modeled at all.
Ted Kremenek77df8d92012-08-22 01:20:05 +0000330
331- Arrays of objects are modeled very poorly right now. ExprEngine currently
Jordan Rosef01ef1052012-08-22 17:13:27 +0000332 only simulates the first constructor and first destructor. Because of this,
Ted Kremenek77df8d92012-08-22 01:20:05 +0000333 ExprEngine does not inline any constructors or destructors for arrays.
Jordan Rose25c04002012-08-17 02:11:35 +0000334
Jordan Rosef01ef1052012-08-22 17:13:27 +0000335
Jordan Rose25c04002012-08-17 02:11:35 +0000336CallEvent
Jordan Rosef01ef1052012-08-22 17:13:27 +0000337=========
Jordan Rose25c04002012-08-17 02:11:35 +0000338
Ted Kremenek77df8d92012-08-22 01:20:05 +0000339A CallEvent represents a specific call to a function, method, or other body of
340code. It is path-sensitive, containing both the current state (ProgramStateRef)
341and stack space (LocationContext), and provides uniform access to the argument
342values and return type of a call, no matter how the call is written in the
343source or what sort of code body is being invoked.
Jordan Rose25c04002012-08-17 02:11:35 +0000344
Ted Kremenek77df8d92012-08-22 01:20:05 +0000345 NOTE: For those familiar with Cocoa, CallEvent is roughly equivalent to
346 NSInvocation.
Jordan Rose25c04002012-08-17 02:11:35 +0000347
Ted Kremenek77df8d92012-08-22 01:20:05 +0000348CallEvent should be used whenever there is logic dealing with function calls
349that does not care how the call occurred.
Jordan Rose25c04002012-08-17 02:11:35 +0000350
Ted Kremenek77df8d92012-08-22 01:20:05 +0000351Examples include checking that arguments satisfy preconditions (such as
352__attribute__((nonnull))), and attempting to inline a call.
353
354CallEvents are reference-counted objects managed by a CallEventManager. While
355there is no inherent issue with persisting them (say, in a ProgramState's GDM),
356they are intended for short-lived use, and can be recreated from CFGElements or
Jordan Rosef01ef1052012-08-22 17:13:27 +0000357non-top-level StackFrameContexts fairly easily.