// 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); 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); 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); 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'}} g_free(g1); g_free(g2); g_free(g3); }