aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2008-02-13 21:52:19 +0000
committerJim Meyering <meyering@redhat.com>2008-02-13 21:52:19 +0000
commit26709f561f6cbf8462ee4673f676cfd4fb545d01 (patch)
tree8566dd5a1346a95b0d97f875e3cc6560430614ce /build-aux
parentIgnore ChangeLog/NEWS file for whitespace checks (diff)
downloadlibvirt-26709f561f6cbf8462ee4673f676cfd4fb545d01.tar.gz
libvirt-26709f561f6cbf8462ee4673f676cfd4fb545d01.tar.bz2
libvirt-26709f561f6cbf8462ee4673f676cfd4fb545d01.zip
Pull useless-if-before-free from gnulib, and update.
* bootstrap (gnulib_tool): Add useless-if-before-free to the list of modules. * build-aux/useless-if-before-free: Update from gnulib. * gnulib/lib/vasnprintf.c: Work around a bug in HPUX 10.20. * gnulib/m4/vasnprintf.m4: Likewise.
Diffstat (limited to 'build-aux')
-rwxr-xr-xbuild-aux/useless-if-before-free96
1 files changed, 75 insertions, 21 deletions
diff --git a/build-aux/useless-if-before-free b/build-aux/useless-if-before-free
index 57040a3d8..eb1848378 100755
--- a/build-aux/useless-if-before-free
+++ b/build-aux/useless-if-before-free
@@ -1,24 +1,43 @@
#!/usr/bin/perl -T
# Detect instances of "if (p) free (p);".
-# Likewise for "if (p != NULL) free (p);".
+# Likewise for "if (p != NULL) free (p);". And with braces.
-my $VERSION = '2008-02-04 22:25'; # UTC
+my $VERSION = '2008-02-11 08:08'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
# do its job. Otherwise, update this string manually.
-# Exit status is like grep: 0 for no match. 1 for any number.
-# Note: giving line numbers isn't practical, since I've reset the
-# input record separator.
+# Copyright (C) 2008 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Written by Jim Meyering
+
use strict;
use warnings;
use Getopt::Long;
(my $ME = $0) =~ s|.*/||;
-my $debug = 0;
-my $verbose = 0;
+# use File::Coda; # http://meyering.net/code/Coda/
+END {
+ defined fileno STDOUT or return;
+ close STDOUT and return;
+ warn "$ME: failed to close standard output: $!\n";
+ $? ||= 1;
+}
sub usage ($)
{
@@ -33,18 +52,32 @@ sub usage ($)
print $STREAM <<EOF;
Usage: $ME [OPTIONS] FILE...
+Detect any instance in FILE of a useless "if" test before a free call, e.g.,
+"if (p) free (p);". Any such test may be safely removed without affecting
+the semantics of the C code in FILE. Use --name=FOO --name=BAR to also
+detect free-like functions named FOO and BAR.
+
OPTIONS:
+ --list print only the name of each matching FILE (\0-terminated)
--name=N add name N to the list of `free'-like functions to detect;
may be repeated
--help display this help and exit
--version output version information and exit
- --verbose generate verbose output
+
+Exit status:
+
+ 0 no match
+ 1 one or more matches
+ 2 an error
EXAMPLE:
- git ls-files -z |xargs -0 $ME
+For example, this command prints all removable "if" tests before "free"
+and "kfree" calls in the linux kernel sources:
+
+ git ls-files -z |xargs -0 $ME --name=kfree
EOF
}
@@ -52,32 +85,40 @@ EOF
}
{
+ sub EXIT_MATCH {0}
+ sub EXIT_NO_MATCH {1}
+ sub EXIT_ERROR {2}
+ my $err = EXIT_NO_MATCH;
+
+ my $list;
my @name = qw(free);
GetOptions
(
- debug => \$debug,
- verbose => \$verbose,
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
+ list => \$list,
'name=s@' => \@name,
) or usage 1;
# Make sure we have the right number of non-option arguments.
# Always tell the user why we fail.
@ARGV < 1
- and (warn "$ME: missing FILE argument\n"), usage 1;
+ and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR;
my $or = join '|', @name;
my $regexp = qr/(?:$or)/;
# Set the input record separator.
+ # Note: this makes it impractical to print line numbers.
$/ = '"';
my $found_match = 0;
+ FILE:
foreach my $file (@ARGV)
{
open FH, '<', $file
- or die "$ME: can't open `$file' for reading: $!\n";
+ or (warn "$ME: can't open `$file' for reading: $!\n"),
+ $err = EXIT_ERROR, next;
while (defined (my $line = <FH>))
{
if ($line =~
@@ -85,27 +126,40 @@ EOF
(?: \s*$regexp\s*\(\s*\2\s*\)|
\s*\{\s*$regexp\s*\(\s*\2\s*\)\s*;\s*\}))/sx)
{
- print "$file: $1\n";
$found_match = 1;
+ $list
+ and (print "$file\0"), next FILE;
+ print "$file: $1\n";
}
}
+ }
+ continue
+ {
close FH;
}
- exit !$found_match;
+
+ $found_match && $err == EXIT_NO_MATCH
+ and $err = EXIT_MATCH;
+
+ exit $err;
}
my $foo = <<'EOF';
# The above is to *find* them.
# This adjusts them, removing the unnecessary "if (p)" part.
-# FIXME: do something like this as an option.
-git ls-files -z --exclude=$ME |xargs -0 \
-perl -0x3b -pi -e 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+((?:sexpr_)?free\s*\(\s*\1\s*\))/$2/s'
+# FIXME: do something like this as an option (doesn't do braces):
+git ls-files -z |xargs -0 \
+perl -0x3b -pi -e 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+(k?free\s*\(\s*\1\s*\))/$2/s'
-When modifying files, refuse to process anything other than a regular file.
+useless-if-before-free -l $(lid -knone free) | xargs -0 \
+ perl -0x3b -pi -e \
+ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+(free\s*\(\s*\1\s*\))/$2/s'
-# Or this one-liner to detect them:
-git ls-files -z |xargs -0 perl -00 -ne '/\b(if\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)(?:\s*(?:sexpr_)?free\s*\(\s*\2\s*\)|\s*\{\s*(?:sexpr_)?free\s*\(\s*\2\s*\)\s*;\s*\}))/sx and print "$1\n"'
+Be careful that the result of the above transformation is valid.
+If the matched string is followed by "else", then obviously, it won't be.
+
+When modifying files, refuse to process anything other than a regular file.
EOF
## Local Variables: