diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/analyzer/pr103892.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr103892.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr103892.c b/gcc/testsuite/gcc.dg/analyzer/pr103892.c new file mode 100644 index 00000000000..e9775b69ad0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr103892.c @@ -0,0 +1,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); +} |