diff options
Diffstat (limited to 'util/mkerr.pl')
-rwxr-xr-x | util/mkerr.pl | 222 |
1 files changed, 10 insertions, 212 deletions
diff --git a/util/mkerr.pl b/util/mkerr.pl index d7c72af14c..7d912477b8 100755 --- a/util/mkerr.pl +++ b/util/mkerr.pl @@ -125,24 +125,17 @@ if ( $internal ) { } # Data parsed out of the config and state files. -# We always map function-code values to zero, so items marked below with -# an asterisk could eventually be removed. TODO(4.0) my %hpubinc; # lib -> public header my %libpubinc; # public header -> lib my %hprivinc; # lib -> private header my %libprivinc; # private header -> lib my %cskip; # error_file -> lib my %errorfile; # lib -> error file name -my %fmax; # lib -> max assigned function code* my %rmax; # lib -> max assigned reason code -my %fassigned; # lib -> colon-separated list of assigned function codes* my %rassigned; # lib -> colon-separated list of assigned reason codes -my %fnew; # lib -> count of new function codes* my %rnew; # lib -> count of new reason codes my %rextra; # "extra" reason code -> lib my %rcodes; # reason-name -> value -my %ftrans; # old name -> #define-friendly name (all caps)* -my %fcodes; # function-name -> value* my $statefile; # state file with assigned reason and function codes my %strings; # define -> text @@ -162,11 +155,8 @@ while ( <IN> ) { $cskip{$err} = $lib; $errorfile{$lib} = $err; next if $err eq 'NONE'; - $fmax{$lib} = 100; $rmax{$lib} = 100; - $fassigned{$lib} = ":"; $rassigned{$lib} = ":"; - $fnew{$lib} = 0; $rnew{$lib} = 0; die "Public header file must be in include/openssl ($pubhdr is not)\n" if ($internal @@ -235,9 +225,7 @@ if ( ! $reindex && $statefile ) { } $rcodes{$name} = $code; } elsif ( $name =~ /^(?:OSSL_|OPENSSL_)?[A-Z0-9]{2,}_F_/ ) { - $fassigned{$lib} .= "$code:"; - $fmax{$lib} = $code if $code > $fmax{$lib}; - $fcodes{$name} = $code; + # We do nothing with the function codes, just let them go away } else { die "Bad line in $statefile:\n$_\n"; } @@ -254,131 +242,19 @@ if ( ! $reindex && $statefile ) { print STDERR " --none--\n"; } } - print STDERR "\n"; - foreach my $lib ( sort keys %fmax ) { - print STDERR "Function codes for ${lib}:\n"; - if ( $fassigned{$lib} =~ m/^:(.*):$/ ) { - my @fassigned = sort { $a <=> $b } split( ":", $1 ); - print STDERR " ", join(' ', @fassigned), "\n"; - } else { - print STDERR " --none--\n"; - } - } } } -# Scan each public header file and make a list of function codes and names -&phase("Scanning headers"); -while ( ( my $hdr, my $lib ) = each %libpubinc ) { - next if $hdr eq "NONE"; - print STDERR " ." if $debug; - my $line = ""; - my $def = ""; - my $linenr = 0; - my $cpp = 0; - - open(IN, "<$hdr") - || open(IN, "<$hdr.in") - || die "Can't open $hdr or $hdr.in, $!,"; - while ( <IN> ) { - $linenr++; - - if ( $line ne '' ) { - $_ = $line . $_; - $line = ''; - } - - if ( /\\$/ ) { - $line = $_; - next; - } - - if ( /\/\*/ ) { - if ( not /\*\// ) { # multiline comment... - $line = $_; # ... just accumulate - next; - } else { - s/\/\*.*?\*\///gs; # wipe it - } - } - - if ( $cpp ) { - $cpp++ if /^#\s*if/; - $cpp-- if /^#\s*endif/; - next; - } - $cpp = 1 if /^#.*ifdef.*cplusplus/; # skip "C" declaration - - next if /^\#/; # skip preprocessor directives - - s/{[^{}]*}//gs; # ignore {} blocks - - if ( /\{|\/\*/ ) { # Add a so editor works... - $line = $_; - } else { - $def .= $_; - } - } - - # Delete any DECLARE_ macros - my $defnr = 0; - $def =~ s/DECLARE_\w+\([\w,\s]+\)//gs; - foreach ( split /;/, $def ) { - $defnr++; - # The goal is to collect function names from function declarations. - - s/^[\n\s]*//g; - s/[\n\s]*$//g; - - # Skip over recognized non-function declarations - next if /typedef\W/; - - # Remove STACK_OF(foo) - s/STACK_OF\(\w+\)/void/; - - # Reduce argument lists to empty () - # fold round brackets recursively: (t(*v)(t),t) -> (t{}{},t) -> {} - while ( /\(.*\)/s ) { - s/\([^\(\)]+\)/\{\}/gs; - s/\(\s*\*\s*(\w+)\s*\{\}\s*\)/$1/gs; #(*f{}) -> f - } - - # pretend as we didn't use curly braces: {} -> () - s/\{\}/\(\)/gs; - - # Last token just before the first () is a function name. - if ( /(\w+)\s*\(\).*/s ) { - my $name = $1; - $name =~ tr/[a-z]/[A-Z]/; - $ftrans{$name} = $1; - } elsif ( /[\(\)]/ and not(/=/) ) { - print STDERR "Header $hdr: cannot parse: $_;\n"; - } - } - - next if $reindex; - - if ( $lib eq "SSL" && $rmax{$lib} >= 1000 ) { - print STDERR "SSL error codes 1000+ are reserved for alerts.\n"; - print STDERR "Any new alerts must be added to $config.\n"; - $errors++; - } - close IN; -} -print STDERR "\n" if $debug; - -# Scan each C source file and look for function and reason codes -# This is done by looking for strings that "look like" function or -# reason codes: basically anything consisting of all upper case and -# numerics which has _F_ or _R_ in it and which has the name of an -# error library at the start. This seems to work fine except for the -# oddly named structure BIO_F_CTX which needs to be ignored. +# Scan each C source file and look for reason codes. This is done by +# looking for strings that "look like" reason codes: basically anything +# consisting of all upper case and numerics which _R_ in it and which has +# the name of an error library at the start. Should there be anything else, +# such as a type name, we add exceptions here. # If a code doesn't exist in list compiled from headers then mark it # with the value "X" as a place holder to give it a value later. -# Store all function and reason codes found in %usedfuncs and %usedreasons -# so all those unreferenced can be printed out. +# Store all reason codes found in and %usedreasons so all those unreferenced +# can be printed out. &phase("Scanning source"); -my %usedfuncs; my %usedreasons; foreach my $file ( @source ) { # Don't parse the error source file. @@ -392,26 +268,7 @@ foreach my $file ( @source ) { # skip obsoleted source files entirely! last if /^#error\s+obsolete/; $linenr++; - if ( !/;$/ && /^\**([a-zA-Z_].*[\s*])?([A-Za-z_0-9]+)\(.*([),]|$)/ ) { - /^([^()]*(\([^()]*\)[^()]*)*)\(/; - $1 =~ /([A-Za-z_0-9]*)$/; - $func = $1; - } - if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_F_([A-Z0-9_]+))/ ) { - next unless exists $errorfile{$2}; - next if $errorfile{$2} eq 'NONE'; - next if $1 eq "BIO_F_BUFFER_CTX"; - $usedfuncs{$1} = 1; - if ( !exists $fcodes{$1} ) { - print STDERR " New function $1\n" if $debug; - $fcodes{$1} = "X"; - $fnew{$2}++; - } - $ftrans{$3} = $func unless exists $ftrans{$3}; - print STDERR " Function $1 = $fcodes{$1}\n" - if $debug; - } if ( /(((?:OSSL_|OPENSSL_)?[A-Z0-9]{2,})_R_[A-Z0-9_]+)/ ) { next unless exists $errorfile{$2}; next if $errorfile{$2} eq 'NONE'; @@ -432,10 +289,9 @@ print STDERR "\n" if $debug; &phase("Writing files"); my $newstate = 0; foreach my $lib ( keys %errorfile ) { - next if ! $fnew{$lib} && ! $rnew{$lib} && ! $rebuild; + next if ! $rnew{$lib} && ! $rebuild; next if scalar keys %modules > 0 && !$modules{$lib}; next if $nowrite; - print STDERR "$lib: $fnew{$lib} new functions\n" if $fnew{$lib}; print STDERR "$lib: $rnew{$lib} new reasons\n" if $rnew{$lib}; $newstate = 1; @@ -443,7 +299,6 @@ foreach my $lib ( keys %errorfile ) { # need to rebuild the header file and C file. # Make a sorted list of error and reason codes for later use. - my @function = sort grep( /^${lib}_/, keys %fcodes ); my @reasons = sort grep( /^${lib}_/, keys %rcodes ); # indent level for innermost preprocessor lines @@ -509,26 +364,6 @@ EOF # If this library doesn't have a public header file, we write all # definitions that would end up there here instead if ($hpubinc{$lib} eq 'NONE') { - print OUT "\n/*\n * $lib function codes.\n */\n"; - print OUT "#${indent}ifndef OPENSSL_NO_DEPRECATED_3_0\n"; - foreach my $i ( @function ) { - my $z = 48 - length($i); - $z = 0 if $z < 0; - if ( $fcodes{$i} eq "X" ) { - $fassigned{$lib} =~ m/^:([^:]*):/; - my $findcode = $1; - $findcode = $fmax{$lib} if !defined $findcode; - while ( $fassigned{$lib} =~ m/:$findcode:/ ) { - $findcode++; - } - $fcodes{$i} = $findcode; - $fassigned{$lib} .= "$findcode:"; - print STDERR "New Function code $i\n" if $debug; - } - printf OUT "#${indent} define $i%s 0\n", " " x $z; - } - print OUT "#${indent}endif\n"; - print OUT "\n/*\n * $lib reason codes.\n */\n"; foreach my $i ( @reasons ) { my $z = 48 - length($i); @@ -632,26 +467,6 @@ EOF } } - print OUT "\n/*\n * $lib function codes.\n */\n"; - print OUT "#${indent}ifndef OPENSSL_NO_DEPRECATED_3_0\n"; - foreach my $i ( @function ) { - my $z = 48 - length($i); - $z = 0 if $z < 0; - if ( $fcodes{$i} eq "X" ) { - $fassigned{$lib} =~ m/^:([^:]*):/; - my $findcode = $1; - $findcode = $fmax{$lib} if !defined $findcode; - while ( $fassigned{$lib} =~ m/:$findcode:/ ) { - $findcode++; - } - $fcodes{$i} = $findcode; - $fassigned{$lib} .= "$findcode:"; - print STDERR "New Function code $i\n" if $debug; - } - printf OUT "#${indent} define $i%s 0\n", " " x $z; - } - print OUT "#${indent}endif\n"; - print OUT "\n/*\n * $lib reason codes.\n */\n"; foreach my $i ( @reasons ) { my $z = 48 - length($i); @@ -833,22 +648,12 @@ EOF } &phase("Ending"); -# Make a list of unreferenced function and reason codes +# Make a list of unreferenced reason codes if ( $unref ) { - my @funref; - foreach ( keys %fcodes ) { - push( @funref, $_ ) unless exists $usedfuncs{$_}; - } my @runref; foreach ( keys %rcodes ) { push( @runref, $_ ) unless exists $usedreasons{$_}; } - if ( @funref ) { - print STDERR "The following function codes were not referenced:\n"; - foreach ( sort @funref ) { - print STDERR " $_\n"; - } - } if ( @runref ) { print STDERR "The following reason codes were not referenced:\n"; foreach ( sort @runref ) { @@ -871,13 +676,6 @@ if ( $newstate ) { # in the file LICENSE in the source distribution or at # https://www.openssl.org/source/license.html EOF - print OUT "\n# Function codes\n"; - foreach my $i ( sort keys %fcodes ) { - my $short = "$i:$fcodes{$i}:"; - my $t = exists $strings{$i} ? $strings{$i} : ""; - $t = "\\\n\t" . $t if length($short) + length($t) > 80; - print OUT "$short$t\n"; - } print OUT "\n#Reason codes\n"; foreach my $i ( sort keys %rcodes ) { my $short = "$i:$rcodes{$i}:"; |