xref: /aosp_15_r20/external/clang/www/analyzer/implicit_checks.html (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2*67e74705SXin Li          "http://www.w3.org/TR/html4/strict.dtd">
3*67e74705SXin Li<html>
4*67e74705SXin Li<head>
5*67e74705SXin Li  <title>Implicit Checks</title>
6*67e74705SXin Li  <link type="text/css" rel="stylesheet" href="menu.css">
7*67e74705SXin Li  <link type="text/css" rel="stylesheet" href="content.css">
8*67e74705SXin Li  <script type="text/javascript" src="scripts/menu.js"></script>
9*67e74705SXin Li  <script type="text/javascript" src="scripts/expandcollapse.js"></script>
10*67e74705SXin Li  <style type="text/css">
11*67e74705SXin Li  tr:first-child { width:20%; }
12*67e74705SXin Li  </style>
13*67e74705SXin Li</head>
14*67e74705SXin Li<body onload="initExpandCollapse()">
15*67e74705SXin Li
16*67e74705SXin Li<div id="page">
17*67e74705SXin Li<!--#include virtual="menu.html.incl"-->
18*67e74705SXin Li
19*67e74705SXin Li<div id="content">
20*67e74705SXin Li<h1>Implicit Checkers</h1>
21*67e74705SXin LiEven though the implicit checkers do not produce any warnings, they are used to
22*67e74705SXin Lisupport the analyzer core and model known APIs. See also
23*67e74705SXin Li<a href = "available_checks.html">Default Checkers</a>
24*67e74705SXin Liand <a href = "alpha_checks.html">Experimental (Alpha) Checkers</a>.
25*67e74705SXin Li<ul>
26*67e74705SXin Li<li><a href="#core_implicit_checkers">Core Implicit Checkers</a></li>
27*67e74705SXin Li<li><a href="#osx_implicit_checkers">OS X Implicit Checkers</a></li>
28*67e74705SXin Li</ul>
29*67e74705SXin Li
30*67e74705SXin Li<!------------------------------- core implicit ------------------------------->
31*67e74705SXin Li<h3 id="core_implicit_checkers">Core Implicit Checkers</h3>
32*67e74705SXin Li<table class="checkers">
33*67e74705SXin Li<colgroup><col class="namedescr"><col class="example"></colgroup>
34*67e74705SXin Li<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
35*67e74705SXin Li
36*67e74705SXin Li<tbody>
37*67e74705SXin Li<tr><td><div class="namedescr expandable"><span class="name">
38*67e74705SXin Licore.DynamicTypePropagation</span><span class="lang">
39*67e74705SXin Li(C++, ObjC)</span><div class="descr">
40*67e74705SXin LiGenerate dynamic type information.</div></div></td>
41*67e74705SXin Li<td><div class="exampleContainer expandable">
42*67e74705SXin Li<div class="example"><pre>
43*67e74705SXin Li// C++
44*67e74705SXin Liclass A {
45*67e74705SXin Lipublic:
46*67e74705SXin Li  A(int x) {}
47*67e74705SXin Li  virtual int foo();
48*67e74705SXin Li};
49*67e74705SXin Li
50*67e74705SXin Liclass B: public A {
51*67e74705SXin Lipublic:
52*67e74705SXin Li  B()
53*67e74705SXin Li  :A(foo())
54*67e74705SXin Li  // DynamicTypeInfo for 'this' rigion will wrap type 'A'
55*67e74705SXin Li  // unless the base constructor call expression is processed
56*67e74705SXin Li  {}
57*67e74705SXin Li  virtual int foo();
58*67e74705SXin Li};
59*67e74705SXin Li</pre></div><div class="separator"></div>
60*67e74705SXin Li<div class="example"><pre>
61*67e74705SXin Li// Objective-C
62*67e74705SXin Li@interface MyClass : NSObject {}
63*67e74705SXin Li@end
64*67e74705SXin Li
65*67e74705SXin Li@implementation MyClass
66*67e74705SXin Li+ (void)foo {
67*67e74705SXin Li  MyClass *x = [[self alloc] init];
68*67e74705SXin Li  // DynamicTypeInfo from a cast: from 'id' to 'MyClass *'
69*67e74705SXin Li}
70*67e74705SXin Li@end
71*67e74705SXin Li
72*67e74705SXin Livoid test() {
73*67e74705SXin Li  MyClass *x = [MyClass alloc];
74*67e74705SXin Li  // DynamicTypeInfo from a call to alloc:
75*67e74705SXin Li  // from 'id' to 'MyClass *'
76*67e74705SXin Li}
77*67e74705SXin Li</pre></div></div></td></tr>
78*67e74705SXin Li
79*67e74705SXin Li
80*67e74705SXin Li<tr><td><div class="namedescr expandable"><span class="name">
81*67e74705SXin Licore.builtin.BuiltinFunctions</span><span class="lang">
82*67e74705SXin Li(C)</span><div class="descr">
83*67e74705SXin LiEvaluate compiler builtin functions (e.g., <code>alloca()</code>)</div></div></td>
84*67e74705SXin Li<td><div class="exampleContainer expandable">
85*67e74705SXin Li<div class="example"><pre>
86*67e74705SXin Livoid test(int x) {
87*67e74705SXin Li  int *p = (int *)__builtin_alloca(8);
88*67e74705SXin Li    // evaluates to AllocaRegion
89*67e74705SXin Li
90*67e74705SXin Li  if(__builtin_expect(x > 10, 0)) // evaluates to 'x > 10'
91*67e74705SXin Li    x = 0;
92*67e74705SXin Li}
93*67e74705SXin Li</pre></div></div></td></tr>
94*67e74705SXin Li
95*67e74705SXin Li
96*67e74705SXin Li<tr><td><div class="namedescr expandable"><span class="name">
97*67e74705SXin Licore.builtin.NoReturnFunctions</span><span class="lang">
98*67e74705SXin Li(C, ObjC)</span><div class="descr">
99*67e74705SXin LiEvaluate "panic" functions that are known to not return to the caller.</div></div></td>
100*67e74705SXin Li<td><div class="exampleContainer expandable">
101*67e74705SXin Li<div class="example"><pre>
102*67e74705SXin Li// C
103*67e74705SXin Livoid test() {
104*67e74705SXin Li  panic(); // generate sink
105*67e74705SXin Li}
106*67e74705SXin Li</pre></div><div class="separator"></div>
107*67e74705SXin Li<div class="example"><pre>
108*67e74705SXin Li// Objective-C
109*67e74705SXin Li@interface MyObj : NSObject {}
110*67e74705SXin Li- (void)foo;
111*67e74705SXin Li@end
112*67e74705SXin Li
113*67e74705SXin Li@implementation MyObj
114*67e74705SXin Li- (void)foo {
115*67e74705SXin Li  [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd
116*67e74705SXin Li                                       object:self
117*67e74705SXin Li                                       file:(@"somefile.m")
118*67e74705SXin Li                                       lineNumber:1
119*67e74705SXin Li                                       description:(@"some text")];
120*67e74705SXin Li    // generate sink
121*67e74705SXin Li}
122*67e74705SXin Li@end
123*67e74705SXin Li</pre></div></div></td></tr>
124*67e74705SXin Li
125*67e74705SXin Li</tbody></table>
126*67e74705SXin Li
127*67e74705SXin Li<!---------------------------- OS X implicit ---------------------------------->
128*67e74705SXin Li<h3 id="osx_implicit_checkers">OS X Implicit Checkers</h3>
129*67e74705SXin Li<table class="checkers">
130*67e74705SXin Li<colgroup><col class="namedescr"><col class="example"></colgroup>
131*67e74705SXin Li<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
132*67e74705SXin Li
133*67e74705SXin Li<tbody>
134*67e74705SXin Li<tr><td><div class="namedescr expandable"><span class="name">
135*67e74705SXin Liosx.cocoa.Loops</span><span class="lang">
136*67e74705SXin Li(ObjC)</span><div class="descr">
137*67e74705SXin LiImproved modeling of loops using Cocoa collection types.</div></div></td>
138*67e74705SXin Li<td><div class="exampleContainer expandable">
139*67e74705SXin Li<div class="example"><pre>
140*67e74705SXin Livoid test() {
141*67e74705SXin Li  id x;
142*67e74705SXin Li  for (x in [NSArray testObject]) {
143*67e74705SXin Li    // assume the value of 'x' is non-nil
144*67e74705SXin Li  }
145*67e74705SXin Li}
146*67e74705SXin Li</pre></div></div></td></tr>
147*67e74705SXin Li
148*67e74705SXin Li
149*67e74705SXin Li<tr><td><div class="namedescr expandable"><span class="name">
150*67e74705SXin Liosx.cocoa.NonNilReturnValue</span><span class="lang">
151*67e74705SXin Li(ObjC)</span><div class="descr">
152*67e74705SXin LiModel the APIs that are guaranteed to return a non-nil value.</div></div></td>
153*67e74705SXin Li<td><div class="exampleContainer expandable">
154*67e74705SXin Li<div class="example"><pre>
155*67e74705SXin Livoid test(NSArray *A) {
156*67e74705SXin Li  id subscriptObj = A[1]; // assume the value is non-nil
157*67e74705SXin Li}
158*67e74705SXin Li</pre></div></div></td></tr>
159*67e74705SXin Li
160*67e74705SXin Li</tbody></table>
161*67e74705SXin Li
162*67e74705SXin Li</div> <!-- page -->
163*67e74705SXin Li</div> <!-- content -->
164*67e74705SXin Li</body>
165*67e74705SXin Li</html>
166