mirror of
https://github.com/curl/curl.git
synced 2026-08-06 07:06:14 +03:00
lib: feature deprecation warnings in gcc >= 4.3
Add a deprecated attribute to functions and enum values that should not be used anymore. This uses a gcc 4.3 dialect, thus is only available for this version of gcc and newer. Note that the _Pragma() keyword is introduced by C99, but is available as part of the gcc dialect even when compiling in C89 mode. It is still possible to disable deprecation at a calling module compile time by defining CURL_DISABLE_DEPRECATION. Gcc type checking macros are made aware of possible deprecations. Some testing support Perl programs are adapted to the extended declaration syntax. Several test and unit test C programs intentionally use deprecated functions/options and are annotated to not generate a warning. New test 1222 checks the deprecation status in doc and header files. Closes #9667
This commit is contained in:
parent
980510926d
commit
6967571bf2
39 changed files with 771 additions and 243 deletions
|
|
@ -34,7 +34,8 @@ EXTRA_DIST = ftpserver.pl httpserver.pl secureserver.pl runtests.pl \
|
|||
manpage-scan.pl nroff-scan.pl http2-server.pl dictserver.py \
|
||||
negtelnetserver.py smbserver.py util.py \
|
||||
disable-scan.pl manpage-syntax.pl error-codes.pl badsymbols.pl \
|
||||
azure.pm appveyor.pm version-scan.pl options-scan.pl markdown-uppercase.pl
|
||||
azure.pm appveyor.pm version-scan.pl options-scan.pl markdown-uppercase.pl \
|
||||
check-deprecated.pl
|
||||
|
||||
DISTCLEANFILES = configurehelp.pm
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,8 @@ sub scanenums {
|
|||
my ($file)=@_;
|
||||
my $skipit = 0;
|
||||
|
||||
open H_IN, "-|", "$Cpreprocessor $i$file" || die "Cannot preprocess $file";
|
||||
open H_IN, "-|", "$Cpreprocessor -DCURL_DISABLE_DEPRECATION $i$file" ||
|
||||
die "Cannot preprocess $file";
|
||||
while ( <H_IN> ) {
|
||||
my ($line, $linenum) = ($_, $.);
|
||||
if( /^#(line|) (\d+) \"(.*)\"/) {
|
||||
|
|
@ -102,6 +103,7 @@ sub scanenums {
|
|||
if(($_ !~ /\}(;|)/) &&
|
||||
($_ ne "typedef") &&
|
||||
($_ ne "enum") &&
|
||||
($_ ne "=") &&
|
||||
($_ !~ /^[ \t]*$/)) {
|
||||
if($verbose) {
|
||||
print "Source: $Cpreprocessor $i$file\n";
|
||||
|
|
|
|||
330
tests/check-deprecated.pl
Executable file
330
tests/check-deprecated.pl
Executable file
|
|
@ -0,0 +1,330 @@
|
|||
#!/usr/bin/env perl
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2016 - 2022, Daniel Stenberg, <daniel@haxx.se>, 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.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.
|
||||
#
|
||||
# SPDX-License-Identifier: curl
|
||||
#
|
||||
#
|
||||
###########################################################################
|
||||
#
|
||||
# Check that the deprecated statuses of functions and enum values in header
|
||||
# files, man pages and symbols-in-versions are in sync.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use File::Basename;
|
||||
|
||||
my $root=$ARGV[0] || ".";
|
||||
my $incdir = "$root/include/curl";
|
||||
my $docdir = "$root/docs";
|
||||
my $libdocdir = "$docdir/libcurl";
|
||||
my $errcode = 0;
|
||||
|
||||
# Symbol-indexed hashes.
|
||||
# Values are:
|
||||
# X Not deprecated
|
||||
# ? Deprecated in unknown version
|
||||
# x.yy.z Deprecated in version x.yy.z
|
||||
my %syminver; # Symbols-in-versions deprecations.
|
||||
my %hdr; # Public header files deprecations.
|
||||
my %funcman; # Function man pages deprecations.
|
||||
my %optman; # Option man pages deprecations.
|
||||
|
||||
|
||||
# Scan header file for public function and enum values. Flag them with
|
||||
# the version they are deprecated in, if some.
|
||||
sub scan_header {
|
||||
my ($f)=@_;
|
||||
my $line = "";
|
||||
my $incomment = 0;
|
||||
my $inenum = 0;
|
||||
|
||||
open H, "<$f";
|
||||
while(<H>) {
|
||||
s/^\s*(.*?)\s*$/$1/; # Trim.
|
||||
# Remove multi-line comment trail.
|
||||
if($incomment) {
|
||||
if($_ !~ /.*?\*\/\s*(.*)$/) {
|
||||
next;
|
||||
}
|
||||
$_ = $1;
|
||||
$incomment = 0;
|
||||
}
|
||||
if($line ne "") {
|
||||
# Unfold line.
|
||||
$_ = "$line $1";
|
||||
$line = "";
|
||||
}
|
||||
# Remove comments.
|
||||
while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) {
|
||||
$_ = "$1 $2";
|
||||
}
|
||||
if($_ =~ /^(.*)\/\*/) {
|
||||
$_ = "$1 ";
|
||||
$incomment = 1;
|
||||
}
|
||||
s/^\s*(.*?)\s*$/$1/; # Trim again.
|
||||
# Ignore preprocessor directives and blank lines.
|
||||
if($_ =~ /^(?:#|$)/) {
|
||||
next;
|
||||
}
|
||||
# Handle lines that may be continued as if they were folded.
|
||||
if($_ !~ /[;,{}]$/) {
|
||||
# Folded line.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
if($_ =~ /CURLOPTDEPRECATED\(/) {
|
||||
# Handle deprecated CURLOPT_* option.
|
||||
if($_ !~ /CURLOPTDEPRECATED\(\s*(\S+)\s*,(?:.*?,){2}\s*(.*?)\s*,.*"\)/) {
|
||||
# Folded line.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
$hdr{$1} = $2;
|
||||
}
|
||||
elsif($_ =~ /CURLOPT\(/) {
|
||||
# Handle non-deprecated CURLOPT_* option.
|
||||
if($_ !~ /CURLOPT\(\s*(\S+)\s*(?:,.*?){2}\)/) {
|
||||
# Folded line.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
$hdr{$1} = "X";
|
||||
}
|
||||
else {
|
||||
my $version = "X";
|
||||
|
||||
# Get other kind of deprecation from this line.
|
||||
if($_ =~ /CURL_DEPRECATED\(/) {
|
||||
if($_ !~ /^(.*)CURL_DEPRECATED\(\s*(\S+?)\s*,.*?"\)(.*)$/) {
|
||||
# Folded line.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
$version = $2;
|
||||
$_ = "$1 $3";
|
||||
}
|
||||
if($_ =~ /^CURL_EXTERN\s+.*\s+(\S+?)\s*\(/) {
|
||||
# Flag public function.
|
||||
$hdr{$1} = $version;
|
||||
}
|
||||
elsif($inenum && $_ =~ /(\w+)\s*[,=}]/) {
|
||||
# Flag enum value.
|
||||
$hdr{$1} = $version;
|
||||
}
|
||||
}
|
||||
# Remember if we are in an enum definition.
|
||||
$inenum |= ($_ =~ /\benum\b/);
|
||||
if($_ =~ /}/) {
|
||||
$inenum = 0;
|
||||
}
|
||||
}
|
||||
close H;
|
||||
}
|
||||
|
||||
# Scan function man page for options.
|
||||
# Each option has to be declared as ".IP <option>" where <option> starts with
|
||||
# the prefix. Flag each option with its deprecation version, if some.
|
||||
sub scan_man_for_opts {
|
||||
my ($f, $prefix)=@_;
|
||||
my $opt = "";
|
||||
my $line = "";
|
||||
|
||||
open M, "<$f";
|
||||
while(<M>) {
|
||||
if($_ =~ /^\./) {
|
||||
# roff directive found: end current option paragraph.
|
||||
my $o = $opt;
|
||||
$opt = "";
|
||||
if($_ =~ /^\.IP\s+((?:$prefix)_\w+)/) {
|
||||
# A new option has been found.
|
||||
$opt = $1;
|
||||
}
|
||||
$_ = $line; # Get full paragraph.
|
||||
$line = "";
|
||||
s/\\f.//g; # Remove font formatting.
|
||||
s/\s+/ /g; # One line with single space only.
|
||||
if($o) {
|
||||
$funcman{$o} = "X";
|
||||
# Check if paragraph is mentioning deprecation.
|
||||
while($_ =~ /(?:deprecated|obsoleted?)\b\s*(?:in\b|since\b)?\s*(?:version\b|curl\b|libcurl\b)?\s*(\d[0-9.]*\d)?\b\s*(.*)$/i) {
|
||||
$funcman{$o} = $1 || "?";
|
||||
$_ = $2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
# Text line: accumulate.
|
||||
$line .= $_;
|
||||
}
|
||||
}
|
||||
close M;
|
||||
}
|
||||
|
||||
# Scan man page for deprecation in DESCRIPTION and/or AVAILABILITY sections.
|
||||
sub scan_man_page {
|
||||
my ($path, $sym, $table)=@_;
|
||||
my $version = "X";
|
||||
my $fh;
|
||||
|
||||
if(open $fh, "<$path") {
|
||||
my $section = "";
|
||||
my $line = "";
|
||||
|
||||
while(<$fh>) {
|
||||
if($_ =~ /\.so\s+man3\/(.*\.3\b)/) {
|
||||
# Handle man page inclusion.
|
||||
scan_man_page(dirname($path) . "/$1", $sym, $table);
|
||||
$version = exists($$table{$sym})? $$table{$sym}: $version;
|
||||
}
|
||||
elsif($_ =~ /^\./) {
|
||||
# Line is a roff directive.
|
||||
if($_ =~ /^\.SH\b\s*(\w*)/) {
|
||||
# Section starts. End previous one.
|
||||
my $sh = $section;
|
||||
|
||||
$section = $1;
|
||||
$_ = $line; # Previous section text.
|
||||
$line = "";
|
||||
s/\\f.//g;
|
||||
s/\s+/ /g;
|
||||
s/\\f.//g; # Remove font formatting.
|
||||
s/\s+/ /g; # One line with single space only.
|
||||
if($sh =~ /DESCRIPTION|AVAILABILITY/) {
|
||||
while($_ =~ /(?:deprecated|obsoleted?)\b\s*(?:in\b|since\b)?\s*(?:version\b|curl\b|libcurl\b)?\s*(\d[0-9.]*\d)?\b\s*(.*)$/i) {
|
||||
# Flag deprecation status.
|
||||
if($version ne "X" && $version ne "?") {
|
||||
if($1 && $1 ne $version) {
|
||||
print "error: $sym man page lists unmatching deprecation versions $version and $1\n";
|
||||
$errcode++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$version = $1 || "?";
|
||||
}
|
||||
$_ = $2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
# Text line: accumulate.
|
||||
$line .= $_;
|
||||
}
|
||||
}
|
||||
close $fh;
|
||||
$$table{$sym} = $version;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Read symbols-in-versions.
|
||||
open(F, "<$libdocdir/symbols-in-versions") ||
|
||||
die "$libdocdir/symbols-in-versions";
|
||||
while(<F>) {
|
||||
if($_ =~ /^((?:CURL|LIBCURL)\S+)\s+\S+\s*(\S*)\s*(\S*)$/) {
|
||||
if($3 eq "") {
|
||||
$syminver{$1} = "X";
|
||||
if($2 ne "" && $2 ne ".") {
|
||||
$syminver{$1} = $2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
close(F);
|
||||
|
||||
# Get header file names,
|
||||
opendir(my $dh, $incdir) || die "Can't opendir $incdir";
|
||||
my @hfiles = grep { /\.h$/ } readdir($dh);
|
||||
closedir $dh;
|
||||
|
||||
# Get functions and enum symbols from header files.
|
||||
for(@hfiles) {
|
||||
scan_header("$incdir/$_");
|
||||
}
|
||||
|
||||
# Get function statuses from man pages.
|
||||
foreach my $sym (keys %hdr) {
|
||||
if($sym =~/^(?:curl|curlx)_\w/) {
|
||||
scan_man_page("$libdocdir/$sym.3", $sym, \%funcman);
|
||||
}
|
||||
}
|
||||
|
||||
# Get options from function man pages.
|
||||
scan_man_for_opts("$libdocdir/curl_easy_setopt.3", "CURLOPT");
|
||||
scan_man_for_opts("$libdocdir/curl_easy_getinfo.3", "CURLINFO");
|
||||
|
||||
# Get deprecation status from option man pages.
|
||||
foreach my $sym (keys %syminver) {
|
||||
if($sym =~ /^(?:CURLOPT|CURLINFO)_\w+$/) {
|
||||
scan_man_page("$libdocdir/opts/$sym.3", $sym, \%optman);
|
||||
}
|
||||
}
|
||||
|
||||
# Print results.
|
||||
my %keys = (%syminver, %funcman, %optman, %hdr);
|
||||
my $leader = <<HEADER
|
||||
Legend:
|
||||
<empty> Not listed
|
||||
X Not deprecated
|
||||
? Deprecated in unknown version
|
||||
x.yy.z Deprecated in version x.yy.z
|
||||
|
||||
Symbol symbols-in func man opt man .h
|
||||
-versions
|
||||
HEADER
|
||||
;
|
||||
foreach my $sym (sort {$a cmp $b} keys %keys) {
|
||||
if($sym =~ /^(?:CURLOPT|CURLINFO|curl|curlx)_\w/) {
|
||||
my $s = exists($syminver{$sym})? $syminver{$sym}: " ";
|
||||
my $f = exists($funcman{$sym})? $funcman{$sym}: " ";
|
||||
my $o = exists($optman{$sym})? $optman{$sym}: " ";
|
||||
my $h = exists($hdr{$sym})? $hdr{$sym}: " ";
|
||||
my $r = " ";
|
||||
|
||||
# There are deprecated symbols in symbols-in-versions that are aliases
|
||||
# and thus not listed anywhere else. Ignore them.
|
||||
"$f$o$h" =~ /[X ]{3}/ && next;
|
||||
|
||||
# Check for inconsistencies between deprecations from the different sources.
|
||||
foreach my $k ($s, $f, $o, $h) {
|
||||
$r = $r eq " "? $k: $r;
|
||||
if($k ne " " && $r ne $k) {
|
||||
if($r eq "?") {
|
||||
$r = $k ne "X"? $k: "!";
|
||||
}
|
||||
elsif($r eq "X" || $k ne "?") {
|
||||
$r = "!";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($r eq "!") {
|
||||
print $leader;
|
||||
$leader = "";
|
||||
printf("%-38s %-11s %-9s %-9s %s\n", $sym, $s, $f, $o, $h);
|
||||
$errcode++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exit $errcode;
|
||||
|
|
@ -152,7 +152,7 @@ test1184 test1185 test1186 test1187 test1188 test1189 test1190 test1190 \
|
|||
test1191 test1192 test1193 test1194 test1195 test1196 test1197 test1198 \
|
||||
test1199 test1200 test1201 test1202 test1203 test1204 test1205 test1206 \
|
||||
test1207 test1208 test1209 test1210 test1211 test1212 test1213 test1214 \
|
||||
test1215 test1216 test1217 test1218 test1219 test1220 test1221 \
|
||||
test1215 test1216 test1217 test1218 test1219 test1220 test1221 test1222 \
|
||||
test1223 \
|
||||
test1224 test1225 test1226 test1227 test1228 test1229 test1230 test1231 \
|
||||
test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 \
|
||||
|
|
|
|||
24
tests/data/test1222
Normal file
24
tests/data/test1222
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<testcase>
|
||||
<info>
|
||||
<keywords>
|
||||
source analysis
|
||||
</keywords>
|
||||
</info>
|
||||
|
||||
#
|
||||
# Client-side
|
||||
<client>
|
||||
<server>
|
||||
none
|
||||
</server>
|
||||
|
||||
<name>
|
||||
Verify deprecation statuses and versions
|
||||
</name>
|
||||
|
||||
<command type="perl">
|
||||
%SRCDIR/check-deprecated.pl %SRCDIR/..
|
||||
</command>
|
||||
</client>
|
||||
|
||||
</testcase>
|
||||
|
|
@ -54,6 +54,8 @@ sub scanheader {
|
|||
open H, "<$f" || die;
|
||||
my $first = "";
|
||||
while(<H>) {
|
||||
s/CURL_DEPRECATED\(.*"\)//;
|
||||
s/ */ /g;
|
||||
if (/^(^CURL_EXTERN .*)\(/) {
|
||||
my $decl = $1;
|
||||
$decl =~ s/\r$//;
|
||||
|
|
@ -66,7 +68,7 @@ sub scanheader {
|
|||
$first = $decl;
|
||||
}
|
||||
elsif($first) {
|
||||
if (/^(.*)\(/) {
|
||||
if (/^ *(.*)\(/) {
|
||||
my $decl = $1;
|
||||
$decl =~ s/\r$//;
|
||||
$first .= $decl;
|
||||
|
|
|
|||
|
|
@ -71,7 +71,9 @@ int test(char *URL)
|
|||
/* include headers */
|
||||
easy_setopt(curl[i], CURLOPT_HEADER, 1L);
|
||||
|
||||
easy_setopt(curl[i], CURLOPT_DNS_USE_GLOBAL_CACHE, 1L);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
easy_setopt(curl[i], CURLOPT_DNS_USE_GLOBAL_CACHE, 1L);
|
||||
)
|
||||
}
|
||||
|
||||
/* make the first one populate the GLOBAL cache */
|
||||
|
|
|
|||
|
|
@ -59,8 +59,10 @@ int test(char *URL)
|
|||
easy_setopt(curl, CURLOPT_URL, URL);
|
||||
easy_setopt(curl, CURLOPT_TIMEOUT, (long)7);
|
||||
easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1);
|
||||
easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progressKiller);
|
||||
easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progressKiller);
|
||||
easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
|
||||
)
|
||||
easy_setopt(curl, CURLOPT_NOPROGRESS, (long)0);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,9 @@ int test(char *URL)
|
|||
/* Test that protocol is properly initialized on curl_easy_init.
|
||||
*/
|
||||
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
)
|
||||
if(res) {
|
||||
fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
|
||||
__FILE__, __LINE__, res, curl_easy_strerror(res));
|
||||
|
|
@ -65,7 +67,9 @@ int test(char *URL)
|
|||
/* Test that a protocol is properly set after receiving an HTTP resource.
|
||||
*/
|
||||
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
)
|
||||
if(res) {
|
||||
fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
|
||||
__FILE__, __LINE__, res, curl_easy_strerror(res));
|
||||
|
|
@ -90,7 +94,9 @@ int test(char *URL)
|
|||
goto test_cleanup;
|
||||
}
|
||||
|
||||
res = curl_easy_getinfo(dupe, CURLINFO_PROTOCOL, &protocol);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(dupe, CURLINFO_PROTOCOL, &protocol);
|
||||
)
|
||||
if(res) {
|
||||
fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
|
||||
__FILE__, __LINE__, res, curl_easy_strerror(res));
|
||||
|
|
@ -109,7 +115,9 @@ int test(char *URL)
|
|||
|
||||
curl_easy_reset(curl);
|
||||
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
)
|
||||
if(res) {
|
||||
fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
|
||||
__FILE__, __LINE__, res, curl_easy_strerror(res));
|
||||
|
|
|
|||
|
|
@ -64,8 +64,10 @@ int test(char *URL)
|
|||
easy_setopt(curl, CURLOPT_URL, URL);
|
||||
easy_setopt(curl, CURLOPT_TIMEOUT, (long)7);
|
||||
easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1);
|
||||
easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progressCallback);
|
||||
easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progressCallback);
|
||||
easy_setopt(curl, CURLOPT_PROGRESSDATA, NULL);
|
||||
)
|
||||
easy_setopt(curl, CURLOPT_NOPROGRESS, (long)0);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@ int test(char *URL)
|
|||
goto test_cleanup;
|
||||
}
|
||||
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
|
||||
)
|
||||
if(res) {
|
||||
fprintf(stderr, "curl_easy_getinfo() returned %d (%s)\n",
|
||||
res, curl_easy_strerror(res));
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ int test(char *URL)
|
|||
|
||||
test_setopt(curl, CURLOPT_URL, URL);
|
||||
test_setopt(curl, CURLOPT_HTTPHEADER, hhl);
|
||||
test_setopt(curl, CURLOPT_PUT, 1L);
|
||||
test_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
test_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
test_setopt(curl, CURLOPT_TRAILERFUNCTION, trailers_callback);
|
||||
test_setopt(curl, CURLOPT_TRAILERDATA, NULL);
|
||||
|
|
|
|||
|
|
@ -61,16 +61,18 @@ int test(char *URL)
|
|||
/*
|
||||
* Whitelist string options that are safe for abuse
|
||||
*/
|
||||
switch(o->id) {
|
||||
case CURLOPT_PROXY_TLSAUTH_TYPE:
|
||||
case CURLOPT_TLSAUTH_TYPE:
|
||||
case CURLOPT_RANDOM_FILE:
|
||||
case CURLOPT_EGDSOCKET:
|
||||
continue;
|
||||
default:
|
||||
/* check this */
|
||||
break;
|
||||
}
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
switch(o->id) {
|
||||
case CURLOPT_PROXY_TLSAUTH_TYPE:
|
||||
case CURLOPT_TLSAUTH_TYPE:
|
||||
case CURLOPT_RANDOM_FILE:
|
||||
case CURLOPT_EGDSOCKET:
|
||||
continue;
|
||||
default:
|
||||
/* check this */
|
||||
break;
|
||||
}
|
||||
)
|
||||
|
||||
/* This is a string. Make sure that passing in a string longer
|
||||
CURL_MAX_INPUT_LENGTH returns an error */
|
||||
|
|
|
|||
|
|
@ -39,42 +39,44 @@ int test(char *URL)
|
|||
for(o = curl_easy_option_next(NULL);
|
||||
o;
|
||||
o = curl_easy_option_next(o)) {
|
||||
/* Test for mismatch OR missing typecheck macros */
|
||||
if(curlcheck_long_option(o->id) !=
|
||||
(o->type == CURLOT_LONG || o->type == CURLOT_VALUES)) {
|
||||
print_err(o->name, "CURLOT_LONG or CURLOT_VALUES");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_off_t_option(o->id) != (o->type == CURLOT_OFF_T)) {
|
||||
print_err(o->name, "CURLOT_OFF_T");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_string_option(o->id) != (o->type == CURLOT_STRING)) {
|
||||
print_err(o->name, "CURLOT_STRING");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_slist_option(o->id) != (o->type == CURLOT_SLIST)) {
|
||||
print_err(o->name, "CURLOT_SLIST");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_cb_data_option(o->id) != (o->type == CURLOT_CBPTR)) {
|
||||
print_err(o->name, "CURLOT_CBPTR");
|
||||
error++;
|
||||
}
|
||||
/* From here: only test that the type matches if macro is known */
|
||||
if(curlcheck_write_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
|
||||
print_err(o->name, "CURLOT_FUNCTION");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_conv_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
|
||||
print_err(o->name, "CURLOT_FUNCTION");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_postfields_option(o->id) && (o->type != CURLOT_OBJECT)) {
|
||||
print_err(o->name, "CURLOT_OBJECT");
|
||||
error++;
|
||||
}
|
||||
/* Todo: no gcc typecheck for CURLOPTTYPE_BLOB types? */
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
/* Test for mismatch OR missing typecheck macros */
|
||||
if(curlcheck_long_option(o->id) !=
|
||||
(o->type == CURLOT_LONG || o->type == CURLOT_VALUES)) {
|
||||
print_err(o->name, "CURLOT_LONG or CURLOT_VALUES");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_off_t_option(o->id) != (o->type == CURLOT_OFF_T)) {
|
||||
print_err(o->name, "CURLOT_OFF_T");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_string_option(o->id) != (o->type == CURLOT_STRING)) {
|
||||
print_err(o->name, "CURLOT_STRING");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_slist_option(o->id) != (o->type == CURLOT_SLIST)) {
|
||||
print_err(o->name, "CURLOT_SLIST");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_cb_data_option(o->id) != (o->type == CURLOT_CBPTR)) {
|
||||
print_err(o->name, "CURLOT_CBPTR");
|
||||
error++;
|
||||
}
|
||||
/* From here: only test that the type matches if macro is known */
|
||||
if(curlcheck_write_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
|
||||
print_err(o->name, "CURLOT_FUNCTION");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_conv_cb_option(o->id) && (o->type != CURLOT_FUNCTION)) {
|
||||
print_err(o->name, "CURLOT_FUNCTION");
|
||||
error++;
|
||||
}
|
||||
if(curlcheck_postfields_option(o->id) && (o->type != CURLOT_OBJECT)) {
|
||||
print_err(o->name, "CURLOT_OBJECT");
|
||||
error++;
|
||||
}
|
||||
/* Todo: no gcc typecheck for CURLOPTTYPE_BLOB types? */
|
||||
)
|
||||
}
|
||||
#endif
|
||||
(void)URL;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@ int test(char *URL)
|
|||
|
||||
/* First set the URL that is about to receive our POST. */
|
||||
test_setopt(curl, CURLOPT_URL, URL);
|
||||
test_setopt(curl, CURLOPT_HTTPPOST, NULL);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
test_setopt(curl, CURLOPT_HTTPPOST, NULL);
|
||||
)
|
||||
test_setopt(curl, CURLOPT_VERBOSE, 1L); /* show verbose for debug */
|
||||
test_setopt(curl, CURLOPT_HEADER, 1L); /* include header */
|
||||
|
||||
|
|
|
|||
|
|
@ -100,8 +100,10 @@ int test(char *URL)
|
|||
test_setopt(curl, CURLOPT_POSTFIELDS, UPLOADTHIS);
|
||||
#else
|
||||
/* 547 style, which means reading the POST data from a callback */
|
||||
test_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback);
|
||||
test_setopt(curl, CURLOPT_IOCTLDATA, &counter);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
test_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback);
|
||||
test_setopt(curl, CURLOPT_IOCTLDATA, &counter);
|
||||
)
|
||||
test_setopt(curl, CURLOPT_READFUNCTION, readcallback);
|
||||
test_setopt(curl, CURLOPT_READDATA, &counter);
|
||||
/* We CANNOT do the POST fine without setting the size (or choose
|
||||
|
|
|
|||
|
|
@ -200,7 +200,9 @@ int test(char *URL)
|
|||
test_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
|
||||
|
||||
/* Ioctl function */
|
||||
test_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
test_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_callback);
|
||||
)
|
||||
|
||||
test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
#define CURL_DISABLE_DEPRECATION /* Using and testing the form api */
|
||||
#include "test.h"
|
||||
|
||||
#include "memdebug.h"
|
||||
|
|
|
|||
|
|
@ -95,8 +95,10 @@ int test(char *URL)
|
|||
easy_setopt(curl, CURLOPT_HEADER, 1L);
|
||||
|
||||
/* read the POST data from a callback */
|
||||
easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback);
|
||||
easy_setopt(curl, CURLOPT_IOCTLDATA, &counter);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctlcallback);
|
||||
easy_setopt(curl, CURLOPT_IOCTLDATA, &counter);
|
||||
)
|
||||
easy_setopt(curl, CURLOPT_READFUNCTION, readcallback);
|
||||
easy_setopt(curl, CURLOPT_READDATA, &counter);
|
||||
/* We CANNOT do the POST fine without setting the size (or choose
|
||||
|
|
|
|||
|
|
@ -51,8 +51,10 @@ int test(char *URL)
|
|||
|
||||
if(!res) {
|
||||
FILE *moo;
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
|
||||
&content_length);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
|
||||
&content_length);
|
||||
)
|
||||
moo = fopen(libtest_arg2, "wb");
|
||||
if(moo) {
|
||||
fprintf(moo, "CL %.0f\n", content_length);
|
||||
|
|
|
|||
|
|
@ -78,10 +78,10 @@ int test(char *URL)
|
|||
test_setopt(curl, CURLOPT_POSTFIELDS, data);
|
||||
|
||||
/* we want to use our own progress function */
|
||||
test_setopt(curl, CURLOPT_NOPROGRESS, 0L);
|
||||
test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
|
||||
/* pointer to pass to our read function */
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
test_setopt(curl, CURLOPT_NOPROGRESS, 0L);
|
||||
test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
)
|
||||
|
||||
/* get verbose debug output please */
|
||||
test_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
|
|
|||
|
|
@ -139,7 +139,9 @@ int test(char *URL)
|
|||
|
||||
/* we want to use our own progress function */
|
||||
test_setopt(curl, CURLOPT_NOPROGRESS, 0L);
|
||||
test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
)
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
|
|
|||
|
|
@ -64,7 +64,9 @@ int test(char *URL)
|
|||
|
||||
/* we want to use our own progress function */
|
||||
test_setopt(curl, CURLOPT_NOPROGRESS, 0L);
|
||||
test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
test_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||
)
|
||||
|
||||
/* get verbose debug output please */
|
||||
test_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
|
@ -80,8 +82,10 @@ int test(char *URL)
|
|||
|
||||
if(!res) {
|
||||
FILE *moo;
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
|
||||
&content_length);
|
||||
)
|
||||
moo = fopen(libtest_arg2, "wb");
|
||||
if(moo) {
|
||||
fprintf(moo, "CL %.0f\n", content_length);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
#define CURL_DISABLE_DEPRECATION /* Using and testing the form api */
|
||||
#include "test.h"
|
||||
|
||||
#include "memdebug.h"
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
#define CURL_DISABLE_DEPRECATION /* Using and testing the form api */
|
||||
#include "test.h"
|
||||
|
||||
#include "memdebug.h"
|
||||
|
|
|
|||
|
|
@ -24,6 +24,10 @@
|
|||
|
||||
#include <time.h>
|
||||
|
||||
#if !defined(LIB670) && !defined(LIB671)
|
||||
#define CURL_DISABLE_DEPRECATION /* Using and testing the form api */
|
||||
#endif
|
||||
|
||||
#include "test.h"
|
||||
|
||||
#include "memdebug.h"
|
||||
|
|
|
|||
|
|
@ -50,7 +50,9 @@ static size_t callback(char *ptr, size_t size, size_t nmemb, void *data)
|
|||
counter[idx] += (int)(size * nmemb);
|
||||
|
||||
/* Get socket being used for this easy handle, otherwise CURL_SOCKET_BAD */
|
||||
code = curl_easy_getinfo(easy[idx], CURLINFO_LASTSOCKET, &longdata);
|
||||
CURL_IGNORE_DEPRECATION(
|
||||
code = curl_easy_getinfo(easy[idx], CURLINFO_LASTSOCKET, &longdata);
|
||||
)
|
||||
if(CURLE_OK != code) {
|
||||
fprintf(stderr, "%s:%d curl_easy_getinfo() failed, "
|
||||
"with code %d (%s)\n",
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ my $minlong = "LONG_MIN";
|
|||
my $maxlong = "LONG_MAX";
|
||||
# maximum long unsigned value
|
||||
my $maxulong = "ULONG_MAX";
|
||||
my $line = "";
|
||||
my $incomment = 0;
|
||||
|
||||
print <<HEADER
|
||||
/***************************************************************************
|
||||
|
|
@ -56,6 +58,7 @@ print <<HEADER
|
|||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
#define CURL_DISABLE_DEPRECATION /* Deprecated options are tested too */
|
||||
#include "test.h"
|
||||
#include "memdebug.h"
|
||||
#include <limits.h>
|
||||
|
|
@ -182,7 +185,54 @@ HEADER
|
|||
;
|
||||
|
||||
while(<STDIN>) {
|
||||
if($_ =~ /^ CURLOPT\(([^ ]*), ([^ ]*), (\d*)\)/) {
|
||||
s/^\s*(.*?)\s*$/$1/; # Trim.
|
||||
# Remove multi-line comment trail.
|
||||
if($incomment) {
|
||||
if($_ !~ /.*?\*\/\s*(.*)$/) {
|
||||
next;
|
||||
}
|
||||
$_ = $1;
|
||||
$incomment = 0;
|
||||
}
|
||||
if($line ne "") {
|
||||
# Unfold line.
|
||||
$_ = "$line $1";
|
||||
$line = "";
|
||||
}
|
||||
# Remove comments.
|
||||
while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) {
|
||||
$_ = "$1 $2";
|
||||
}
|
||||
s/^\s*(.*?)\s*$/$1/; # Trim again.
|
||||
if($_ =~ /^(.*)\/\*/) {
|
||||
$_ = $1;
|
||||
$incomment = 1;
|
||||
}
|
||||
# Ignore preprocessor directives and blank lines.
|
||||
if($_ =~ /^(?:#|$)/) {
|
||||
next;
|
||||
}
|
||||
# Handle lines that may be continued as if they were folded.
|
||||
if($_ !~ /[;,{}]$/) {
|
||||
# Folded line.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
if($_ =~ / CURL_DEPRECATED\(/) {
|
||||
# Drop deprecation info.
|
||||
if($_ !~ /^(.*?) CURL_DEPRECATED\(.*?"\)(.*)$/) {
|
||||
# Needs unfolding.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
$_ = $1 . $2;
|
||||
}
|
||||
if($_ =~ /^CURLOPT(?:DEPRECATED)?\(/ && $_ !~ /\),$/) {
|
||||
# Multi-line CURLOPTs need unfolding.
|
||||
$line = $_;
|
||||
next;
|
||||
}
|
||||
if($_ =~ /^CURLOPT(?:DEPRECATED)?\(([^ ]*), ([^ ]*), (\d*)[,)]/) {
|
||||
my ($name, $type, $val)=($1, $2, $3);
|
||||
my $w=" ";
|
||||
my $pref = "${w}res = curl_easy_setopt(curl, $name,";
|
||||
|
|
@ -258,11 +308,11 @@ while(<STDIN>) {
|
|||
exit 22; # exit to make this noticed!
|
||||
}
|
||||
}
|
||||
elsif($_ =~ /^ CURLINFO_NONE/) {
|
||||
elsif($_ =~ /^CURLINFO_NONE/) {
|
||||
$infomode = 1;
|
||||
}
|
||||
elsif($infomode &&
|
||||
($_ =~ /^ CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) {
|
||||
($_ =~ /^CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) {
|
||||
my ($info, $type)=($1, $2);
|
||||
my $c = " res = curl_easy_getinfo(curl, CURLINFO_$info,";
|
||||
my $check = " if(UNEX(res)) {\n geterr(\"$info\", res, __LINE__);\n goto test_cleanup;\n }\n";
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
#define CURL_DISABLE_DEPRECATION /* Testing the form api */
|
||||
#include "curlcheck.h"
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue