Anna Zaks | 2b68761 | 2013-02-07 23:05:37 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s |
| 2 | |
| 3 | void clang_analyzer_eval(int); |
| 4 | |
| 5 | void use(int); |
| 6 | id foo(int x) { |
| 7 | if (x) |
| 8 | return 0; |
| 9 | static id p = foo(1); |
| 10 | clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} |
| 11 | return p; |
Jordan Rose | fbdbed3 | 2013-02-25 19:45:34 +0000 | [diff] [blame] | 12 | } |
| 13 | |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 14 | const int &globalIntRef = 42; |
Jordan Rose | fbdbed3 | 2013-02-25 19:45:34 +0000 | [diff] [blame] | 15 | |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 16 | void testGlobalRef() { |
Jordan Rose | fbdbed3 | 2013-02-25 19:45:34 +0000 | [diff] [blame] | 17 | // FIXME: Should be TRUE, but should at least not crash. |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 18 | clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}} |
| 19 | } |
| 20 | |
| 21 | extern int globalInt; |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 22 | extern struct { |
| 23 | int value; |
| 24 | } globalStruct; |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 25 | extern void invalidateGlobals(); |
| 26 | |
| 27 | void testGlobalInvalidation() { |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 28 | clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| 29 | clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| 30 | |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 31 | if (globalInt != 42) |
| 32 | return; |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 33 | if (globalStruct.value != 43) |
| 34 | return; |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 35 | clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 36 | clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 37 | |
| 38 | invalidateGlobals(); |
Jordan Rose | fbdbed3 | 2013-02-25 19:45:34 +0000 | [diff] [blame] | 39 | clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 40 | clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
Jordan Rose | fbdbed3 | 2013-02-25 19:45:34 +0000 | [diff] [blame] | 41 | } |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 42 | |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 43 | void testGlobalInvalidationWithDirectBinding() { |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 44 | clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| 45 | clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
| 46 | |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 47 | globalInt = 42; |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 48 | globalStruct.value = 43; |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 49 | clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 50 | clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 51 | |
| 52 | invalidateGlobals(); |
Jordan Rose | e0208ff | 2013-04-15 20:39:41 +0000 | [diff] [blame^] | 53 | clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} |
| 54 | clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} |
Jordan Rose | f8e2c06 | 2013-03-20 20:36:01 +0000 | [diff] [blame] | 55 | } |