[Libevent-users] [PATCH] initialize ev_res
Scott Lamb
slamb at slamb.org
Sat Aug 4 22:21:46 EDT 2007
Christopher Layne wrote:
> On Thu, Jul 19, 2007 at 01:14:58PM -0700, Scott Lamb wrote:
>> When I use "valgrind --tool=memcheck" on a libevent-based program, it
>> gives the following complaint:
>>
>> ==15442== Conditional jump or move depends on uninitialised value(s)
>> ==15442== at 0x4C0F2D3: event_add (event.c:632)
>> ==15442== by 0x405EE4: main_loop (net.c:356)
>> ==15442== by 0x411853: main (tincd.c:329)
>>
>> Here's the relevant portion of event.c:
>>
>> 632 if ((ev->ev_flags & EVLIST_ACTIVE) &&
>> 633 (ev->ev_res & EV_TIMEOUT)) {
>>
>> I've looked through the libevent code and verified that ev_res is always
>> initialized when (ev_flags & EVLIST_ACTIVE) is true, so there's no real
>> bug here.
>
> You wouldn't happen to have a copy of the code or atleast code segment
> which was tickling this would you?
>
> When valgrind complains about uninitialised values, it's not in the fashion
> of gcc in that "this could be uninitialised - so watch out" type of noise. It
> really is an uninitalised area being read from.
Yes, I also think it was really an uninitialized area being read from,
but not one to worry about.
As I'm sure you know, && indicates lazy evaluation - the second half
doesn't get evaluated if the first half is false. But this was an
optimized build of libevent, and I believe gcc decided that there were
no side effects from evaluating (ev->ev_res & EV_TIMEOUT) early and that
it would be faster to do the reads simultaneously, so it did so. gcc was
almost right about "no side effects" - I don't blame it for not knowing
that valgrind would complain about undefined values.
valgrind is complaining about an intermediate value. Essentially, the
code did "0 && junk". The *result* is correctly defined as 0. valgrind's
just not quite smart enough to realize that though junk was loaded into
a register, it didn't actually affect the result of a comparison or any
other operation.
Scott
More information about the Libevent-users
mailing list