On Sun, 2 Nov 2003, Roland Illig wrote:

> On Sat, Nov 01, 2003 at 09:58:46PM -0500, David Evans wrote:
> >
> > Splint's analysis isn't sophisticated enough to figure this out.  If you
> > do,
> >
> >         free(this_string);
> >         this_string = NULL;
> >
> > it will prevent the warning.
>
> I just checked the manual, and in clause 5.2.1#5 it states that
>
>     "After the release obligation is transferred, the original reference
>     is a dead pointer and the storage it points to may not be used."
>
> 5.2.1#3 says:
>
>     * assign it to an external reference declared with an only annotation
>
> According to these statements, the following program should be ok,
> shouldn't it?
>

The warning isn't complaining directly about a memory leak here --- its
complaining about the state of this_string being different along two
paths.  Along the true path, it does
        last_string = this_string;
which makes this_string dependent (but live).  On the false branch, it
does free(this_string) which makes this_string dead.  As the warning
explains,

  The state of a variable is different depending on which branch is taken.
  This means no annotation can sensibly be applied to the storage. (Use
  -branchstate to inhibit warning)

Splint's analysis avoids path explosion by merging states after multi-path
statements, but in this case the states are inconsistent so a warning is
produced.  If splint had more path sensitive analyses, or dealt with local
variable assignments in a better way, it would be able to avoid producing
the spurious warning here.

--- Dave
_______________________________________________
splint-discuss mailing list
[EMAIL PROTECTED]
http://www.splint.org/mailman/listinfo/splint-discuss

Reply via email to