diff options
author | David Malcolm <dmalcolm@redhat.com> | 2021-12-02 11:48:04 -0500 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2021-12-02 14:05:31 -0500 |
commit | 38a0ee2649ef236ea2763bb9cfc42dc917c7d3fd (patch) | |
tree | 529afc277d9c7289e8e1d3a8b360a6d200792a58 /gcc | |
parent | cd47cd4b5eb2dfa7a3190e46a3ae93cc87dbe6b1 (diff) | |
download | gcc-38a0ee2649ef236ea2763bb9cfc42dc917c7d3fd.zip gcc-38a0ee2649ef236ea2763bb9cfc42dc917c7d3fd.tar.gz gcc-38a0ee2649ef236ea2763bb9cfc42dc917c7d3fd.tar.bz2 |
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 <dmalcolm@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr103526.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr103526.c b/gcc/testsuite/gcc.dg/analyzer/pr103526.c new file mode 100644 index 0000000..39d60fd --- /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); +} |