1ee04959f88e26ed38dccf4aed2ff10cad1f703c9Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
2ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
3ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rosevoid clang_analyzer_eval(int);
4e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rosevoid clang_analyzer_checkInlined(int);
51c625f25055331bf76ab5479a8060d2b0f61e8b8Zhongxing Xu
6d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenekint test1_f1() {
706079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  int y = 1;
806079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  y++;
9e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rose  clang_analyzer_checkInlined(1); // expected-warning{{TRUE}}
1006079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  return y;
1106079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu}
1206079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu
13d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenekvoid test1_f2() {
1406079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  int x = 1;
15d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek  x = test1_f1();
1606079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  if (x == 1) {
1706079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu    int *p = 0;
1806079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu    *p = 3; // no-warning
1906079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  }
2006079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  if (x == 2) {
2106079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu    int *p = 0;
22452b84ded735d7e7de6d099953ab959a4c9910f0Ted Kremenek    *p = 3; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
2306079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu  }
2406079d1d1eb04e8d3d874311aafd605c8ec3cafcZhongxing Xu}
25d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek
26d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek// Test that inlining works when the declared function has less arguments
27d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek// than the actual number in the declaration.
28d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenekvoid test2_f1() {}
29d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenekint test2_f2();
30d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek
31d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenekvoid test2_f3() {
32d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek  test2_f1(test2_f2()); // expected-warning{{too many arguments in call to 'test2_f1'}}
33d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek}
34d4f482aa4d77ed2fa6dfbe60ff33599419680818Ted Kremenek
350849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek// Test that inlining works with recursive functions.
360849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek
370849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenekunsigned factorial(unsigned x) {
380849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  if (x <= 1)
390849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    return 1;
400849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  return x * factorial(x - 1);
410849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek}
420849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek
430849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenekvoid test_factorial() {
440849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  if (factorial(3) == 6) {
450849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    int *p = 0;
460849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    *p = 0xDEADBEEF;  // expected-warning {{null}}
470849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  }
480849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  else {
490849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    int *p = 0;
500849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    *p = 0xDEADBEEF; // no-warning
510849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  }
520849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek}
530849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek
540849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenekvoid test_factorial_2() {
550849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  unsigned x = factorial(3);
560849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  if (x == factorial(3)) {
570849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    int *p = 0;
580849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    *p = 0xDEADBEEF;  // expected-warning {{null}}
590849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  }
600849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  else {
610849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    int *p = 0;
620849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek    *p = 0xDEADBEEF; // no-warning
630849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek  }
640849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek}
657e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek
667e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek// Test that returning stack memory from a parent stack frame does
677e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek// not trigger a warning.
687e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenekstatic char *return_buf(char *buf) {
697e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  return buf + 10;
707e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek}
717e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek
727e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenekvoid test_return_stack_memory_ok() {
737e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  char stack_buf[100];
747e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  char *pos = return_buf(stack_buf);
757e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  (void) pos;
767e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek}
777e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek
787e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenekchar *test_return_stack_memory_bad() {
797e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  char stack_buf[100];
807e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  char *x = stack_buf;
817e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek  return x; // expected-warning {{stack memory associated}}
827e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek}
837e8678314cf19f28cfddb2d9d0567d993073ec7eTed Kremenek
84e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek// Test that passing a struct value with an uninitialized field does
85e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek// not trigger a warning if we are inlining and the body is available.
86e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenekstruct rdar10977037 { int x, y; };
87e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenekint test_rdar10977037_aux(struct rdar10977037 v) { return v.y; }
88e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenekint test_rdar10977037_aux_2(struct rdar10977037 v);
89e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenekint test_rdar10977037() {
90e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek  struct rdar10977037 v;
91e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek  v.y = 1;
92e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek  v. y += test_rdar10977037_aux(v); // no-warning
93e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek  return test_rdar10977037_aux_2(v); // expected-warning {{Passed-by-value struct argument contains uninitialized data}}
94e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek}
95e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek
96e4d653b5a4cba281502177f6ef03d43e3ebb2b6aTed Kremenek
97ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose// Test inlining a forward-declared function.
98ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose// This regressed when CallEvent was first introduced.
99ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Roseint plus1(int x);
100ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rosevoid test() {
101ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  clang_analyzer_eval(plus1(2) == 3); // expected-warning{{TRUE}}
102ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose}
103ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
104ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Roseint plus1(int x) {
105ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  return x + 1;
106ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose}
107ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
108e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rose
109e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rosevoid never_called_by_anyone() {
110e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rose  clang_analyzer_checkInlined(0); // no-warning
111e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rose}
112e5399f1375f8571bdd821ae08291af1c895adfd3Jordan Rose
113