Viewing file: malloc-vs-local-3.c (1.31 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#include <stdlib.h> #include "analyzer-decls.h"
extern int foo (int);
static int __attribute__((noinline)) do_stuff_2 (int *p, int n) { return 0; }
/* As malloc-vs-local-2.c, but with a memory leak for the "on the heap case" by not attempting to free at the end. */
int test_1 (int n) { int buf[10]; int *ptr; int result;
if (n > 10) ptr = (int *)malloc (sizeof (int) * n); else ptr = buf;
__analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
{ int *p = ptr; int sum = 0; int i; for (i = 0; i < n; i++) p[i] = i; /* { dg-warning "dereference of possibly-NULL" } */ for (i = 0; i < n; i++) sum += foo (p[i]); /* { dg-bogus "uninitialized" } */ result = sum; }
__analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
return result; /* { dg-message "leak of 'p'|leak of 'ptr'" } */ }
/* A simpler version of the above. */
int test_2 (int n) { int buf[10]; int *ptr; int result;
if (n > 10) ptr = (int *)malloc (sizeof (int) * n); else ptr = buf;
__analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff_2 (ptr, n);
__analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
return result; /* { dg-message "leak of 'ptr'" } */ }
|