From f2f639c4a781016ad146d44f463714fe4295cb6e Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 1 Feb 2021 21:52:41 -0500 Subject: [PATCH] analyzer: add more feasibility test cases [PR93355,PR96374] This patch adds a couple more reduced test cases derived from the integration test for PR analyzer/93355. In both cases, the analyzer falsely rejects the buggy code paths as being infeasible due to PR analyzer/96374, and so the tests are marked as XFAIL for now. gcc/testsuite/ChangeLog: PR analyzer/93355 PR analyzer/96374 * gcc.dg/analyzer/pr93355-localealias-feasibility-2.c: New test. * gcc.dg/analyzer/pr93355-localealias-feasibility-3.c: New test. --- .../pr93355-localealias-feasibility-2.c | 31 +++++++++ .../pr93355-localealias-feasibility-3.c | 64 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c create mode 100644 gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-3.c diff --git a/gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c b/gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c new file mode 100644 index 00000000000..1afc6df5da1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c @@ -0,0 +1,31 @@ +/* Simplified version of test to ensure we issue a FILE * leak diagnostic, + reproducing a feasibility issue. + Adapted from intl/localealias.c, with all #includes removed. */ + +/* { dg-do "compile" } */ + +#include "analyzer-decls.h" + +#define NULL ((void *) 0) +#define PATH_SEPARATOR ':' +#define LOCALE_ALIAS_PATH "value for LOCALE_ALIAS_PATH" + +const char * +_nl_expand_alias (void) +{ + static const char *locale_alias_path; + + if (locale_alias_path == NULL) + locale_alias_path = LOCALE_ALIAS_PATH; + + const char *start = locale_alias_path; + + while (locale_alias_path[0] != '\0' + && locale_alias_path[0] != PATH_SEPARATOR) + ++locale_alias_path; + + if (start < locale_alias_path) + __analyzer_dump_path (); /* { dg-message "path" "" { xfail *-*-* } } */ + /* XFAIL: PR analyzer/96374 + Use -fno-analyzer-feasibility to see the path. */ +} diff --git a/gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-3.c b/gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-3.c new file mode 100644 index 00000000000..a86483113ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-3.c @@ -0,0 +1,64 @@ +/* Simplified version of test to ensure we issue a FILE * leak diagnostic, + reproducing a feasibility issue. + Adapted from intl/localealias.c, with all #includes removed. */ + +/* { dg-do "compile" } */ + +/* Handle aliases for locale names. + Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* Minimal version of system headers. */ + +typedef __SIZE_TYPE__ size_t; +#define NULL ((void *)0) + +typedef struct _IO_FILE FILE; +extern FILE *fopen (const char *__restrict __filename, + const char *__restrict __modes); +extern int fclose (FILE *__stream); + +extern int isspace (int) __attribute__((__nothrow__, __leaf__)); + +/* Cleaned-up body of localealias.c follows. */ + +size_t +read_alias_file (const char *fname, char *cp) +{ + FILE *fp; + + fp = fopen (fname, "r"); /* { dg-message "opened here" "" { xfail *-*-* } } */ + /* XFAIL: PR analyzer/96374 + Use -fno-analyzer-feasibility to see the path. */ + if (fp == NULL) + return 0; + + if (cp[0] != '\0') + *cp++ = '\0'; + + while (isspace ((unsigned char)cp[0])) + ++cp; + + if (cp[0] != '\0') + return 42; /* { dg-warning "leak of FILE 'fp'" "" { xfail *-*-* } } */ + /* XFAIL: PR analyzer/96374 + Use -fno-analyzer-feasibility to see the path. */ + + fclose(fp); + + return 0; +} -- 2.30.2