diff options
Diffstat (limited to 'clang/test/Analysis/malloc-three-arg.c')
| -rw-r--r-- | clang/test/Analysis/malloc-three-arg.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/clang/test/Analysis/malloc-three-arg.c b/clang/test/Analysis/malloc-three-arg.c new file mode 100644 index 00000000000..01b08aeda51 --- /dev/null +++ b/clang/test/Analysis/malloc-three-arg.c @@ -0,0 +1,58 @@ +// RUN: %clang -target x86_64-unknown-freebsd --analyze %s + +#include "Inputs/system-header-simulator.h" + +#define M_ZERO 0x0100 +#define NULL ((void *)0) + +void *malloc(size_t, void *, int); + +struct test { +}; + +void foo(struct test *); + +void test_zeroed() { + struct test **list, *t; + int i; + + list = malloc(sizeof(*list) * 10, NULL, M_ZERO); + if (list == NULL) + return; + + for (i = 0; i < 10; i++) { + t = list[i]; + foo(t); + } + free(list); // no-warning +} + +void test_nonzero() { + struct test **list, *t; + int i; + + list = malloc(sizeof(*list) * 10, NULL, 0); + if (list == NULL) + return; + + for (i = 0; i < 10; i++) { + t = list[i]; // expected-warning{{undefined}} + foo(t); + } + free(list); +} + +void test_indeterminate(int flags) { + struct test **list, *t; + int i; + + list = malloc(sizeof(*list) * 10, NULL, flags); + if (list == NULL) + return; + + for (i = 0; i < 10; i++) { + t = list[i]; // expected-warning{{undefined}} + foo(t); + } + free(list); +} |

