inline.c revision e4d653b5a4cba281502177f6ef03d43e3ebb2b6a
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
62// Test that returning stack memory from a parent stack frame does
63// not trigger a warning.
64static char *return_buf(char *buf) {
65  return buf + 10;
66}
67
68void test_return_stack_memory_ok() {
69  char stack_buf[100];
70  char *pos = return_buf(stack_buf);
71  (void) pos;
72}
73
74char *test_return_stack_memory_bad() {
75  char stack_buf[100];
76  char *x = stack_buf;
77  return x; // expected-warning {{stack memory associated}}
78}
79
80// Test that passing a struct value with an uninitialized field does
81// not trigger a warning if we are inlining and the body is available.
82struct rdar10977037 { int x, y; };
83int test_rdar10977037_aux(struct rdar10977037 v) { return v.y; }
84int test_rdar10977037_aux_2(struct rdar10977037 v);
85int test_rdar10977037() {
86  struct rdar10977037 v;
87  v.y = 1;
88  v. y += test_rdar10977037_aux(v); // no-warning
89  return test_rdar10977037_aux_2(v); // expected-warning {{Passed-by-value struct argument contains uninitialized data}}
90}
91
92
93