/* 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 . */ #include #include #include #include #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); }