Successfully regrtested on x86_64-pc-linux-gnu. Pushed to trunk as r12-5757-g38a0ee2649ef236ea2763bb9cfc42dc917c7d3fd.
gcc/testsuite/ChangeLog: PR analyzer/103526 * gcc.dg/analyzer/pr103526.c: New test. Signed-off-by: David Malcolm <dmalc...@redhat.com> --- gcc/testsuite/gcc.dg/analyzer/pr103526.c | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/analyzer/pr103526.c diff --git a/gcc/testsuite/gcc.dg/analyzer/pr103526.c b/gcc/testsuite/gcc.dg/analyzer/pr103526.c new file mode 100644 index 00000000000..39d60fd853e --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr103526.c @@ -0,0 +1,50 @@ +#include <stdlib.h> +#include <string.h> + +struct game_state { + const char *word; + char *word_state; +}; + +const char *const teststr = "test string"; + +static struct game_state * +game_new(void) +{ + struct game_state tmp = {0}; + struct game_state *rval = NULL; + size_t wordlen; + + tmp.word = teststr; + wordlen = strlen(tmp.word); + if ((tmp.word_state = malloc(wordlen+1)) == NULL) + goto err; + if ((rval = malloc(sizeof(*rval))) == NULL) + goto err; + memcpy(rval, &tmp, sizeof(*rval)); + + return (rval); +err: + free(tmp.word_state); + free(rval); + return (NULL); +} /* { dg-bogus "leak" } */ + +static void +game_free(struct game_state *game) +{ + if (game == NULL) + return; + free(game->word_state); + free(game); +} + +int +main(void) +{ + struct game_state *game; + if ((game = game_new()) == NULL) + exit(1); + game_free(game); + exit(0); +} -- 2.26.3