1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl 2*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 3*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 4*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 5*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 6*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 7*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 8*6236dae4SAndroid Build Coastguard Worker# 9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 10*6236dae4SAndroid Build Coastguard Worker# 11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 14*6236dae4SAndroid Build Coastguard Worker# 15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 18*6236dae4SAndroid Build Coastguard Worker# 19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 21*6236dae4SAndroid Build Coastguard Worker# 22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 23*6236dae4SAndroid Build Coastguard Worker# 24*6236dae4SAndroid Build Coastguard Worker########################################################################### 25*6236dae4SAndroid Build Coastguard Worker# 26*6236dae4SAndroid Build Coastguard Worker# This script is aimed to help scan for and detect globally declared functions 27*6236dae4SAndroid Build Coastguard Worker# that are not used from other source files. 28*6236dae4SAndroid Build Coastguard Worker# 29*6236dae4SAndroid Build Coastguard Worker# Use it like this: 30*6236dae4SAndroid Build Coastguard Worker# 31*6236dae4SAndroid Build Coastguard Worker# $ ./scripts/singleuse.pl [--unit] lib/.libs/libcurl.a 32*6236dae4SAndroid Build Coastguard Worker# 33*6236dae4SAndroid Build Coastguard Worker# --unit : built to support unit tests 34*6236dae4SAndroid Build Coastguard Worker# 35*6236dae4SAndroid Build Coastguard Worker 36*6236dae4SAndroid Build Coastguard Workermy $unittests; 37*6236dae4SAndroid Build Coastguard Workerif($ARGV[0] eq "--unit") { 38*6236dae4SAndroid Build Coastguard Worker $unittests = "tests/unit "; 39*6236dae4SAndroid Build Coastguard Worker shift @ARGV; 40*6236dae4SAndroid Build Coastguard Worker} 41*6236dae4SAndroid Build Coastguard Worker 42*6236dae4SAndroid Build Coastguard Workermy $file = $ARGV[0]; 43*6236dae4SAndroid Build Coastguard Worker 44*6236dae4SAndroid Build Coastguard Workermy %wl = ( 45*6236dae4SAndroid Build Coastguard Worker 'curlx_uztoso' => 'cmdline tool use', 46*6236dae4SAndroid Build Coastguard Worker 'Curl_xfer_write_resp' => 'internal api', 47*6236dae4SAndroid Build Coastguard Worker 'Curl_creader_def_init' => 'internal api', 48*6236dae4SAndroid Build Coastguard Worker 'Curl_creader_def_close' => 'internal api', 49*6236dae4SAndroid Build Coastguard Worker 'Curl_creader_def_read' => 'internal api', 50*6236dae4SAndroid Build Coastguard Worker 'Curl_creader_def_total_length' => 'internal api', 51*6236dae4SAndroid Build Coastguard Worker); 52*6236dae4SAndroid Build Coastguard Worker 53*6236dae4SAndroid Build Coastguard Workermy %api = ( 54*6236dae4SAndroid Build Coastguard Worker 'curl_easy_cleanup' => 'API', 55*6236dae4SAndroid Build Coastguard Worker 'curl_easy_duphandle' => 'API', 56*6236dae4SAndroid Build Coastguard Worker 'curl_easy_escape' => 'API', 57*6236dae4SAndroid Build Coastguard Worker 'curl_easy_getinfo' => 'API', 58*6236dae4SAndroid Build Coastguard Worker 'curl_easy_init' => 'API', 59*6236dae4SAndroid Build Coastguard Worker 'curl_easy_pause' => 'API', 60*6236dae4SAndroid Build Coastguard Worker 'curl_easy_perform' => 'API', 61*6236dae4SAndroid Build Coastguard Worker 'curl_easy_recv' => 'API', 62*6236dae4SAndroid Build Coastguard Worker 'curl_easy_reset' => 'API', 63*6236dae4SAndroid Build Coastguard Worker 'curl_easy_send' => 'API', 64*6236dae4SAndroid Build Coastguard Worker 'curl_easy_setopt' => 'API', 65*6236dae4SAndroid Build Coastguard Worker 'curl_easy_strerror' => 'API', 66*6236dae4SAndroid Build Coastguard Worker 'curl_easy_unescape' => 'API', 67*6236dae4SAndroid Build Coastguard Worker 'curl_easy_upkeep' => 'API', 68*6236dae4SAndroid Build Coastguard Worker 'curl_easy_option_by_id' => 'API', 69*6236dae4SAndroid Build Coastguard Worker 'curl_easy_option_by_name' => 'API', 70*6236dae4SAndroid Build Coastguard Worker 'curl_easy_option_next' => 'API', 71*6236dae4SAndroid Build Coastguard Worker 'curl_escape' => 'API', 72*6236dae4SAndroid Build Coastguard Worker 'curl_formadd' => 'API', 73*6236dae4SAndroid Build Coastguard Worker 'curl_formfree' => 'API', 74*6236dae4SAndroid Build Coastguard Worker 'curl_formget' => 'API', 75*6236dae4SAndroid Build Coastguard Worker 'curl_free' => 'API', 76*6236dae4SAndroid Build Coastguard Worker 'curl_getdate' => 'API', 77*6236dae4SAndroid Build Coastguard Worker 'curl_getenv' => 'API', 78*6236dae4SAndroid Build Coastguard Worker 'curl_global_cleanup' => 'API', 79*6236dae4SAndroid Build Coastguard Worker 'curl_global_init' => 'API', 80*6236dae4SAndroid Build Coastguard Worker 'curl_global_init_mem' => 'API', 81*6236dae4SAndroid Build Coastguard Worker 'curl_global_sslset' => 'API', 82*6236dae4SAndroid Build Coastguard Worker 'curl_global_trace' => 'API', 83*6236dae4SAndroid Build Coastguard Worker 'curl_maprintf' => 'API', 84*6236dae4SAndroid Build Coastguard Worker 'curl_mfprintf' => 'API', 85*6236dae4SAndroid Build Coastguard Worker 'curl_mime_addpart' => 'API', 86*6236dae4SAndroid Build Coastguard Worker 'curl_mime_data' => 'API', 87*6236dae4SAndroid Build Coastguard Worker 'curl_mime_data_cb' => 'API', 88*6236dae4SAndroid Build Coastguard Worker 'curl_mime_encoder' => 'API', 89*6236dae4SAndroid Build Coastguard Worker 'curl_mime_filedata' => 'API', 90*6236dae4SAndroid Build Coastguard Worker 'curl_mime_filename' => 'API', 91*6236dae4SAndroid Build Coastguard Worker 'curl_mime_free' => 'API', 92*6236dae4SAndroid Build Coastguard Worker 'curl_mime_headers' => 'API', 93*6236dae4SAndroid Build Coastguard Worker 'curl_mime_init' => 'API', 94*6236dae4SAndroid Build Coastguard Worker 'curl_mime_name' => 'API', 95*6236dae4SAndroid Build Coastguard Worker 'curl_mime_subparts' => 'API', 96*6236dae4SAndroid Build Coastguard Worker 'curl_mime_type' => 'API', 97*6236dae4SAndroid Build Coastguard Worker 'curl_mprintf' => 'API', 98*6236dae4SAndroid Build Coastguard Worker 'curl_msnprintf' => 'API', 99*6236dae4SAndroid Build Coastguard Worker 'curl_msprintf' => 'API', 100*6236dae4SAndroid Build Coastguard Worker 'curl_multi_add_handle' => 'API', 101*6236dae4SAndroid Build Coastguard Worker 'curl_multi_assign' => 'API', 102*6236dae4SAndroid Build Coastguard Worker 'curl_multi_cleanup' => 'API', 103*6236dae4SAndroid Build Coastguard Worker 'curl_multi_fdset' => 'API', 104*6236dae4SAndroid Build Coastguard Worker 'curl_multi_get_handles' => 'API', 105*6236dae4SAndroid Build Coastguard Worker 'curl_multi_info_read' => 'API', 106*6236dae4SAndroid Build Coastguard Worker 'curl_multi_init' => 'API', 107*6236dae4SAndroid Build Coastguard Worker 'curl_multi_perform' => 'API', 108*6236dae4SAndroid Build Coastguard Worker 'curl_multi_remove_handle' => 'API', 109*6236dae4SAndroid Build Coastguard Worker 'curl_multi_setopt' => 'API', 110*6236dae4SAndroid Build Coastguard Worker 'curl_multi_socket' => 'API', 111*6236dae4SAndroid Build Coastguard Worker 'curl_multi_socket_action' => 'API', 112*6236dae4SAndroid Build Coastguard Worker 'curl_multi_socket_all' => 'API', 113*6236dae4SAndroid Build Coastguard Worker 'curl_multi_poll' => 'API', 114*6236dae4SAndroid Build Coastguard Worker 'curl_multi_strerror' => 'API', 115*6236dae4SAndroid Build Coastguard Worker 'curl_multi_timeout' => 'API', 116*6236dae4SAndroid Build Coastguard Worker 'curl_multi_wait' => 'API', 117*6236dae4SAndroid Build Coastguard Worker 'curl_multi_waitfds' => 'API', 118*6236dae4SAndroid Build Coastguard Worker 'curl_multi_wakeup' => 'API', 119*6236dae4SAndroid Build Coastguard Worker 'curl_mvaprintf' => 'API', 120*6236dae4SAndroid Build Coastguard Worker 'curl_mvfprintf' => 'API', 121*6236dae4SAndroid Build Coastguard Worker 'curl_mvprintf' => 'API', 122*6236dae4SAndroid Build Coastguard Worker 'curl_mvsnprintf' => 'API', 123*6236dae4SAndroid Build Coastguard Worker 'curl_mvsprintf' => 'API', 124*6236dae4SAndroid Build Coastguard Worker 'curl_pushheader_byname' => 'API', 125*6236dae4SAndroid Build Coastguard Worker 'curl_pushheader_bynum' => 'API', 126*6236dae4SAndroid Build Coastguard Worker 'curl_share_cleanup' => 'API', 127*6236dae4SAndroid Build Coastguard Worker 'curl_share_init' => 'API', 128*6236dae4SAndroid Build Coastguard Worker 'curl_share_setopt' => 'API', 129*6236dae4SAndroid Build Coastguard Worker 'curl_share_strerror' => 'API', 130*6236dae4SAndroid Build Coastguard Worker 'curl_slist_append' => 'API', 131*6236dae4SAndroid Build Coastguard Worker 'curl_slist_free_all' => 'API', 132*6236dae4SAndroid Build Coastguard Worker 'curl_strequal' => 'API', 133*6236dae4SAndroid Build Coastguard Worker 'curl_strnequal' => 'API', 134*6236dae4SAndroid Build Coastguard Worker 'curl_unescape' => 'API', 135*6236dae4SAndroid Build Coastguard Worker 'curl_url' => 'API', 136*6236dae4SAndroid Build Coastguard Worker 'curl_url_cleanup' => 'API', 137*6236dae4SAndroid Build Coastguard Worker 'curl_url_dup' => 'API', 138*6236dae4SAndroid Build Coastguard Worker 'curl_url_get' => 'API', 139*6236dae4SAndroid Build Coastguard Worker 'curl_url_set' => 'API', 140*6236dae4SAndroid Build Coastguard Worker 'curl_url_strerror' => 'API', 141*6236dae4SAndroid Build Coastguard Worker 'curl_version' => 'API', 142*6236dae4SAndroid Build Coastguard Worker 'curl_version_info' => 'API', 143*6236dae4SAndroid Build Coastguard Worker 'curl_easy_header' => 'API', 144*6236dae4SAndroid Build Coastguard Worker 'curl_easy_nextheader' => 'API', 145*6236dae4SAndroid Build Coastguard Worker 'curl_ws_meta' => 'API', 146*6236dae4SAndroid Build Coastguard Worker 'curl_ws_recv' => 'API', 147*6236dae4SAndroid Build Coastguard Worker 'curl_ws_send' => 'API', 148*6236dae4SAndroid Build Coastguard Worker 149*6236dae4SAndroid Build Coastguard Worker # the following functions are provided globally in debug builds 150*6236dae4SAndroid Build Coastguard Worker 'curl_easy_perform_ev' => 'debug-build', 151*6236dae4SAndroid Build Coastguard Worker ); 152*6236dae4SAndroid Build Coastguard Worker 153*6236dae4SAndroid Build Coastguard Workersub doublecheck { 154*6236dae4SAndroid Build Coastguard Worker my ($f, $used) = @_; 155*6236dae4SAndroid Build Coastguard Worker open(F, "git grep -Fwle '$f' -- lib ${unittests}packages|"); 156*6236dae4SAndroid Build Coastguard Worker my @also; 157*6236dae4SAndroid Build Coastguard Worker while(<F>) { 158*6236dae4SAndroid Build Coastguard Worker my $e = $_; 159*6236dae4SAndroid Build Coastguard Worker chomp $e; 160*6236dae4SAndroid Build Coastguard Worker if($e =~ /\.[c]$/) { 161*6236dae4SAndroid Build Coastguard Worker if($e !~ /^lib\/${used}\.c/) { 162*6236dae4SAndroid Build Coastguard Worker push @also, $e; 163*6236dae4SAndroid Build Coastguard Worker } 164*6236dae4SAndroid Build Coastguard Worker } 165*6236dae4SAndroid Build Coastguard Worker } 166*6236dae4SAndroid Build Coastguard Worker close(F); 167*6236dae4SAndroid Build Coastguard Worker return @also; 168*6236dae4SAndroid Build Coastguard Worker} 169*6236dae4SAndroid Build Coastguard Worker 170*6236dae4SAndroid Build Coastguard Workeropen(N, "nm $file|") || 171*6236dae4SAndroid Build Coastguard Worker die; 172*6236dae4SAndroid Build Coastguard Worker 173*6236dae4SAndroid Build Coastguard Workermy %exist; 174*6236dae4SAndroid Build Coastguard Workermy %uses; 175*6236dae4SAndroid Build Coastguard Workermy $file; 176*6236dae4SAndroid Build Coastguard Workerwhile (<N>) { 177*6236dae4SAndroid Build Coastguard Worker my $l = $_; 178*6236dae4SAndroid Build Coastguard Worker chomp $l; 179*6236dae4SAndroid Build Coastguard Worker 180*6236dae4SAndroid Build Coastguard Worker if($l =~ /^([0-9a-z_-]+)\.o:/) { 181*6236dae4SAndroid Build Coastguard Worker $file = $1; 182*6236dae4SAndroid Build Coastguard Worker } 183*6236dae4SAndroid Build Coastguard Worker # libcurl.a(unity_0_c.c.o): 184*6236dae4SAndroid Build Coastguard Worker elsif($l =~ /\(([0-9a-z_.-]+)\.o\):/) { # Apple nm 185*6236dae4SAndroid Build Coastguard Worker $file = $1; 186*6236dae4SAndroid Build Coastguard Worker } 187*6236dae4SAndroid Build Coastguard Worker if($l =~ /^([0-9a-f]+) T _?(.*)/) { 188*6236dae4SAndroid Build Coastguard Worker my ($name)=($2); 189*6236dae4SAndroid Build Coastguard Worker #print "Define $name in $file\n"; 190*6236dae4SAndroid Build Coastguard Worker $file =~ s/^libcurl_la-//; 191*6236dae4SAndroid Build Coastguard Worker $exist{$name} = $file; 192*6236dae4SAndroid Build Coastguard Worker } 193*6236dae4SAndroid Build Coastguard Worker elsif($l =~ /^ U _?(.*)/) { 194*6236dae4SAndroid Build Coastguard Worker my ($name)=($1); 195*6236dae4SAndroid Build Coastguard Worker #print "Uses $name in $file\n"; 196*6236dae4SAndroid Build Coastguard Worker $uses{$name} .= "$file, "; 197*6236dae4SAndroid Build Coastguard Worker } 198*6236dae4SAndroid Build Coastguard Worker} 199*6236dae4SAndroid Build Coastguard Workerclose(N); 200*6236dae4SAndroid Build Coastguard Worker 201*6236dae4SAndroid Build Coastguard Workermy $err; 202*6236dae4SAndroid Build Coastguard Workerfor(sort keys %exist) { 203*6236dae4SAndroid Build Coastguard Worker #printf "%s is defined in %s, used by: %s\n", $_, $exist{$_}, $uses{$_}; 204*6236dae4SAndroid Build Coastguard Worker if(!$uses{$_}) { 205*6236dae4SAndroid Build Coastguard Worker # this is a symbol with no "global" user 206*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^curl_dbg_/) { 207*6236dae4SAndroid Build Coastguard Worker # we ignore the memdebug symbols 208*6236dae4SAndroid Build Coastguard Worker } 209*6236dae4SAndroid Build Coastguard Worker elsif($_ =~ /^curl_/) { 210*6236dae4SAndroid Build Coastguard Worker if(!$api{$_}) { 211*6236dae4SAndroid Build Coastguard Worker # not present in the API, or for debug-builds 212*6236dae4SAndroid Build Coastguard Worker print STDERR "Bad curl-prefix: $_\n"; 213*6236dae4SAndroid Build Coastguard Worker $err++; 214*6236dae4SAndroid Build Coastguard Worker } 215*6236dae4SAndroid Build Coastguard Worker } 216*6236dae4SAndroid Build Coastguard Worker elsif($wl{$_}) { 217*6236dae4SAndroid Build Coastguard Worker #print "$_ is WL\n"; 218*6236dae4SAndroid Build Coastguard Worker } 219*6236dae4SAndroid Build Coastguard Worker else { 220*6236dae4SAndroid Build Coastguard Worker my $c = $_; 221*6236dae4SAndroid Build Coastguard Worker my @also = doublecheck($c, $exist{$c}); 222*6236dae4SAndroid Build Coastguard Worker if(!scalar(@also)) { 223*6236dae4SAndroid Build Coastguard Worker printf "%s in %s\n", $c, $exist{$c}; 224*6236dae4SAndroid Build Coastguard Worker $err++; 225*6236dae4SAndroid Build Coastguard Worker } 226*6236dae4SAndroid Build Coastguard Worker # foreach my $a (@also) { 227*6236dae4SAndroid Build Coastguard Worker # print " $a\n"; 228*6236dae4SAndroid Build Coastguard Worker # } 229*6236dae4SAndroid Build Coastguard Worker } 230*6236dae4SAndroid Build Coastguard Worker } 231*6236dae4SAndroid Build Coastguard Worker elsif($_ =~ /^curl_/) { 232*6236dae4SAndroid Build Coastguard Worker # global prefix, make sure it is "blessed" 233*6236dae4SAndroid Build Coastguard Worker if(!$api{$_}) { 234*6236dae4SAndroid Build Coastguard Worker # not present in the API, or for debug-builds 235*6236dae4SAndroid Build Coastguard Worker if($_ !~ /^curl_dbg_/) { 236*6236dae4SAndroid Build Coastguard Worker # ignore the memdebug symbols 237*6236dae4SAndroid Build Coastguard Worker print STDERR "Bad curl-prefix $_\n"; 238*6236dae4SAndroid Build Coastguard Worker $err++; 239*6236dae4SAndroid Build Coastguard Worker } 240*6236dae4SAndroid Build Coastguard Worker } 241*6236dae4SAndroid Build Coastguard Worker } 242*6236dae4SAndroid Build Coastguard Worker} 243*6236dae4SAndroid Build Coastguard Worker 244*6236dae4SAndroid Build Coastguard Workerexit $err; 245