From: Guy Harris Date: Wed, 5 Feb 2020 03:08:10 +0000 (-0800) Subject: Do some tests based on the type of floating-point arithmetic tcpdump does. X-Git-Tag: tcpdump-4.99-bp~556 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/92e3315c9ff248778c825015ac16553d4b8b4f7f Do some tests based on the type of floating-point arithmetic tcpdump does. Add a --fp-type flag to tcpdump, which causes it to do a floating-point operation and, based on the result of the operation, prints out "FPTYPE{n}", where {n} is a number indicating the result. Have tests/TESTrun run "./tcpdump --fp-type" and set a HAVE_ key based on that. Run some tests only for FPTYPE1. --- diff --git a/Makefile.in b/Makefile.in index 694fb18b..2b3b7e3d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -70,7 +70,7 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@ @rm -f $@ $(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c -CSRC = tcpdump.c +CSRC = fptype.c tcpdump.c LIBNETDISSECT_SRC=\ addrtoname.c \ diff --git a/tcpdump.c b/tcpdump.c index 64aad160..40505b2c 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -150,6 +150,8 @@ The Regents of the University of California. All rights reserved.\n"; #include "print.h" +#include "fptype.h" + #ifndef PATH_MAX #define PATH_MAX 1024 #endif @@ -687,6 +689,7 @@ show_remote_devices_and_exit(void) #define OPTION_LIST_REMOTE_INTERFACES 132 #define OPTION_TSTAMP_MICRO 133 #define OPTION_TSTAMP_NANO 134 +#define OPTION_FP_TYPE 135 static const struct option longopts[] = { #if defined(HAVE_PCAP_CREATE) || defined(_WIN32) @@ -730,6 +733,7 @@ static const struct option longopts[] = { { "debug-filter-parser", no_argument, NULL, 'Y' }, #endif { "relinquish-privileges", required_argument, NULL, 'Z' }, + { "fp-type", no_argument, NULL, OPTION_FP_TYPE }, { "number", no_argument, NULL, '#' }, { "print", no_argument, NULL, OPTION_PRINT }, { "version", no_argument, NULL, OPTION_VERSION }, @@ -1891,6 +1895,26 @@ main(int argc, char **argv) break; #endif + case OPTION_FP_TYPE: + /* + * Print out the type of floating-point arithmetic + * we're doing; it's probably IEEE, unless somebody + * tries to run this on a VAX, but the precision + * may differ (e.g., it might be 32-bit, 64-bit, + * or 80-bit). + */ + switch (float_type_check(0x4e93312d)) { + + case 0x461a5794: + printf("FPTYPE1\n"); + break; + + default: + printf("FPTYPE2\n"); + break; + } + return 0; + default: print_usage(); exit_tcpdump(S_ERR_HOST_PROGRAM); diff --git a/tests/TESTrun b/tests/TESTrun index e106057f..ea138985 100755 --- a/tests/TESTrun +++ b/tests/TESTrun @@ -68,17 +68,13 @@ sub loadconfighash { close(CONFIG_H); #print Dumper($main::confighhash); - # also grovel Makefile for some things and pretend they are config options. - open(MAKEFILE, "Makefile") || die "can not open Makefile: $!\n"; - while() { - chomp; - #print "Processing $_\n"; - if(/^CC\s*=.*gcc.*/) { - #print "GCC FOUND\n"; - $main::confighhash->{'USING_GCC'} = 1; - } - } - close(MAKEFILE); + # also run tcpdump --fp-type to get the type of floating-point + # arithmetic we're doing, setting a HAVE_{fptype} key + open(FPTYPE_PIPE, "./tcpdump --fp-type |") or die("piping tcpdump --fp-type failed\n"); + my $have_fptype = "HAVE_" . ; + close(FPTYPE_PIPE); + $have_fptype =~ s/^\s+|\s+$//g; + $main::confighhash->{$have_fptype} = 1; return $main::confighhash; } diff --git a/tests/isis-seg-fault-1-v.tests b/tests/isis-seg-fault-1-v.tests index 857f5374..7d3714ef 100644 --- a/tests/isis-seg-fault-1-v.tests +++ b/tests/isis-seg-fault-1-v.tests @@ -1,11 +1,14 @@ # -*- perl -*- # This "verbose" ISIS protocol test involves a float calculation that -# may produce a slightly different result if the compiler is not GCC. -# Test only with GCC (similar to GitHub issue #333). +# may produce a slightly different result depending on the compiler and +# the version of the instruction set for which it's generating code (see +# GitHub issue #333 for another example). The test is done only if we have +# a floating-point type, as reported by "./tcpdump --fp-type", of FPTYPE1. $testlist = [ { + config_set => 'HAVE_FPTYPE1', name => 'isis-seg-fault-1-v', input => 'isis-seg-fault-1.pcapng', output => 'isis-seg-fault-1-v.out', diff --git a/tests/lmp-v.tests b/tests/lmp-v.tests index 01c4ede1..e2c424ed 100644 --- a/tests/lmp-v.tests +++ b/tests/lmp-v.tests @@ -1,13 +1,14 @@ # -*- perl -*- # The "verbose" Link Management Protocol test involves a float calculation that -# may produce a slightly different result depending on the architecture and the -# compiler (see GitHub issue #333). The reference output was produced using a -# GCC build and must reproduce correctly on any other GCC build regardless of -# the architecture. +# may produce a slightly different result depending on the compiler and the +# version of the instruction set for which it's generating code (see GitHub +# issue #333). The test is done only if we have a floating-point type, as +# reported by "./tcpdump --fp-type", of FPTYPE1. $testlist = [ { + config_set => 'HAVE_FPTYPE1', name => 'lmp-v', input => 'lmp.pcap', output => 'lmp-v.out',