diff options
author | Anton Yartsev <anton.yartsev@gmail.com> | 2015-04-14 14:18:04 +0000 |
---|---|---|
committer | Anton Yartsev <anton.yartsev@gmail.com> | 2015-04-14 14:18:04 +0000 |
commit | b50f4ba461bcee9c3961646cb58ba440bbf99acb (patch) | |
tree | 8eaf7e845cc426ecd3a6dbafdeac15ab711df336 /clang/test/Analysis/malloc.c | |
parent | bc929b80dc5a1a7112015854ed3301c56203adbb (diff) | |
download | bcm5719-llvm-b50f4ba461bcee9c3961646cb58ba440bbf99acb.tar.gz bcm5719-llvm-b50f4ba461bcee9c3961646cb58ba440bbf99acb.zip |
[analyzer] This implements potential undefbehavior.ZeroAllocDereference checker.
TODO: support realloc(). Currently it is not possible due to the present realloc() handling. Currently RegionState is not being attached to realloc() in case of a zero Size argument.
llvm-svn: 234889
Diffstat (limited to 'clang/test/Analysis/malloc.c')
-rw-r--r-- | clang/test/Analysis/malloc.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/clang/test/Analysis/malloc.c b/clang/test/Analysis/malloc.c index 5762061ba13..662df4c28b7 100644 --- a/clang/test/Analysis/malloc.c +++ b/clang/test/Analysis/malloc.c @@ -200,6 +200,112 @@ void reallocfPtrZero1() { char *r = reallocf(0, 12); } // expected-warning {{Potential leak of memory pointed to by}} +//------------------- Check usage of zero-allocated memory --------------------- +void CheckUseZeroAllocatedNoWarn1() { + int *p = malloc(0); + free(p); // no warning +} + +void CheckUseZeroAllocatedNoWarn2() { + int *p = alloca(0); // no warning +} + +void CheckUseZeroAllocatedNoWarn3() { + int *p = malloc(0); + int *q = realloc(p, 8); // no warning + free(q); +} + +void CheckUseZeroAllocatedNoWarn4() { + int *p = realloc(0, 8); + *p = 1; // no warning + free(p); +} + +void CheckUseZeroAllocated1() { + int *p = malloc(0); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +char CheckUseZeroAllocated2() { + char *p = alloca(0); + return *p; // expected-warning {{Use of zero-allocated memory}} +} + +void UseZeroAllocated(int *p) { + if (p) + *p = 7; // expected-warning {{Use of zero-allocated memory}} +} +void CheckUseZeroAllocated3() { + int *p = malloc(0); + UseZeroAllocated(p); +} + +void f(char); +void CheckUseZeroAllocated4() { + char *p = valloc(0); + f(*p); // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +void CheckUseZeroAllocated5() { + int *p = calloc(0, 2); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +void CheckUseZeroAllocated6() { + int *p = calloc(2, 0); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +void CheckUseZeroAllocated7() { + int *p = realloc(0, 0); + *p = 1; //TODO: warn about use of zero-allocated memory + free(p); +} + +void CheckUseZeroAllocated8() { + int *p = malloc(8); + int *q = realloc(p, 0); + *q = 1; //TODO: warn about use of zero-allocated memory + free(q); +} + +void CheckUseZeroAllocated9() { + int *p = realloc(0, 0); + int *q = realloc(p, 0); + *q = 1; //TODO: warn about use of zero-allocated memory + free(q); +} + +void CheckUseZeroAllocatedPathNoWarn(_Bool b) { + int s = 0; + if (b) + s= 10; + + char *p = malloc(s); + + if (b) + *p = 1; // no warning + + free(p); +} + +void CheckUseZeroAllocatedPathWarn(_Bool b) { + int s = 10; + if (b) + s= 0; + + char *p = malloc(s); + + if (b) + *p = 1; // expected-warning {{Use of zero-allocated memory}} + + free(p); +} // This case tests that storing malloc'ed memory to a static variable which is // then returned is not leaked. In the absence of known contracts for functions |