1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config faux-bodies=true,model-path=%S/Inputs/Models -analyzer-output=plist-multi-file -verify %s -o %t 2*67e74705SXin Li // RUN: FileCheck --input-file=%t %s 3*67e74705SXin Li 4*67e74705SXin Li typedef int* intptr; 5*67e74705SXin Li 6*67e74705SXin Li // This function is modeled and the p pointer is dereferenced in the model 7*67e74705SXin Li // function and there is no function definition available. The modeled 8*67e74705SXin Li // function can use any types that are available in the original translation 9*67e74705SXin Li // unit, for example intptr in this case. 10*67e74705SXin Li void modeledFunction(intptr p); 11*67e74705SXin Li 12*67e74705SXin Li // This function is modeled and returns true if the parameter is not zero 13*67e74705SXin Li // and there is no function definition available. 14*67e74705SXin Li bool notzero(int i); 15*67e74705SXin Li 16*67e74705SXin Li // This functions is not modeled and there is no function definition. 17*67e74705SXin Li // available 18*67e74705SXin Li bool notzero_notmodeled(int i); 19*67e74705SXin Li main()20*67e74705SXin Liint main() { 21*67e74705SXin Li // There is a nullpointer dereference inside this function. 22*67e74705SXin Li modeledFunction(0); 23*67e74705SXin Li 24*67e74705SXin Li int p = 0; 25*67e74705SXin Li if (notzero(p)) { 26*67e74705SXin Li // It is known that p != 0 because of the information provided by the 27*67e74705SXin Li // model of the notzero function. 28*67e74705SXin Li int j = 5 / p; 29*67e74705SXin Li } 30*67e74705SXin Li 31*67e74705SXin Li if (notzero_notmodeled(p)) { 32*67e74705SXin Li // There is no information about the value of p, because 33*67e74705SXin Li // notzero_notmodeled is not modeled and the function definition 34*67e74705SXin Li // is not available. 35*67e74705SXin Li int j = 5 / p; // expected-warning {{Division by zero}} 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li return 0; 39*67e74705SXin Li } 40*67e74705SXin Li 41*67e74705SXin Li // CHECK: <key>diagnostics</key> 42*67e74705SXin Li // CHECK-NEXT: <array> 43*67e74705SXin Li // CHECK-NEXT: <dict> 44*67e74705SXin Li // CHECK-NEXT: <key>path</key> 45*67e74705SXin Li // CHECK-NEXT: <array> 46*67e74705SXin Li // CHECK-NEXT: <dict> 47*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>control</string> 48*67e74705SXin Li // CHECK-NEXT: <key>edges</key> 49*67e74705SXin Li // CHECK-NEXT: <array> 50*67e74705SXin Li // CHECK-NEXT: <dict> 51*67e74705SXin Li // CHECK-NEXT: <key>start</key> 52*67e74705SXin Li // CHECK-NEXT: <array> 53*67e74705SXin Li // CHECK-NEXT: <dict> 54*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>22</integer> 55*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 56*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 57*67e74705SXin Li // CHECK-NEXT: </dict> 58*67e74705SXin Li // CHECK-NEXT: <dict> 59*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>22</integer> 60*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>17</integer> 61*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 62*67e74705SXin Li // CHECK-NEXT: </dict> 63*67e74705SXin Li // CHECK-NEXT: </array> 64*67e74705SXin Li // CHECK-NEXT: <key>end</key> 65*67e74705SXin Li // CHECK-NEXT: <array> 66*67e74705SXin Li // CHECK-NEXT: <dict> 67*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 68*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 69*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 70*67e74705SXin Li // CHECK-NEXT: </dict> 71*67e74705SXin Li // CHECK-NEXT: <dict> 72*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 73*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>5</integer> 74*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 75*67e74705SXin Li // CHECK-NEXT: </dict> 76*67e74705SXin Li // CHECK-NEXT: </array> 77*67e74705SXin Li // CHECK-NEXT: </dict> 78*67e74705SXin Li // CHECK-NEXT: </array> 79*67e74705SXin Li // CHECK-NEXT: </dict> 80*67e74705SXin Li // CHECK-NEXT: <dict> 81*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>event</string> 82*67e74705SXin Li // CHECK-NEXT: <key>location</key> 83*67e74705SXin Li // CHECK-NEXT: <dict> 84*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 85*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 86*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 87*67e74705SXin Li // CHECK-NEXT: </dict> 88*67e74705SXin Li // CHECK-NEXT: <key>ranges</key> 89*67e74705SXin Li // CHECK-NEXT: <array> 90*67e74705SXin Li // CHECK-NEXT: <array> 91*67e74705SXin Li // CHECK-NEXT: <dict> 92*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 93*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 94*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 95*67e74705SXin Li // CHECK-NEXT: </dict> 96*67e74705SXin Li // CHECK-NEXT: <dict> 97*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 98*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>7</integer> 99*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 100*67e74705SXin Li // CHECK-NEXT: </dict> 101*67e74705SXin Li // CHECK-NEXT: </array> 102*67e74705SXin Li // CHECK-NEXT: </array> 103*67e74705SXin Li // CHECK-NEXT: <key>depth</key><integer>0</integer> 104*67e74705SXin Li // CHECK-NEXT: <key>extended_message</key> 105*67e74705SXin Li // CHECK-NEXT: <string>'p' initialized to 0</string> 106*67e74705SXin Li // CHECK-NEXT: <key>message</key> 107*67e74705SXin Li // CHECK-NEXT: <string>'p' initialized to 0</string> 108*67e74705SXin Li // CHECK-NEXT: </dict> 109*67e74705SXin Li // CHECK-NEXT: <dict> 110*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>control</string> 111*67e74705SXin Li // CHECK-NEXT: <key>edges</key> 112*67e74705SXin Li // CHECK-NEXT: <array> 113*67e74705SXin Li // CHECK-NEXT: <dict> 114*67e74705SXin Li // CHECK-NEXT: <key>start</key> 115*67e74705SXin Li // CHECK-NEXT: <array> 116*67e74705SXin Li // CHECK-NEXT: <dict> 117*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 118*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 119*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 120*67e74705SXin Li // CHECK-NEXT: </dict> 121*67e74705SXin Li // CHECK-NEXT: <dict> 122*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>24</integer> 123*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>5</integer> 124*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 125*67e74705SXin Li // CHECK-NEXT: </dict> 126*67e74705SXin Li // CHECK-NEXT: </array> 127*67e74705SXin Li // CHECK-NEXT: <key>end</key> 128*67e74705SXin Li // CHECK-NEXT: <array> 129*67e74705SXin Li // CHECK-NEXT: <dict> 130*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>25</integer> 131*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 132*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 133*67e74705SXin Li // CHECK-NEXT: </dict> 134*67e74705SXin Li // CHECK-NEXT: <dict> 135*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>25</integer> 136*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>4</integer> 137*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 138*67e74705SXin Li // CHECK-NEXT: </dict> 139*67e74705SXin Li // CHECK-NEXT: </array> 140*67e74705SXin Li // CHECK-NEXT: </dict> 141*67e74705SXin Li // CHECK-NEXT: </array> 142*67e74705SXin Li // CHECK-NEXT: </dict> 143*67e74705SXin Li // CHECK-NEXT: <dict> 144*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>control</string> 145*67e74705SXin Li // CHECK-NEXT: <key>edges</key> 146*67e74705SXin Li // CHECK-NEXT: <array> 147*67e74705SXin Li // CHECK-NEXT: <dict> 148*67e74705SXin Li // CHECK-NEXT: <key>start</key> 149*67e74705SXin Li // CHECK-NEXT: <array> 150*67e74705SXin Li // CHECK-NEXT: <dict> 151*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>25</integer> 152*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 153*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 154*67e74705SXin Li // CHECK-NEXT: </dict> 155*67e74705SXin Li // CHECK-NEXT: <dict> 156*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>25</integer> 157*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>4</integer> 158*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 159*67e74705SXin Li // CHECK-NEXT: </dict> 160*67e74705SXin Li // CHECK-NEXT: </array> 161*67e74705SXin Li // CHECK-NEXT: <key>end</key> 162*67e74705SXin Li // CHECK-NEXT: <array> 163*67e74705SXin Li // CHECK-NEXT: <dict> 164*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 165*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 166*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 167*67e74705SXin Li // CHECK-NEXT: </dict> 168*67e74705SXin Li // CHECK-NEXT: <dict> 169*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 170*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>4</integer> 171*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 172*67e74705SXin Li // CHECK-NEXT: </dict> 173*67e74705SXin Li // CHECK-NEXT: </array> 174*67e74705SXin Li // CHECK-NEXT: </dict> 175*67e74705SXin Li // CHECK-NEXT: </array> 176*67e74705SXin Li // CHECK-NEXT: </dict> 177*67e74705SXin Li // CHECK-NEXT: <dict> 178*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>control</string> 179*67e74705SXin Li // CHECK-NEXT: <key>edges</key> 180*67e74705SXin Li // CHECK-NEXT: <array> 181*67e74705SXin Li // CHECK-NEXT: <dict> 182*67e74705SXin Li // CHECK-NEXT: <key>start</key> 183*67e74705SXin Li // CHECK-NEXT: <array> 184*67e74705SXin Li // CHECK-NEXT: <dict> 185*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 186*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>3</integer> 187*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 188*67e74705SXin Li // CHECK-NEXT: </dict> 189*67e74705SXin Li // CHECK-NEXT: <dict> 190*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 191*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>4</integer> 192*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 193*67e74705SXin Li // CHECK-NEXT: </dict> 194*67e74705SXin Li // CHECK-NEXT: </array> 195*67e74705SXin Li // CHECK-NEXT: <key>end</key> 196*67e74705SXin Li // CHECK-NEXT: <array> 197*67e74705SXin Li // CHECK-NEXT: <dict> 198*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 199*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>7</integer> 200*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 201*67e74705SXin Li // CHECK-NEXT: </dict> 202*67e74705SXin Li // CHECK-NEXT: <dict> 203*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 204*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>24</integer> 205*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 206*67e74705SXin Li // CHECK-NEXT: </dict> 207*67e74705SXin Li // CHECK-NEXT: </array> 208*67e74705SXin Li // CHECK-NEXT: </dict> 209*67e74705SXin Li // CHECK-NEXT: </array> 210*67e74705SXin Li // CHECK-NEXT: </dict> 211*67e74705SXin Li // CHECK-NEXT: <dict> 212*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>control</string> 213*67e74705SXin Li // CHECK-NEXT: <key>edges</key> 214*67e74705SXin Li // CHECK-NEXT: <array> 215*67e74705SXin Li // CHECK-NEXT: <dict> 216*67e74705SXin Li // CHECK-NEXT: <key>start</key> 217*67e74705SXin Li // CHECK-NEXT: <array> 218*67e74705SXin Li // CHECK-NEXT: <dict> 219*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 220*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>7</integer> 221*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 222*67e74705SXin Li // CHECK-NEXT: </dict> 223*67e74705SXin Li // CHECK-NEXT: <dict> 224*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>31</integer> 225*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>24</integer> 226*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 227*67e74705SXin Li // CHECK-NEXT: </dict> 228*67e74705SXin Li // CHECK-NEXT: </array> 229*67e74705SXin Li // CHECK-NEXT: <key>end</key> 230*67e74705SXin Li // CHECK-NEXT: <array> 231*67e74705SXin Li // CHECK-NEXT: <dict> 232*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>35</integer> 233*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>15</integer> 234*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 235*67e74705SXin Li // CHECK-NEXT: </dict> 236*67e74705SXin Li // CHECK-NEXT: <dict> 237*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>35</integer> 238*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>15</integer> 239*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 240*67e74705SXin Li // CHECK-NEXT: </dict> 241*67e74705SXin Li // CHECK-NEXT: </array> 242*67e74705SXin Li // CHECK-NEXT: </dict> 243*67e74705SXin Li // CHECK-NEXT: </array> 244*67e74705SXin Li // CHECK-NEXT: </dict> 245*67e74705SXin Li // CHECK-NEXT: <dict> 246*67e74705SXin Li // CHECK-NEXT: <key>kind</key><string>event</string> 247*67e74705SXin Li // CHECK-NEXT: <key>location</key> 248*67e74705SXin Li // CHECK-NEXT: <dict> 249*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>35</integer> 250*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>15</integer> 251*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 252*67e74705SXin Li // CHECK-NEXT: </dict> 253*67e74705SXin Li // CHECK-NEXT: <key>ranges</key> 254*67e74705SXin Li // CHECK-NEXT: <array> 255*67e74705SXin Li // CHECK-NEXT: <array> 256*67e74705SXin Li // CHECK-NEXT: <dict> 257*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>35</integer> 258*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>13</integer> 259*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 260*67e74705SXin Li // CHECK-NEXT: </dict> 261*67e74705SXin Li // CHECK-NEXT: <dict> 262*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>35</integer> 263*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>17</integer> 264*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 265*67e74705SXin Li // CHECK-NEXT: </dict> 266*67e74705SXin Li // CHECK-NEXT: </array> 267*67e74705SXin Li // CHECK-NEXT: </array> 268*67e74705SXin Li // CHECK-NEXT: <key>depth</key><integer>0</integer> 269*67e74705SXin Li // CHECK-NEXT: <key>extended_message</key> 270*67e74705SXin Li // CHECK-NEXT: <string>Division by zero</string> 271*67e74705SXin Li // CHECK-NEXT: <key>message</key> 272*67e74705SXin Li // CHECK-NEXT: <string>Division by zero</string> 273*67e74705SXin Li // CHECK-NEXT: </dict> 274*67e74705SXin Li // CHECK-NEXT: </array> 275*67e74705SXin Li // CHECK-NEXT: <key>description</key><string>Division by zero</string> 276*67e74705SXin Li // CHECK-NEXT: <key>category</key><string>Logic error</string> 277*67e74705SXin Li // CHECK-NEXT: <key>type</key><string>Division by zero</string> 278*67e74705SXin Li // CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> 279*67e74705SXin Li // CHECK-NEXT: <!-- This hash is experimental and going to change! --> 280*67e74705SXin Li // CHECK-NEXT: <key>issue_hash_content_of_line_in_context</key><string>86cb845e4f1e6abde1c5b319d5b08eca</string> 281*67e74705SXin Li // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> 282*67e74705SXin Li // CHECK-NEXT: <key>issue_context</key><string>main</string> 283*67e74705SXin Li // CHECK-NEXT: <key>issue_hash_function_offset</key><string>15</string> 284*67e74705SXin Li // CHECK-NEXT: <key>location</key> 285*67e74705SXin Li // CHECK-NEXT: <dict> 286*67e74705SXin Li // CHECK-NEXT: <key>line</key><integer>35</integer> 287*67e74705SXin Li // CHECK-NEXT: <key>col</key><integer>15</integer> 288*67e74705SXin Li // CHECK-NEXT: <key>file</key><integer>0</integer> 289*67e74705SXin Li // CHECK-NEXT: </dict> 290*67e74705SXin Li // CHECK-NEXT: </dict> 291*67e74705SXin Li // CHECK-NEXT: </array> 292