On 08/10/2007, Joshua Juran <[EMAIL PROTECTED]> wrote:
> On Oct 7, 2007, at 12:43 PM, Paul Cochrane (via RT) wrote:
>
> > # New Ticket Created by  Paul Cochrane
> > # Please include the string:  [perl #46223]
> > # in the subject line of all future correspondence about this issue.
> > # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=46223 >
> >
> >
> > Coverity Prevent mentions that the code after the C<if (p1 || p2)>
> > comparison in src/pmc/pair.pmc can never be executed.  Here is the
> > offending chunk of code (the comments are mine):
> >
> >  p1 = PMC_pmc_val(SELF);
> >  p2 = PMC_pmc_val(value);
> >
> >  if (!p1 && !p2)
> >     return 1;  /* when p1 = p2 = null, or p1 = p2 = non-null */
> >
> >  if (p1 || p2)
> >     return 0; /* when p1 = null, p2 = non-null, or p1 = non-null,
> > p2 = null */
> >
> > /* which handles all permutations of p1 and p2 */
> >
> > /* hence, the following code can never be executed */
> >  if (!mmd_dispatch_i_pp(INTERP, p1, p2, MMD_EQ))
> >     return 0;
> >
> >  return 1;
> >
> > The attached patch removes the dead code, and 'make test' passes.  If
> > there are no complaints, I'll apply this patch in about 3 days; if it
> > is approved, as soon as I am able.
>
> The "when ..." comments don't match the code.  Depending on which is
> correct I'd write either
>
>         return p1 == null  &&  p2 == null;
>
> or
>
>         return (p1 == null) == (p2 == null);

Another good reason why I submitted a patch instead of just committing
the change :-)  On looking at this again I think my reading of the
code was incorrect.  Here's another go:

This path will be taken only if p1 *and* p2 are null.
if (!p1 && !p2)
    return 1;

This path will be taken if either p1 is non-null or p2 is non-null
if (p1 || p2)
     return 0;

So the only case left is p1 is non-null *and* p2 is non-null, which
means this code *is* executed (at some stage)

if (!mmd_dispatch_i_pp(INTERP, p1, p2, MMD_EQ))
    return 0;

and it's also potentially the case that !mmd_dispatch_i_pp(INTERP, p1,
p2, MMD_EQ) evaluates to false, hence the final return of the function
could be executed.

The question now becomes: what is Coverity Prevent trying to tell us?
Is it getting mixed up somehow?

Any help would be greatly appreciated!

Paul

Reply via email to