| /* { dg-additional-options "-fdump-analyzer-untracked" } */ |
| |
| #include "analyzer-decls.h" |
| |
| struct st |
| { |
| const char *m_filename; |
| int m_line; |
| }; |
| |
| typedef struct boxed_int { int value; } boxed_int; |
| |
| extern void extern_fn (struct st *); |
| static void __attribute__((noinline)) internal_fn (struct st *) {} |
| extern int extern_get_int (void); |
| extern void extern_fn_char_ptr (const char *); |
| |
| void test_0 (void) |
| { |
| /* Not ever referenced; will get optimized away before |
| analyzer ever sees it, so no message. */ |
| static struct st s1 = { __FILE__, __LINE__ }; |
| } |
| |
| void test_1 (void) |
| { |
| static struct st s1 = { __FILE__, __LINE__ }; /* { dg-warning "track 's1': no" } */ |
| extern_fn (&s1); |
| } |
| |
| static struct st s2 = { __FILE__, __LINE__ }; /* { dg-warning "track 's2': yes" } */ |
| |
| void test_2 (void) |
| { |
| extern_fn (&s2); |
| } |
| |
| void test_3 (void) |
| { |
| struct st s3 = { __FILE__, __LINE__ }; /* { dg-warning "track 's3': yes" } */ |
| extern_fn (&s3); |
| } |
| |
| void test_3a (void) |
| { |
| struct st s3a = { "foo.c", 42 }; /* { dg-warning "track 's3a': yes" } */ |
| __analyzer_eval (s3a.m_filename[0] == 'f'); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (s3a.m_line == 42); /* { dg-warning "TRUE" } */ |
| extern_fn (&s3a); |
| __analyzer_eval (s3a.m_filename[0] == 'f'); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (s3a.m_line == 42); /* { dg-warning "UNKNOWN" } */ |
| } |
| |
| extern void called_by_test_4 (int *); |
| |
| int test_4 (void) |
| { |
| int i; /* { dg-warning "track 'i': yes" } */ |
| called_by_test_4 (&i); |
| return i; |
| } |
| |
| void test_5 (int i) |
| { |
| boxed_int bi5 = { i }; /* { dg-warning "track 'bi5': yes" } */ |
| } |
| |
| int test_6 (int i) |
| { |
| static boxed_int bi6; /* { dg-warning "track 'bi6': yes" } */ |
| bi6.value = i; |
| return bi6.value; |
| } |
| |
| int test_7 (void) |
| { |
| boxed_int bi7; /* { dg-warning "track 'bi7': yes" } */ |
| return bi7.value; /* { dg-warning "use of uninitialized value 'bi7.value'" "uninit" } */ |
| } |
| |
| void test_8 (void) |
| { |
| static struct st s8 = { __FILE__, __LINE__ }; /* { dg-warning "track 's8': no" } */ |
| extern_fn (&s8); |
| extern_fn (&s8); |
| } |
| |
| void test_9 (void) |
| { |
| static struct st s9 = { __FILE__, __LINE__ }; /* { dg-warning "track 's9': yes" } */ |
| internal_fn (&s9); |
| } |
| |
| int test_10 (void) |
| { |
| static struct st s10 = { __FILE__, __LINE__ }; /* { dg-warning "track 's10': yes" } */ |
| extern_fn (&s10); |
| return s10.m_line; |
| } |
| |
| int test_11 (void) |
| { |
| static struct st s10 = { __FILE__, __LINE__ }; /* { dg-warning "track 's10': yes" } */ |
| s10.m_line = extern_get_int (); |
| return 42; |
| } |
| |
| int test_12 (void (*fnptr) (struct st *)) |
| { |
| static struct st s12 = { __FILE__, __LINE__ }; /* { dg-warning "track 's12': yes" } */ |
| fnptr (&s12); |
| } |
| |
| void test_13 (void) |
| { |
| extern_fn_char_ptr (__func__); /* { dg-warning "track '__func__': no" } */ |
| } |
| |
| char t14_global_unused[100]; /* { dg-warning "track 't14_global_unused': yes" } */ |
| static char t14_static_unused[100]; /* { dg-warning "track 't14_static_unused': yes" } */ |
| char t14_global_used[100]; /* { dg-warning "track 't14_global_used': yes" } */ |
| static char t14_static_used[100]; /* { dg-warning "track 't14_static_used': yes" } */ |
| void test_14 (void) |
| { |
| extern_fn_char_ptr (t14_global_unused); |
| extern_fn_char_ptr (t14_static_unused); |
| extern_fn_char_ptr (t14_global_used); |
| __analyzer_eval (t14_global_used[0] == '\0'); /* { dg-warning "UNKNOWN" } */ |
| extern_fn_char_ptr (t14_static_used); |
| __analyzer_eval (t14_static_used[0] == '\0'); /* { dg-warning "UNKNOWN" } */ |
| } |