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