demangler-fuzzer.c: New file.
authorGary Benson <gbenson@redhat.com>
Wed, 13 Aug 2014 15:56:38 +0000 (15:56 +0000)
committerGary Benson <gary@gcc.gnu.org>
Wed, 13 Aug 2014 15:56:38 +0000 (15:56 +0000)
libiberty/
* testsuite/demangler-fuzzer.c: New file.
* testsuite/Makefile.in (fuzz-demangler): New rule.
(demangler-fuzzer): Likewise.
(mostlyclean): Clean up demangler fuzzer.

From-SVN: r213912

libiberty/ChangeLog
libiberty/testsuite/Makefile.in
libiberty/testsuite/demangler-fuzzer.c [new file with mode: 0644]

index ddd96cce82a267204910e94224966e9fa4626118..96064ac74058113d5f45cff67aa5c595c118d924 100644 (file)
@@ -1,3 +1,10 @@
+2014-08-13  Gary Benson  <gbenson@redhat.com>
+
+       * testsuite/demangler-fuzzer.c: New file.
+       * testsuite/Makefile.in (fuzz-demangler): New rule.
+       (demangler-fuzzer): Likewise.
+       (mostlyclean): Clean up demangler fuzzer.
+
 2014-06-11  Andrew Burgess  <aburgess@broadcom.com>
 
        * cplus-dem.c (do_type): Call string_delete even if the call to
index 69ac1f5105e0f1553ba22ab98d6c0e77a77815f6..d23c09c8b2d79f060f42919c454b0b48af8d1429 100644 (file)
@@ -59,6 +59,10 @@ check-pexecute: test-pexecute
 check-expandargv: test-expandargv
        ./test-expandargv
 
+# Run the demangler fuzzer
+fuzz-demangler: demangler-fuzzer
+       ./demangler-fuzzer
+
 TEST_COMPILE = $(CC) @DEFS@ $(LIBCFLAGS) -I.. -I$(INCDIR) $(HDEFINES)
 test-demangle: $(srcdir)/test-demangle.c ../libiberty.a
        $(TEST_COMPILE) -o test-demangle \
@@ -72,6 +76,10 @@ test-expandargv: $(srcdir)/test-expandargv.c ../libiberty.a
        $(TEST_COMPILE) -DHAVE_CONFIG_H -I.. -o test-expandargv \
                $(srcdir)/test-expandargv.c ../libiberty.a
 
+demangler-fuzzer: $(srcdir)/demangler-fuzzer.c ../libiberty.a
+       $(TEST_COMPILE) -o demangler-fuzzer \
+               $(srcdir)/demangler-fuzzer.c ../libiberty.a
+
 # Standard (either GNU or Cygnus) rules we don't use.
 html install-html info install-info clean-info dvi pdf install-pdf \
 install etags tags installcheck:
@@ -81,6 +89,7 @@ mostlyclean:
        rm -f test-demangle
        rm -f test-pexecute
        rm -f test-expandargv
+       rm -f demangler-fuzzer
        rm -f core
 clean: mostlyclean
 distclean: clean
diff --git a/libiberty/testsuite/demangler-fuzzer.c b/libiberty/testsuite/demangler-fuzzer.c
new file mode 100644 (file)
index 0000000..aff7024
--- /dev/null
@@ -0,0 +1,108 @@
+/* Demangler fuzzer.
+
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+   This file is part of GNU libiberty.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include "demangle.h"
+
+#define MAXLEN 253
+#define ALPMIN 33
+#define ALPMAX 127
+
+static char *program_name;
+
+#define DEFAULT_MAXCOUNT 7500000
+
+static void
+print_usage (FILE *fp, int exit_value)
+{
+  fprintf (fp, "Usage: %s [OPTION]...\n", program_name);
+  fprintf (fp, "Options:\n");
+  fprintf (fp, "  -h           Display this message.\n");
+  fprintf (fp, "  -s SEED      Select the random seed to be used.\n");
+  fprintf (fp, "               The default is to base one on the");
+  fprintf (fp, " current time.\n");
+  fprintf (fp, "  -m MAXCOUNT  Exit after MAXCOUNT symbols.\n");
+  fprintf (fp, "               The default is %d.", DEFAULT_MAXCOUNT);
+  fprintf (fp, " Set to `-1' for no limit.\n");
+
+  exit (exit_value);
+}
+
+int
+main (int argc, char *argv[])
+{
+  char symbol[2 + MAXLEN + 1] = "_Z";
+  int seed = -1, seed_set = 0;
+  int count = 0, maxcount = DEFAULT_MAXCOUNT;
+  int optchr;
+
+  program_name = argv[0];
+
+  do
+    {
+      optchr = getopt (argc, argv, "hs:m:t:");
+      switch (optchr)
+       {
+       case '?':  /* Unrecognized option.  */
+         print_usage (stderr, 1);
+         break;
+
+       case 'h':
+         print_usage (stdout, 0);
+         break;
+
+       case 's':
+         seed = atoi (optarg);
+         seed_set = 1;
+         break;
+
+       case 'm':
+         maxcount = atoi (optarg);
+         break;
+       }
+    }
+  while (optchr != -1);
+
+  if (!seed_set)
+    seed = time (NULL);
+  srand (seed);
+  printf ("%s: seed = %d\n", program_name, seed);
+
+  while (maxcount < 0 || count < maxcount)
+    {
+      char *buffer = symbol + 2;
+      int length, i;
+
+      length = rand () % MAXLEN;
+      for (i = 0; i < length; i++)
+       *buffer++ = (rand () % (ALPMAX - ALPMIN)) + ALPMIN;
+
+      *buffer++ = '\0';
+
+      cplus_demangle (symbol, DMGL_AUTO | DMGL_ANSI | DMGL_PARAMS);
+
+      count++;
+    }
+
+  printf ("%s: successfully demangled %d symbols\n", program_name, count);
+  exit (0);
+}