| /* Demangler fuzzer. |
| |
| Copyright (C) 2014-2021 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); |
| } |