| // RUN: %clang_analyze_cc1 -triple x86_64-unknown-linux %s |
| |
| #include "Inputs/system-header-simulator.h" |
| |
| #define __GFP_ZERO 0x8000 |
| #define NULL ((void *)0) |
| |
| void *kmalloc(size_t, int); |
| |
| struct test { |
| }; |
| |
| void foo(struct test *); |
| |
| void test_zeroed() { |
| struct test **list, *t; |
| int i; |
| |
| list = kmalloc(sizeof(*list) * 10, __GFP_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 = kmalloc(sizeof(*list) * 10, 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 = kmalloc(sizeof(*list) * 10, flags); |
| if (list == NULL) |
| return; |
| |
| for (i = 0; i < 10; i++) { |
| t = list[i]; // expected-warning{{undefined}} |
| foo(t); |
| } |
| free(list); |
| } |