(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
pr103892.c
       1  /* { dg-additional-options "-O2" } */
       2  
       3  extern void free (void *__ptr) __attribute__ ((__nothrow__ , __leaf__));
       4  
       5  enum pipecmd_tag
       6  {
       7   PIPECMD_PROCESS,
       8   PIPECMD_SEQUENCE
       9  };
      10  
      11  struct pipecmd {
      12   enum pipecmd_tag tag;
      13   union {
      14    struct pipecmd_process {
      15     int argc;
      16     int argv_max;
      17     char **argv;
      18    } process;
      19    struct pipecmd_sequence {
      20     int ncommands;
      21     int commands_max;
      22     struct pipecmd **commands;
      23    } sequence;
      24   } u;
      25  };
      26  
      27  static char *argstr_get_word (const char **argstr)
      28  {
      29   while (**argstr) {
      30    switch (**argstr) {
      31     case ' ':
      32     case '\t':
      33      return (void *) 0;
      34    }
      35   }
      36   return (void *) 0;
      37  }
      38  
      39  struct pipecmd *pipecmd_new_argstr (const char *argstr)
      40  {
      41   argstr_get_word (&argstr);
      42   return (void *) 0;
      43  }
      44  
      45  void pipecmd_free (struct pipecmd *cmd)
      46  {
      47   int i;
      48  
      49   if (!cmd)
      50    return;
      51  
      52   switch (cmd->tag) {
      53    case PIPECMD_PROCESS: {
      54     struct pipecmd_process *cmdp = &cmd->u.process;
      55  
      56     for (i = 0; i < cmdp->argc; ++i)
      57      free (cmdp->argv[i]);
      58     free (cmdp->argv);
      59  
      60     break;
      61    }
      62  
      63    case PIPECMD_SEQUENCE: {
      64     struct pipecmd_sequence *cmds = &cmd->u.sequence;
      65  
      66     for (i = 0; i < cmds->ncommands; ++i)
      67      pipecmd_free (cmds->commands[i]);
      68     free (cmds->commands);
      69  
      70     break;
      71    }
      72   }
      73  
      74   free (cmd);
      75  }