diff options
| author | Anna Zaks <ganna@apple.com> | 2015-02-05 01:02:59 +0000 |
|---|---|---|
| committer | Anna Zaks <ganna@apple.com> | 2015-02-05 01:02:59 +0000 |
| commit | f4c7ce8a37ea28fae52a4506bd1d2a4293f2dc4a (patch) | |
| tree | 91f754b4504428e01196aa97eb5832a11bfdcb31 /clang/test | |
| parent | 33f0632640b97d1f041f43a6f64f5f08aba55b40 (diff) | |
| download | bcm5719-llvm-f4c7ce8a37ea28fae52a4506bd1d2a4293f2dc4a.tar.gz bcm5719-llvm-f4c7ce8a37ea28fae52a4506bd1d2a4293f2dc4a.zip | |
[analyzer] Relax an assertion in VisitLvalArraySubscriptExpr
The analyzer thinks that ArraySubscriptExpr cannot be an r-value (ever).
However, it can be in some corner cases. Specifically, C forbids expressions
of unqualified void type from being l-values.
Note, the analyzer will keep modeling the subscript expr as an l-value. The
analyzer should be treating void* as a char array
(https://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Pointer-Arith.html).
llvm-svn: 228249
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Analysis/array-struct.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/test/Analysis/array-struct.c b/clang/test/Analysis/array-struct.c index c22f9796e58..28e09ad2e88 100644 --- a/clang/test/Analysis/array-struct.c +++ b/clang/test/Analysis/array-struct.c @@ -183,3 +183,19 @@ int offset_of_data_array(void) return ((char *)&(((struct s*)0)->data_array)) - ((char *)0); // no-warning } +int testPointerArithmeticOnVoid(void *bytes) { + int p = 0; + if (&bytes[0] == &bytes[1]) + return 6/p; // no-warning + return 0; +} + +int testRValueArraySubscriptExpr(void *bytes) { + int *p = (int*)&bytes[0]; + *p = 0; + if (*(int*)&bytes[0] == 0) + return 0; + return 5/(*p); // no-warning +} + + |

