From 38a0ee2649ef236ea2763bb9cfc42dc917c7d3fd Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Thu, 2 Dec 2021 11:48:04 -0500 Subject: [PATCH] analyzer: add regression test for leak false +ve [PR103526] gcc/testsuite/ChangeLog: PR analyzer/103526 * gcc.dg/analyzer/pr103526.c: New test. Signed-off-by: David Malcolm --- 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 000000000000..39d60fd853e1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr103526.c @@ -0,0 +1,50 @@ +#include +#include + +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.47.2