diff options
author | 2008-02-13 21:52:19 +0000 | |
---|---|---|
committer | 2008-02-13 21:52:19 +0000 | |
commit | 26709f561f6cbf8462ee4673f676cfd4fb545d01 (patch) | |
tree | 8566dd5a1346a95b0d97f875e3cc6560430614ce /build-aux | |
parent | Ignore ChangeLog/NEWS file for whitespace checks (diff) | |
download | libvirt-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-x | build-aux/useless-if-before-free | 96 |
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: |