Code

Avoid unnecessary "if-before-free" tests.
authorJim Meyering <meyering@redhat.com>
Thu, 31 Jan 2008 17:26:32 +0000 (18:26 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 22 Feb 2008 22:14:40 +0000 (14:14 -0800)
commit8e0f70033b2bd1679a6e5971978fdc3ee09bdb72
tree20da93fcc3557caaeecf8ca807b9ec2877fd6d25
parent22c430ad8468133fa5ed46d8407d7f4cde2c4a0e
Avoid unnecessary "if-before-free" tests.

This change removes all obvious useless if-before-free tests.
E.g., it replaces code like this:

        if (some_expression)
                free (some_expression);

with the now-equivalent:

        free (some_expression);

It is equivalent not just because POSIX has required free(NULL)
to work for a long time, but simply because it has worked for
so long that no reasonable porting target fails the test.
Here's some evidence from nearly 1.5 years ago:

    http://www.winehq.org/pipermail/wine-patches/2006-October/031544.html

FYI, the change below was prepared by running the following:

  git ls-files -z | xargs -0 \
  perl -0x3b -pi -e \
    's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+(free\s*\(\s*\1\s*\))/$2/s'

Note however, that it doesn't handle brace-enclosed blocks like
"if (x) { free (x); }".  But that's ok, since there were none like
that in git sources.

Beware: if you do use the above snippet, note that it can
produce syntactically invalid C code.  That happens when the
affected "if"-statement has a matching "else".
E.g., it would transform this

  if (x)
    free (x);
  else
    foo ();

into this:

  free (x);
  else
    foo ();

There were none of those here, either.

If you're interested in automating detection of the useless
tests, you might like the useless-if-before-free script in gnulib:
[it *does* detect brace-enclosed free statements, and has a --name=S
 option to make it detect free-like functions with different names]

  http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob;f=build-aux/useless-if-before-free

Addendum:
  Remove one more (in imap-send.c), spotted by Jean-Luc Herren <jlh@gmx.ch>.

Signed-off-by: Jim Meyering <meyering@redhat.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
17 files changed:
builtin-blame.c
builtin-branch.c
builtin-fast-export.c
builtin-http-fetch.c
builtin-pack-objects.c
builtin-revert.c
connect.c
diff.c
dir.c
http-push.c
imap-send.c
interpolate.c
pretty.c
remote.c
setup.c
sha1_name.c
xdiff-interface.c