From fb723fd9d1d2c1acb46e7980b4b35a5fb4d7c355 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 7 Jan 2020 08:06:33 +0100 Subject: [PATCH] test1167: verify global symbols in public headers are curl prefixed ... using the new badsymbols.pl perl script Fixes #4793 Closes #4794 --- tests/Makefile.am | 4 +- tests/badsymbols.pl | 132 ++++++++++++++++++++++++++++++++++++++++ tests/data/Makefile.inc | 3 +- tests/data/test1167 | 24 ++++++++ 4 files changed, 160 insertions(+), 3 deletions(-) create mode 100755 tests/badsymbols.pl create mode 100644 tests/data/test1167 diff --git a/tests/Makefile.am b/tests/Makefile.am index b4cb9012e5..ea5421098e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 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 @@ -38,7 +38,7 @@ EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl \ CMakeLists.txt mem-include-scan.pl valgrind.supp extern-scan.pl \ manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \ negtelnetserver.py $(SMBDEPS) objnames-test08.sh objnames-test10.sh \ - objnames.inc disable-scan.pl manpage-syntax.pl error-codes.pl + objnames.inc disable-scan.pl manpage-syntax.pl error-codes.pl badsymbols.pl DISTCLEANFILES = configurehelp.pm diff --git a/tests/badsymbols.pl b/tests/badsymbols.pl new file mode 100755 index 0000000000..05d325c3de --- /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); diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 09cb057060..978f8aa5b2 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -131,7 +131,8 @@ test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \ test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \ test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \ test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \ -test1160 test1161 test1162 test1163 test1164 test1165 test1166 \ +test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 \ +\ test1170 test1171 test1172 test1173 test1174 test1175 \ \ test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \ diff --git a/tests/data/test1167 b/tests/data/test1167 new file mode 100644 index 0000000000..9eebe1c4e8 --- /dev/null +++ b/tests/data/test1167 @@ -0,0 +1,24 @@ + + + +source analysis + + + +# +# Client-side + + +none + + + +Verify curl prefix of public symbols in header files + + + +%SRCDIR/badsymbols.pl %SRCDIR/.. + + + +