typecheck-gcc.h: fix the typechecks

Refreshed, cleaned up, improved and now checks *all* options.

This must have stopped working at some point. gcc-14 least shows these
warnings with this change, not without.

Add test 745 to verify that all options listed in curl.h is also checked
by the typechecker.

This improved checker found almost 30 mistakes in the curl git
repository.

Closes #17143
This commit is contained in:
Daniel Stenberg 2025-04-22 22:20:27 +02:00
parent 29e0a8a09b
commit 79b4e56b3f
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
5 changed files with 462 additions and 197 deletions

View file

@ -51,6 +51,7 @@ TESTSCRIPTS = \
test1488.pl \
test1544.pl \
test1707.pl \
test745.pl \
test971.pl
EXTRA_DIST = \

View file

@ -107,6 +107,7 @@ test709 test710 test711 test712 test713 test714 test715 test716 test717 \
test718 test719 test720 test721 test722 test723 test724 test725 test726 \
test727 test728 test729 test730 test731 test732 test733 test734 test735 \
test736 test737 test738 test739 test740 test741 test742 test743 test744 \
test745 \
\
test780 test781 test782 test783 test784 test785 test786 test787 test788 \
test789 test790 test791 \

31
tests/data/test745 Normal file
View file

@ -0,0 +1,31 @@
<testcase>
<info>
<keywords>
source analysis
symbols-in-versions
</keywords>
</info>
#
# Client-side
<client>
<server>
none
</server>
<name>
Verify that typecheck-gcc and curl.h are in sync
</name>
<command type="perl">
%SRCDIR/test745.pl %SRCDIR/..
</command>
</client>
<verify>
<stdout>
OK
</stdout>
</verify>
</testcase>

84
tests/test745.pl Executable file
View file

@ -0,0 +1,84 @@
#!/usr/bin/env perl
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
# Copyright (C) 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
#
###########################################################################
#
#
use strict;
use warnings;
# we may get the dir root pointed out
my $root=$ARGV[0] || ".";
my %typecheck; # from the include file
my %enum; # from libcurl-errors.3
sub gettypecheck {
open(my $f, "<", "$root/include/curl/typecheck-gcc.h")
|| die "no typecheck file";
while(<$f>) {
chomp;
if($_ =~ /\(option\) == (CURL[^ \)]*)/) {
$typecheck{$1}++;
}
}
close($f);
}
sub getinclude {
open(my $f, "<", "$root/include/curl/curl.h")
|| die "no curl.h";
while(<$f>) {
if($_ =~ /\((CURLOPT[^,]*), (CURLOPTTYPE_[^,]*)/) {
my ($opt, $type) = ($1, $2);
if($type !~ /LONG|VALUES|BLOB|OFF_T/) {
$enum{$opt}++;
}
}
}
$enum{"CURLOPT_SOCKS5_GSSAPI_SERVICE"}++;
$enum{"CURLOPT_CONV_FROM_NETWORK_FUNCTION"}++;
$enum{"CURLOPT_CONV_FROM_UTF8_FUNCTION"}++;
$enum{"CURLOPT_CONV_TO_NETWORK_FUNCTION"}++;
close($f);
}
gettypecheck();
getinclude();
my $error;
for(sort keys %typecheck) {
if($typecheck{$_} && !$enum{$_}) {
print "$_ is not in curl.h\n";
$error++;
}
}
for(sort keys %enum) {
if($enum{$_} && !$typecheck{$_}) {
print "$_ is not checked in typecheck-gcc-h\n";
$error++;
}
}
print "OK\n" if(!$error);