public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
From: "Hans-Bernhard Bröker" <HBBroeker@t-online.de>
To: cygwin@cygwin.com
Subject: Re: free() and implicit conversion to a function pointer (was: Use of initialized variable in strtod.c)
Date: Thu, 16 Mar 2017 19:25:00 -0000	[thread overview]
Message-ID: <f76885f4-f99f-dc50-2a19-cb892a62db7e@t-online.de> (raw)
In-Reply-To: <c5af0608-17c4-2270-dbba-c3b704c9226e@t-online.de>

[Sorry, forgot to reply-all...]

Am 15.03.2017 um 23:48 schrieb Jeffrey Walton:

> Since Coverity is
> complaining about an implicit conversion, maybe the following will
> help to avoid the implicit part (and sidestep the finding):
>
>     if (free != NULL)
>         break;
>
> Or perhaps:
>
>     if ((void*)free != NULL)
>         break;

Even setting aside that the latter should of course have been

      if ((void*)free == NULL)
          break;

those are both worse than the original code.  (void *) is _not_ suitable 
for use with function pointers.  Neither is NULL in the general case, 
because it may very well be ((void *)0).

The reason this is wrong is that C by design treats data and functions 
as living in separate realms, i.e. its virtual machine has a Harvard 
architecture.  One of the consequences of this is that pointers to 
functions and pointers to data are incommensurable, i.e. any and all 
conversions or comparisons across this divide are wrong.  (void *) are 
compatible to all data pointers, but not to function pointers.

The only code that might actually be a slight bit better than the given

	if (! free)

would be

	if (0 != free)

The function designator `free' auto-decays into a function pointer, 
which is compared to a null pointer constant: 0.  The ! operator does 
that same thing implicitly, but is fully equivalent to it.

In other words: that message from Coverity is just _wrong_, so it 
_should_ be disabled.


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

       reply	other threads:[~2017-03-16 19:25 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <c5af0608-17c4-2270-dbba-c3b704c9226e@t-online.de>
2017-03-16 19:25 ` Hans-Bernhard Bröker [this message]
2017-03-16 21:46   ` free() and implicit conversion to a function pointer L A Walsh
2017-03-16 23:49     ` Hans-Bernhard Bröker
2017-03-17  8:30       ` Corinna Vinschen
2017-03-17 21:01         ` Hans-Bernhard Bröker
2017-03-20 18:43   ` Eric Blake

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f76885f4-f99f-dc50-2a19-cb892a62db7e@t-online.de \
    --to=hbbroeker@t-online.de \
    --cc=cygwin@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).