(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
untracked-1.c
       1  /* { dg-additional-options "-fdump-analyzer-untracked" } */
       2  
       3  #include "analyzer-decls.h"
       4  
       5  struct st
       6  {
       7    const char *m_filename;
       8    int m_line;
       9  };
      10  
      11  typedef struct boxed_int { int value; } boxed_int;
      12  
      13  extern void extern_fn (struct st *);
      14  static void __attribute__((noinline)) internal_fn (struct st *) {}
      15  extern int extern_get_int (void);
      16  extern void extern_fn_char_ptr (const char *);
      17  
      18  void test_0 (void)
      19  {
      20    /* Not ever referenced; will get optimized away before
      21       analyzer ever sees it, so no message.  */
      22    static struct st s1 = { __FILE__, __LINE__ };
      23  }
      24  
      25  void test_1 (void)
      26  {
      27    static struct st s1 = { __FILE__, __LINE__ }; /* { dg-warning "track 's1': no" } */
      28    extern_fn (&s1);
      29  }
      30  
      31  static struct st s2 = { __FILE__, __LINE__ }; /* { dg-warning "track 's2': yes" } */
      32  
      33  void test_2 (void)
      34  {
      35    extern_fn (&s2);
      36  }
      37  
      38  void test_3 (void)
      39  {
      40    struct st s3 = { __FILE__, __LINE__ }; /* { dg-warning "track 's3': yes" } */
      41    extern_fn (&s3);
      42  }
      43  
      44  void test_3a (void)
      45  {
      46    struct st s3a = { "foo.c", 42 }; /* { dg-warning "track 's3a': yes" } */
      47    __analyzer_eval (s3a.m_filename[0] == 'f'); /* { dg-warning "TRUE" } */
      48    __analyzer_eval (s3a.m_line == 42); /* { dg-warning "TRUE" } */
      49    extern_fn (&s3a);
      50    __analyzer_eval (s3a.m_filename[0] == 'f'); /* { dg-warning "UNKNOWN" } */
      51    __analyzer_eval (s3a.m_line == 42); /* { dg-warning "UNKNOWN" } */
      52  }
      53  
      54  extern void called_by_test_4 (int *);
      55  
      56  int test_4 (void)
      57  {
      58    int i; /* { dg-warning "track 'i': yes" } */
      59    called_by_test_4 (&i);
      60    return i;
      61  }
      62  
      63  void test_5 (int i)
      64  {
      65    boxed_int bi5 = { i }; /* { dg-warning "track 'bi5': yes" } */
      66  }
      67  
      68  int test_6 (int i)
      69  {
      70    static boxed_int bi6; /* { dg-warning "track 'bi6': yes" } */
      71    bi6.value = i;
      72    return bi6.value;
      73  }
      74  
      75  int test_7 (void)
      76  {
      77    boxed_int bi7; /* { dg-warning "track 'bi7': yes" } */
      78    return bi7.value; /* { dg-warning "use of uninitialized value 'bi7.value'" "uninit" } */
      79  }
      80  
      81  void test_8 (void)
      82  {
      83    static struct st s8 = { __FILE__, __LINE__ }; /* { dg-warning "track 's8': no" } */
      84    extern_fn (&s8);
      85    extern_fn (&s8);
      86  }
      87  
      88  void test_9 (void)
      89  {
      90    static struct st s9 = { __FILE__, __LINE__ }; /* { dg-warning "track 's9': yes" } */
      91    internal_fn (&s9);
      92  }
      93  
      94  int test_10 (void)
      95  {
      96    static struct st s10 = { __FILE__, __LINE__ }; /* { dg-warning "track 's10': yes" } */
      97    extern_fn (&s10);
      98    return s10.m_line;
      99  }
     100  
     101  int test_11 (void)
     102  {
     103    static struct st s10 = { __FILE__, __LINE__ }; /* { dg-warning "track 's10': yes" } */
     104    s10.m_line = extern_get_int ();
     105    return 42;
     106  }
     107  
     108  int test_12 (void (*fnptr) (struct st *))
     109  {
     110    static struct st s12 = { __FILE__, __LINE__ }; /* { dg-warning "track 's12': yes" } */
     111    fnptr (&s12);
     112  }
     113  
     114  void test_13 (void)
     115  {
     116    extern_fn_char_ptr (__func__); /* { dg-warning "track '__func__': no" } */
     117  }
     118  
     119  char t14_global_unused[100]; /* { dg-warning "track 't14_global_unused': yes" } */
     120  static char t14_static_unused[100]; /* { dg-warning "track 't14_static_unused': yes" } */
     121  char t14_global_used[100]; /* { dg-warning "track 't14_global_used': yes" } */
     122  static char t14_static_used[100]; /* { dg-warning "track 't14_static_used': yes" } */
     123  void test_14 (void)
     124  {
     125    extern_fn_char_ptr (t14_global_unused);
     126    extern_fn_char_ptr (t14_static_unused);
     127    extern_fn_char_ptr (t14_global_used);
     128    __analyzer_eval (t14_global_used[0] == '\0'); /* { dg-warning "UNKNOWN" } */
     129    extern_fn_char_ptr (t14_static_used);
     130    __analyzer_eval (t14_static_used[0] == '\0'); /* { dg-warning "UNKNOWN" } */
     131  }