Add support for "API groups" in checkAPIs.pl. Make the "prohibited"

and "deprecated" groups the default. Add an "abort" group for code that
shouldn't exit the program. Update the makefiles to call "checkAPIs.pl
-g abort" for dissectors. Remove a dependency on "cat" in checkAPIs.pl.

svn path=/trunk/; revision=25614
This commit is contained in:
Gerald Combs 2008-06-26 22:20:05 +00:00
parent 708fbadf26
commit 83aacf0a09
32 changed files with 183 additions and 151 deletions

View File

@ -111,6 +111,6 @@ maintainer-clean: distclean
rm -f $(GENERATED_FILES)
checkapi:
$(PERL) ../../tools/checkAPIs.pl \
$(PERL) ../../tools/checkAPIs.pl -g abort \
$(ALL_DISSECTORS_SRC) \
packet-dcerpc-nt.c

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -101,4 +101,4 @@ maintainer-clean: distclean
checkapi:
# TODO: Fix api's :)
# $(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
# $(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -64,4 +64,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -51,7 +51,7 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl \
$(PERL) ../../tools/checkAPIs.pl -g abort \
packet-cosnaming.c \
packet-coseventcomm.c \
packet-tango.c \

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -96,4 +96,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -128,4 +128,4 @@ $(LEMON)\lemon.exe:
cd ../../plugins/mate
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -54,4 +54,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(TAP_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(TAP_SRC)

View File

@ -65,4 +65,4 @@ $(LEMON)\lemon.exe:
cd ../../plugins/mate
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,4 +100,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -100,6 +100,6 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl \
$(PERL) ../../tools/checkAPIs.pl -g abort \
$(DISSECTOR_SRC) \
$(DISSECTOR_SUPPORT_SRC)

View File

@ -108,4 +108,4 @@ distclean: clean
maintainer-clean: distclean
checkapi:
$(PERL) ../../tools/checkAPIs.pl $(DISSECTOR_SRC)
$(PERL) ../../tools/checkAPIs.pl -g abort $(DISSECTOR_SRC)

View File

@ -6,6 +6,9 @@
# A simple tool to check source code for function calls that should not
# be called by Wireshark code.
#
# Usage:
# checkAPIs.pl [-g group1] [-g group2] file1 file2 ...
#
# $Id$
#
# Wireshark - Network traffic analyzer
@ -28,119 +31,138 @@
#
use strict;
use Getopt::Long;
my %APIs = (
# API groups.
# # Group name, e.g. 'prohibited'
# '<name>' => {
# # 1 if these are errors, 0 if warnings
# 'count_errors' => 1,
# # Function list
# 'functions' => [ 'f1', f2', ... ] },
# APIs that MUST NOT be used in Wireshark
'prohibited' => { 'count_errors' => 1, 'functions' => [
# Memory-unsafe APIs
# Use something that won't overwrite the end of your buffer instead
# of these:
'gets',
'sprintf',
'vsprintf',
'strcpy',
'strncpy',
'strcat',
'strncat',
'cftime',
'ascftime',
### non-portable APIs
# use glib (g_*) versions instead of these:
'ntohl',
'ntohs',
'htonl',
'htons',
'strdup',
'strndup',
### non-ANSI C
# use memset, memcpy, memcmp instead of these:
'bzero',
'bcopy',
'bcmp',
# use ep_*, se_*, or g_* functions instead of these:
# (One thing to be aware of is that space allocated with malloc()
# may not be freeable--at least on Windows--with g_free() and
# vice-versa.)
'malloc',
'free',
# Locale-unsafe APIs
# These may have unexpected behaviors in some locales (e.g.,
# "I" isn't always the upper-case form of "i", and "i" isn't
# always the lower-case form of "I"). Use the g_ascii_* version
# instead.
'strcasecmp',
'strncasecmp',
'g_strcasecmp',
'g_strncasecmp',
'g_strup',
'g_strdown',
'g_string_up',
'g_string_down',
# Use the ws_* version of these:
# (Necessary because on Windows we use UTF8 for throughout the code
# so we must tweak that to UTF16 before operating on the file. Code
# using these functions will work unless the file/path name contains
# non-ASCII chars.)
'open',
'rename',
'mkdir',
'stat',
'unlink',
'remove',
'fopen',
'freopen',
# Misc
'tmpnam' # use mkstemp
]},
# APIs that SHOULD NOT be used in Wireshark (any more)
'deprecated' => { 'count_errors' => 0, 'functions' => [
### Depreciated glib functions
# use g_string_printf() instead of:
'g_string_sprintf',
# use g_string_append_printf instead of:
'g_string_sprintfa',
'g_tree_traverse',
'g_basename',
'g_dirname',
'g_hash_table_freeze',
'g_hash_table_thaw',
'G_HAVE_GINT64',
'g_io_channel_close',
'g_io_channel_read',
'g_io_channel_seek',
'g_io_channel_write',
'g_main_new',
'g_main_destroy',
'g_main_run',
'g_main_set_poll_func',
'g_scanner_add_symbol',
'g_scanner_remove_symbol',
'g_scanner_foreach_symbol',
'g_scanner_freeze_symbol_table',
'g_scanner_thaw_symbol_table',
# Wireshark should not write to stdout (?)
# (Of course tshark should!)
'printf',
'perror',
# Use PROTO_ITEM_SET_HIDDEN instead of these:
'proto_tree_add_item_hidden',
'proto_tree_add_bytes_hidden',
'proto_tree_add_time_hidden',
'proto_tree_add_ipxnet_hidden',
'proto_tree_add_ipv4_hidden',
'proto_tree_add_ipv6_hidden',
'proto_tree_add_ether_hidden',
'proto_tree_add_guid_hidden',
'proto_tree_add_oid_hidden',
'proto_tree_add_string_hidden',
'proto_tree_add_boolean_hidden',
'proto_tree_add_float_hidden',
'proto_tree_add_double_hidden',
'proto_tree_add_uint_hidden',
'proto_tree_add_int_hidden',
]},
# APIs that make the program exit. Dissectors shouldn't call these
'abort' => { 'count_errors' => 1, 'functions' => [
'abort',
'exit',
'g_assert',
'g_error',
]},
# APIs that MUST NOT be used in Wireshark
my @prohibitedAPIs=
(
# Memory-unsafe APIs
# Use something that won't overwrite the end of your buffer instead
# of these:
'gets',
'sprintf',
'vsprintf',
'strcpy',
'strncpy',
'strcat',
'strncat',
'cftime',
'ascftime',
### non-portable APIs
# use glib (g_*) versions instead of these:
'ntohl',
'ntohs',
'htonl',
'htons',
'strdup',
'strndup',
### non-ANSI C
# use memset, memcpy, memcmp instead of these:
'bzero',
'bcopy',
'bcmp',
# use ep_*, se_*, or g_* functions instead of these:
# (One thing to be aware of is that space allocated with malloc()
# may not be freeable--at least on Windows--with g_free() and
# vice-versa.)
'malloc',
'free',
# Locale-unsafe APIs
# These may have unexpected behaviors in some locales (e.g.,
# "I" isn't always the upper-case form of "i", and "i" isn't
# always the lower-case form of "I"). Use the g_ascii_* version
# instead.
'strcasecmp',
'strncasecmp',
'g_strcasecmp',
'g_strncasecmp',
'g_strup',
'g_strdown',
'g_string_up',
'g_string_down',
# Use the ws_* version of these:
# (Necessary because on Windows we use UTF8 for throughout the code
# so we must tweak that to UTF16 before operating on the file. Code
# using these functions will work unless the file/path name contains
# non-ASCII chars.)
'open',
'rename',
'mkdir',
'stat',
'unlink',
'remove',
'fopen',
'freopen',
# Misc
'tmpnam' # use mkstemp
);
# APIs that SHOULD NOT be used in Wireshark (any more)
my @deprecatedAPIs=
(
### Depreciated glib functions
# use g_string_printf() instead of:
'g_string_sprintf',
# use g_string_append_printf instead of:
'g_string_sprintfa',
'g_tree_traverse',
'g_basename',
'g_dirname',
'g_hash_table_freeze',
'g_hash_table_thaw',
'G_HAVE_GINT64',
'g_io_channel_close',
'g_io_channel_read',
'g_io_channel_seek',
'g_io_channel_write',
'g_main_new',
'g_main_destroy',
'g_main_run',
'g_main_set_poll_func',
'g_scanner_add_symbol',
'g_scanner_remove_symbol',
'g_scanner_foreach_symbol',
'g_scanner_freeze_symbol_table',
'g_scanner_thaw_symbol_table',
# Wireshark should not write to stdout (?)
# (Of course tshark should!)
'printf',
'perror',
# Use PROTO_ITEM_SET_HIDDEN instead of these:
'proto_tree_add_item_hidden',
'proto_tree_add_bytes_hidden',
'proto_tree_add_time_hidden',
'proto_tree_add_ipxnet_hidden',
'proto_tree_add_ipv4_hidden',
'proto_tree_add_ipv6_hidden',
'proto_tree_add_ether_hidden',
'proto_tree_add_guid_hidden',
'proto_tree_add_oid_hidden',
'proto_tree_add_string_hidden',
'proto_tree_add_boolean_hidden',
'proto_tree_add_float_hidden',
'proto_tree_add_double_hidden',
'proto_tree_add_uint_hidden',
'proto_tree_add_int_hidden',
);
# Given a list of APIs and the contents of a file, see if the API appears
# in the file. If so, push the API onto the provided list.
@ -188,12 +210,16 @@ my $commentAndStringRegex = qr{(?:$DoubleQuotedStr|$SingleQuotedStr)|($CComment)
# MAIN
#
my $errorCount = 0;
# The default list, which can be expanded.
my @apiGroups = qw(prohibited deprecated);
GetOptions('g=s' => \@apiGroups);
while ($_ = $ARGV[0])
{
shift;
my $filename = $_;
my @foundProhibitedAPIs = ();
my @foundDeprecatedAPIs = ();
my $fileContents = '';
my @foundAPIs = ();
die "No such file: \"$filename\"" if (! -e $filename);
@ -201,7 +227,9 @@ while ($_ = $ARGV[0])
$filename =~ s@^\./@@;
# Read in the file (ouch, but it's easier that way)
my $fileContents = `cat $filename`;
open(FC, $filename) || die("Couldn't open $filename");
while (<FC>) { $fileContents .= $_; }
close(FC);
if ($fileContents =~ m{[\x80-\xFF]})
{
@ -231,16 +259,20 @@ while ($_ = $ARGV[0])
$errorCount++;
}
findAPIinList(\@prohibitedAPIs, \$fileContents, \@foundProhibitedAPIs);
for my $apiName (@apiGroups) {
my $pfx = "Warning";
@foundAPIs = ();
# the use of "prohibited" APIs is an error, increment the error count
$errorCount += @foundProhibitedAPIs;
findAPIinList($APIs{$apiName}->{functions}, \$fileContents, \@foundAPIs);
findAPIinList(\@deprecatedAPIs, \$fileContents, \@foundDeprecatedAPIs);
# (the use of deprecated APIs is bad but not an error)
if ($APIs{$apiName}->{count_errors}) {
# the use of "prohibited" APIs is an error, increment the error count
$errorCount += @foundAPIs;
$pfx = "Error";
}
print "Error: Found prohibited APIs in ".$filename.": ".join(',', @foundProhibitedAPIs)."\n" if @foundProhibitedAPIs;
print "Warning: Found deprecated APIs in ".$filename.": ".join(',', @foundDeprecatedAPIs)."\n" if @foundDeprecatedAPIs;
print $pfx . ": Found " . $apiName . " APIs in ".$filename.": ".join(',', @foundAPIs)."\n" if @foundAPIs;
}
}