Jakub Jelinek wrote: > On Mon, Aug 11, 2014 at 05:04:20PM +0100, Gary Benson wrote: > > + case 's': > > + seed = atoi (optarg); > > + break; > > + > > + case 't': > > + timeout = atoi (optarg); > > + break; > > + > > + case 'm': > > + maxcount = atoi (optarg); > > + break; > > + } > > + } > > + while (optchr != -1); > > + > > + if (seed == -1) > > + seed = time (NULL); > > + srand (seed); > > + printf ("%s: seed = %d\n", program_name, seed); > > That will still make it non-reproduceable if time returns -1 > (well, as you cast time_t to int, that can be e.g. on 64-bit arches > any time which has 0xffffffff in the low 32 bits). So perhaps do > if (seed == -1) > { > seed = time (NULL); > if (seed == -1) seed = 0; > } > or something similar?
I've added a flag, seed_set, so seed will only be set to time (NULL) if the user has not specified a seed on the command line. > > + if (timeout != -1) > > + { > > + signal (SIGALRM, alarm_handler); > > + alarm (timeout); > > + } > > Not sure how much portable signal/alarm is. So probably should be > guarded by the existence of signal.h, SIGALRM being defined etc. I've removed the timeout code. Users can limit the run by setting a maximum number of iterations. That's more consistent for testing anyway: 5000000 iterations is 5000000 iterations wherever you run it. How about this one? Thanks, Gary -- 2014-08-12 Gary Benson <gben...@redhat.com> * testsuite/demangler-fuzzer.c: New file. * testsuite/Makefile.in (fuzz-demangler): New rule. (demangler-fuzzer): Likewise. (mostlyclean): Clean up demangler fuzzer. Index: libiberty/testsuite/Makefile.in =================================================================== --- libiberty/testsuite/Makefile.in (revision 213809) +++ libiberty/testsuite/Makefile.in (working copy) @@ -59,6 +59,10 @@ check-expandargv: test-expandargv ./test-expandargv +# Run the demangler fuzzer +fuzz-demangler: demangler-fuzzer + ./demangler-fuzzer -m 50000000 + 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_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 @@ rm -f test-demangle rm -f test-pexecute rm -f test-expandargv + rm -f demangler-fuzzer rm -f core clean: mostlyclean distclean: clean Index: libiberty/testsuite/demangler-fuzzer.c =================================================================== --- libiberty/testsuite/demangler-fuzzer.c (revision 0) +++ libiberty/testsuite/demangler-fuzzer.c (revision 0) @@ -0,0 +1,102 @@ +/* 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; + +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, " -m MAXCOUNT Exit after MAXCOUNT symbols.\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 = -1; + 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); +}