| // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store=region -verify %s |
| |
| #include "Inputs/system-header-simulator.h" |
| |
| typedef void* gpointer; |
| typedef const void* gconstpointer; |
| typedef unsigned long gsize; |
| typedef unsigned int guint; |
| |
| gpointer g_malloc(gsize n_bytes); |
| gpointer g_malloc0(gsize n_bytes); |
| gpointer g_realloc(gpointer mem, gsize n_bytes); |
| gpointer g_try_malloc(gsize n_bytes); |
| gpointer g_try_malloc0(gsize n_bytes); |
| gpointer g_try_realloc(gpointer mem, gsize n_bytes); |
| gpointer g_malloc_n(gsize n_blocks, gsize n_block_bytes); |
| gpointer g_malloc0_n(gsize n_blocks, gsize n_block_bytes); |
| gpointer g_realloc_n(gpointer mem, gsize n_blocks, gsize n_block_bytes); |
| gpointer g_try_malloc_n(gsize n_blocks, gsize n_block_bytes); |
| gpointer g_try_malloc0_n(gsize n_blocks, gsize n_block_bytes); |
| gpointer g_try_realloc_n(gpointer mem, gsize n_blocks, gsize n_block_bytes); |
| void g_free(gpointer mem); |
| gpointer g_memdup(gconstpointer mem, guint byte_size); |
| |
| static const gsize n_bytes = 1024; |
| |
| void f1() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); |
| |
| g_free(g1); |
| g_free(g2); |
| g_free(g2); // expected-warning{{Attempt to free released memory}} |
| } |
| |
| void f2() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); |
| |
| g_free(g1); |
| g_free(g2); |
| g_free(g3); |
| g3 = g_memdup(g3, n_bytes); // expected-warning{{Use of memory after it is freed}} |
| } |
| |
| void f3() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); // expected-warning{{Potential leak of memory pointed to by 'g4'}} |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g6'}} |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g5'}} |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} |
| |
| g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} |
| g_free(g2); |
| g_free(g3); |
| } |
| |
| void f4() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g6'}} |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g5'}} |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} |
| |
| g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} |
| g_free(g2); |
| g_free(g3); |
| g_free(g4); |
| } |
| |
| void f5() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g6'}} |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} |
| |
| g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} |
| g_free(g2); |
| g_free(g3); |
| g_free(g4); |
| g_free(g5); |
| } |
| |
| void f6() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} |
| |
| g_free(g1); // expected-warning{{Potential leak of memory pointed to by 'g7'}} |
| g_free(g2); |
| g_free(g3); |
| g_free(g4); |
| g_free(g5); |
| g_free(g6); |
| } |
| |
| void f7() { |
| gpointer g1 = g_malloc(n_bytes); |
| gpointer g2 = g_malloc0(n_bytes); |
| g1 = g_realloc(g1, n_bytes * 2); |
| gpointer g3 = g_try_malloc(n_bytes); |
| gpointer g4 = g_try_malloc0(n_bytes); |
| g3 = g_try_realloc(g3, n_bytes * 2); |
| gpointer g5 = g_malloc_n(n_bytes, sizeof(char)); |
| gpointer g6 = g_malloc0_n(n_bytes, sizeof(char)); |
| g5 = g_realloc_n(g5, n_bytes * 2, sizeof(char)); |
| gpointer g7 = g_try_malloc_n(n_bytes, sizeof(char)); |
| gpointer g8 = g_try_malloc0_n(n_bytes, sizeof(char)); |
| g7 = g_try_realloc_n(g7, n_bytes * 2, sizeof(char)); // expected-warning{{Potential leak of memory pointed to by 'g8'}} |
| |
| g_free(g1); |
| g_free(g2); |
| g_free(g3); |
| g_free(g4); |
| g_free(g5); |
| g_free(g6); |
| g_free(g7); |
| } |