On Fri, Jun 20, 2008 at 09:56:01PM -0700, Dan Kegel wrote: > While looking at the valgrind warning in > http://kegel.com/wine/valgrind/logs-2008-06-20/vg-oleaut32_tmarshal.txt > > Conditional jump or move depends on uninitialised value(s) > at serialize_param (tmarshal.c:736) > by serialize_param (tmarshal.c:744) > by xCall (tmarshal.c:1414) > by ??? > by func_tmarshal (tmarshal.c:1179) > by run_test (test.h:449) > by main (test.h:498) > Uninitialised value was created by a stack allocation > at test_typelibmarshal (tmarshal.c:762) > > The problem happens during a call to this method > where widget is a pointer to an uninitialized pointer > which will receive the pointer to the widget: > > interface IKindaEnumWidget : IUnknown > { > HRESULT Next( > [out] IWidget **widget); > > I discovered that the attached patch prevented the problem. > I don't quite understand why; at first glance, > widget is an out parameter from the function, > why would it be dereferenced while serializing > the call?
> diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c > index 3812b72..b1ade9b 100644 > --- a/dlls/oleaut32/tests/tmarshal.c > +++ b/dlls/oleaut32/tests/tmarshal.c > @@ -792,6 +792,7 @@ static void test_typelibmarshal(void) > ok_ole_success(hr, CoUnmarshalInterface); > IStream_Release(pStream); > > + pWidget = NULL; > hr = IKindaEnumWidget_Next(pKEW, &pWidget); > ok_ole_success(hr, IKindaEnumWidget_Next); Not sure why, but I think it is unclear from the [out] tag where the code starts allocating. Perhaps in *widget, but perhaps it might just fill out **widget. Not sure if IDL has a clear definition on when the [out] tag starts to apply. ciao, Marcus