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