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