analyzer: add more feasibility test cases [PR93355,PR96374]
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 2 Feb 2021 02:52:41 +0000 (21:52 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Tue, 2 Feb 2021 02:52:41 +0000 (21:52 -0500)
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.

gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-3.c [new file with mode: 0644]

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 (file)
index 0000000..1afc6df
--- /dev/null
@@ -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 (file)
index 0000000..a864831
--- /dev/null
@@ -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;
+}