From fb723fd9d1d2c1acb46e7980b4b35a5fb4d7c355 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 7 Jan 2020 08:06:33 +0100 Subject: test1167: verify global symbols in public headers are curl prefixed ... using the new badsymbols.pl perl script Fixes #4793 Closes #4794 --- tests/badsymbols.pl | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100755 tests/badsymbols.pl (limited to 'tests/badsymbols.pl') diff --git a/tests/badsymbols.pl b/tests/badsymbols.pl new file mode 100755 index 000000000..05d325c3d --- /dev/null +++ b/tests/badsymbols.pl @@ -0,0 +1,132 @@ +#!/usr/bin/env perl +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 2010-2020, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +# +# This script grew out of help from Przemyslaw Iskra and Balint Szilakszi +# a late evening in the #curl IRC channel on freenode. +# + +use strict; +use warnings; +use vars qw($Cpreprocessor); + +# +# configurehelp perl module is generated by configure script +# +my $rc = eval { + require configurehelp; + configurehelp->import(qw( + $Cpreprocessor + )); + 1; +}; +# Set default values if configure has not generated a configurehelp.pm file. +# This is the case with cmake. +if (!$rc) { + $Cpreprocessor = 'cpp'; +} + +# we may get the dir root pointed out +my $root=$ARGV[0] || "."; + +# need an include directory when building out-of-tree +my $i = ($ARGV[1]) ? "-I$ARGV[1] " : ''; + +my $incdir = "$root/include/curl"; + +my $verbose=0; +my $summary=0; +my $misses=0; + +my @syms; +my %doc; +my %rem; + +sub scanenums { + my ($file)=@_; + my $skipit = 0; + + open H_IN, "-|", "$Cpreprocessor $i$file" || die "Cannot preprocess $file"; + while ( ) { + if( /^#(line|) (\d+) \"(.*)\"/) { + # if the included file isn't in our incdir, then we skip this section + # until next #line + # + if($3 !~ /^$incdir/) { + $skipit = 1; + next; + } + # parse this! + $skipit = 0, + } + if($skipit) { + next; + } + if ( /enum\s+(\S+\s+)?{/ .. /}/ ) { + s/^\s+//; + chomp; + s/[,\s].*//; + if(($_ !~ /\}(;|)/) && + ($_ ne "typedef") && + ($_ ne "enum") && + ($_ !~ /^[ \t]*$/) && + ($_ ne "#")) { + push @syms, $_; + } + } + } + close H_IN || die "Error preprocessing $file"; +} + +sub scanheader { + my ($f)=@_; + scanenums($f); + open H, "<$f"; + while() { + if (/^#define +([^ \n]*)/) { + push @syms, $1; + } + } + close H; +} + + +opendir(my $dh, $incdir) || die "Can't opendir: $!"; +my @hfiles = grep { /\.h$/ } readdir($dh); +closedir $dh; + +for(@hfiles) { + scanheader("$incdir/$_"); +} + +my $errors = 0; +for my $s (@syms) { + if($s !~ /^(lib|)curl/i) { + print "Bad symbols in public header files:\n" if(!$errors); + $errors++; + print " $s\n"; + } +} +if($errors) { + exit 1; +} +printf "%d fine symbols found\n", scalar(@syms); -- cgit v1.2.3