diff options
author | Jordan Rose <jordan_rose@apple.com> | 2013-04-15 20:39:41 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2013-04-15 20:39:41 +0000 |
commit | e0208ff84598f48e0aafecf5b543afeff8574045 (patch) | |
tree | 866181b39ad305537d9b2bd26a149b09dffcdc4b /test/Analysis | |
parent | 9a0b3c2f7c440c53b65bd1b085a7471d9f7ed490 (diff) |
[analyzer] Properly invalidate global regions on opaque function calls.
This fixes a regression where a call to a function we can't reason about
would not actually invalidate global regions that had explicit bindings.
void test_that_now_works() {
globalInt = 42;
clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
invalidateGlobals();
clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
}
This has probably been around since the initial "cluster" refactoring of
RegionStore, if not longer.
<rdar://problem/13464044>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179553 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/global_region_invalidation.mm | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/test/Analysis/global_region_invalidation.mm b/test/Analysis/global_region_invalidation.mm index f853470a5f..5e9f1bcb83 100644 --- a/test/Analysis/global_region_invalidation.mm +++ b/test/Analysis/global_region_invalidation.mm @@ -19,27 +19,37 @@ void testGlobalRef() { } extern int globalInt; +extern struct { + int value; +} globalStruct; extern void invalidateGlobals(); void testGlobalInvalidation() { + clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} + clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} + if (globalInt != 42) return; + if (globalStruct.value != 43) + return; clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} + clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} invalidateGlobals(); clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} + clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} } - -//--------------------------------- -// False negatives -//--------------------------------- - void testGlobalInvalidationWithDirectBinding() { + clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} + clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} + globalInt = 42; + globalStruct.value = 43; clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} + clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}} invalidateGlobals(); - // FIXME: Should be UNKNOWN. - clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}} + clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}} + clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}} } |