inline.c revision 0849ade4bb3e90c2fc0ce01ccd330f76f91da732
1// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-inline-call -analyzer-store region -verify %s 2 3int test1_f1() { 4 int y = 1; 5 y++; 6 return y; 7} 8 9void test1_f2() { 10 int x = 1; 11 x = test1_f1(); 12 if (x == 1) { 13 int *p = 0; 14 *p = 3; // no-warning 15 } 16 if (x == 2) { 17 int *p = 0; 18 *p = 3; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}} 19 } 20} 21 22// Test that inlining works when the declared function has less arguments 23// than the actual number in the declaration. 24void test2_f1() {} 25int test2_f2(); 26 27void test2_f3() { 28 test2_f1(test2_f2()); // expected-warning{{too many arguments in call to 'test2_f1'}} 29} 30 31// Test that inlining works with recursive functions. 32 33unsigned factorial(unsigned x) { 34 if (x <= 1) 35 return 1; 36 return x * factorial(x - 1); 37} 38 39void test_factorial() { 40 if (factorial(3) == 6) { 41 int *p = 0; 42 *p = 0xDEADBEEF; // expected-warning {{null}} 43 } 44 else { 45 int *p = 0; 46 *p = 0xDEADBEEF; // no-warning 47 } 48} 49 50void test_factorial_2() { 51 unsigned x = factorial(3); 52 if (x == factorial(3)) { 53 int *p = 0; 54 *p = 0xDEADBEEF; // expected-warning {{null}} 55 } 56 else { 57 int *p = 0; 58 *p = 0xDEADBEEF; // no-warning 59 } 60} 61