| // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc -verify %s |
| |
| #include "Inputs/system-header-simulator-for-malloc.h" |
| |
| struct Obj { |
| int field; |
| }; |
| |
| void use(void *ptr); |
| |
| void test_direct_param_uaf() { |
| int *p = (int *)malloc(sizeof(int)); |
| free(p); |
| use(p); // expected-warning{{Use of memory after it is released}} |
| } |
| |
| void test_struct_field_uaf() { |
| struct Obj *o = (struct Obj *)malloc(sizeof(struct Obj)); |
| free(o); |
| use(&o->field); // expected-warning{{Use of memory after it is released}} |
| } |
| |
| void test_no_warning_const_int() { |
| use((void *)0x1234); // no-warning |
| } |
| |
| void test_no_warning_stack() { |
| int x = 42; |
| use(&x); // no-warning |
| } |
| |
| void test_nested_alloc() { |
| struct Obj *o = (struct Obj *)malloc(sizeof(struct Obj)); |
| use(o); // no-warning |
| free(o); |
| use(o); // expected-warning{{Use of memory after it is released}} |
| } |
| |
| void test_nested_field() { |
| struct Obj *o = (struct Obj *)malloc(sizeof(struct Obj)); |
| int *f = &o->field; |
| free(o); |
| use(f); // expected-warning{{Use of memory after it is released}} |
| } |