summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/analyzer/pr103892.c
blob: e9775b69ad0bf76d0b5879c624881672f5495e5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* { dg-additional-options "-O2" } */

extern void free (void *__ptr) __attribute__ ((__nothrow__ , __leaf__));

enum pipecmd_tag
{
 PIPECMD_PROCESS,
 PIPECMD_SEQUENCE
};

struct pipecmd {
 enum pipecmd_tag tag;
 union {
  struct pipecmd_process {
   int argc;
   int argv_max;
   char **argv;
  } process;
  struct pipecmd_sequence {
   int ncommands;
   int commands_max;
   struct pipecmd **commands;
  } sequence;
 } u;
};

static char *argstr_get_word (const char **argstr)
{
 while (**argstr) {
  switch (**argstr) {
   case ' ':
   case '\t':
    return (void *) 0;
  }
 }
 return (void *) 0;
}

struct pipecmd *pipecmd_new_argstr (const char *argstr)
{
 argstr_get_word (&argstr);
 return (void *) 0;
}

void pipecmd_free (struct pipecmd *cmd)
{
 int i;

 if (!cmd)
  return;

 switch (cmd->tag) {
  case PIPECMD_PROCESS: {
   struct pipecmd_process *cmdp = &cmd->u.process;

   for (i = 0; i < cmdp->argc; ++i)
    free (cmdp->argv[i]);
   free (cmdp->argv);

   break;
  }

  case PIPECMD_SEQUENCE: {
   struct pipecmd_sequence *cmds = &cmd->u.sequence;

   for (i = 0; i < cmds->ncommands; ++i)
    pipecmd_free (cmds->commands[i]);
   free (cmds->commands);

   break;
  }
 }

 free (cmd);
}