/* Example of interprocedural detection of an uninitialized field in a heap-allocated struct. */ #include #include "analyzer-decls.h" struct foo { int i; int j; int k; }; struct foo *__attribute__((noinline)) alloc_foo (int a, int b) { struct foo *p = malloc (sizeof (struct foo)); if (!p) return NULL; p->i = a; p->k = b; return p; } void test (int x, int y, int z) { struct foo *p = alloc_foo (x, z); if (!p) return; __analyzer_eval (p->i == x); /* { dg-warning "TRUE" } */ __analyzer_eval (p->j == y); /* { dg-warning "UNKNOWN" "unknown" } */ /* { dg-warning "use of uninitialized value '\\*p\\.j'" "uninit" { target *-*-* } .-1 } */ __analyzer_eval (p->k == z); /* { dg-warning "TRUE" } */ free (p); }