diff options
-rw-r--r-- | test/Analysis/PR3135.c | 20 | ||||
-rw-r--r-- | test/Analysis/misc-ps-region-store.m | 16 |
2 files changed, 16 insertions, 20 deletions
diff --git a/test/Analysis/PR3135.c b/test/Analysis/PR3135.c deleted file mode 100644 index 1fca57b47b..0000000000 --- a/test/Analysis/PR3135.c +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: clang-cc -analyze -checker-cfref -analyzer-store=region -verify %s -// PR3135 - -typedef struct { - int *a; -} structure; - -int bar(structure *x); - -int foo() -{ - int x; - structure y = {&x}; - - // the call to bar may initialize x - if (bar(&y) && x) // no-warning - return 1; - - return 0; -} diff --git a/test/Analysis/misc-ps-region-store.m b/test/Analysis/misc-ps-region-store.m index 90242abbbd..45eb4a252c 100644 --- a/test/Analysis/misc-ps-region-store.m +++ b/test/Analysis/misc-ps-region-store.m @@ -454,3 +454,19 @@ int *test_cwe466_return_outofbounds_pointer() { return p; // expected-warning{{Returned pointer value points outside the original object}} } +//===----------------------------------------------------------------------===// +// PR 3135 - Test case that shows that a variable may get invalidated when its +// address is included in a structure that is passed-by-value to an unknown function. +//===----------------------------------------------------------------------===// + +typedef struct { int *a; } pr3135_structure; +int pr3135_bar(pr3135_structure *x); +int pr3135() { + int x; + pr3135_structure y = { &x }; + // the call to pr3135_bar may initialize x + if (pr3135_bar(&y) && x) // no-warning + return 1; + return 0; +} + |