diff options
Diffstat (limited to 'clang/test/Analysis/malloc.c')
-rw-r--r-- | clang/test/Analysis/malloc.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang/test/Analysis/malloc.c b/clang/test/Analysis/malloc.c index 2e5213e3746..a0296cb0036 100644 --- a/clang/test/Analysis/malloc.c +++ b/clang/test/Analysis/malloc.c @@ -627,8 +627,49 @@ void doNotInvalidateWhenPassedToSystemCalls(char *s) { char *p = malloc(12); strlen(p); strcpy(p, s); + strcpy(s, p); + strcpy(p, p); + memcpy(p, s, 1); + memcpy(s, p, 1); + memcpy(p, p, 1); } // expected-warning {{leak}} +// Treat source buffer contents as escaped. +void escapeSourceContents(char *s) { + char *p = malloc(12); + memcpy(s, &p, 12); // no warning + + void *p1 = malloc(7); + char *a; + memcpy(&a, &p1, sizeof a); + // FIXME: No warning due to limitations imposed by current modelling of + // 'memcpy' (regions metadata is not copied). + + int *ptrs[2]; + int *allocated = (int *)malloc(4); + memcpy(&ptrs[0], &allocated, sizeof(int *)); + // FIXME: No warning due to limitations imposed by current modelling of + // 'memcpy' (regions metadata is not copied). +} + +void invalidateDestinationContents() { + int *null = 0; + int *p = (int *)malloc(4); + memcpy(&p, &null, sizeof(int *)); + + int *ptrs1[2]; // expected-warning {{Potential leak of memory pointed to by}} + ptrs1[0] = (int *)malloc(4); + memcpy(ptrs1, &null, sizeof(int *)); + + int *ptrs2[2]; // expected-warning {{Potential memory leak}} + ptrs2[0] = (int *)malloc(4); + memcpy(&ptrs2[1], &null, sizeof(int *)); + + int *ptrs3[2]; // expected-warning {{Potential memory leak}} + ptrs3[0] = (int *)malloc(4); + memcpy(&ptrs3[0], &null, sizeof(int *)); +} // expected-warning {{Potential memory leak}} + // Rely on the CString checker evaluation of the strcpy API to convey that the result of strcpy is equal to p. void symbolLostWithStrcpy(char *s) { char *p = malloc(12); |