diff options
| author | Artem Dergachev <artem.dergachev@gmail.com> | 2018-05-04 22:11:12 +0000 |
|---|---|---|
| committer | Artem Dergachev <artem.dergachev@gmail.com> | 2018-05-04 22:11:12 +0000 |
| commit | e603e076f5b3ac7a5c31c4329abdc6cdc2db58e2 (patch) | |
| tree | 4b3cbbafb4c0d40906b55fbf1a62ad677179b894 /clang/test | |
| parent | 806486c7818ece98a00fb0ed988b2a3dd982f5c4 (diff) | |
| download | bcm5719-llvm-e603e076f5b3ac7a5c31c4329abdc6cdc2db58e2.tar.gz bcm5719-llvm-e603e076f5b3ac7a5c31c4329abdc6cdc2db58e2.zip | |
[analyzer] pr36458: Fix retrieved value cast for symbolic void pointers.
C allows us to write any bytes into any memory region. When loading weird bytes
from memory regions of known types, the analyzer is required to make sure that
the loaded value makes sense by casting it to an appropriate type.
Fix such cast for loading values that represent void pointers from non-void
pointer type places.
Differential Revision: https://reviews.llvm.org/D46415
llvm-svn: 331562
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Analysis/casts.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/test/Analysis/casts.c b/clang/test/Analysis/casts.c index 24bba8a30a0..548b4223b6a 100644 --- a/clang/test/Analysis/casts.c +++ b/clang/test/Analysis/casts.c @@ -149,3 +149,25 @@ void multiDimensionalArrayPointerCasts() { clang_analyzer_eval(*((char *)y1) == *((char *) y3)); // expected-warning{{TRUE}} } + +void *getVoidPtr(); + +void testCastVoidPtrToIntPtrThroughIntTypedAssignment() { + int *x; + (*((int *)(&x))) = (int)getVoidPtr(); + *x = 1; // no-crash +} + +void testCastUIntPtrToIntPtrThroughIntTypedAssignment() { + unsigned u; + int *x; + (*((int *)(&x))) = (int)&u; + *x = 1; + clang_analyzer_eval(u == 1); // expected-warning{{TRUE}} +} + +void testCastVoidPtrToIntPtrThroughUIntTypedAssignment() { + int *x; + (*((int *)(&x))) = (int)(unsigned *)getVoidPtr(); + *x = 1; // no-crash +} |

