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