Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Aug 2004 10:29:19 -0700
From:      Sean McNeil <sean@mcneil.com>
To:        Peter Wemm <peter@wemm.org>
Cc:        freebsd-amd64@freebsd.org
Subject:   Re: va_list structure passing as argument
Message-ID:  <1093368559.9914.15.camel@server.mcneil.com>
In-Reply-To: <200408240220.45554.peter@wemm.org>
References:  <1093328434.6603.21.camel@server.mcneil.com> <200408240220.45554.peter@wemm.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 2004-08-24 at 02:20, Peter Wemm wrote:
> On Monday 23 August 2004 11:20 pm, Sean McNeil wrote:
> > I'm looking at a problem I have on the amd64 with bsdtar. 
> > Essentially, you get a core dump if you try to run the following:
> >
> > tar zxvvf nonexistent.tar.gz
> >
> > I've tracked it down to an issue where the ap is getting changed as a
> > side-effect of calling __vfprintf.  It looks like this is happening
> > because the va_list structure is being passed by reference.  The
> > va_list structure on amd64 is 24 bytes.  I'm guessing that it is 16
> > bytes or less for i386.  It has been a while since I've looked at the
> > macro that determines when a structure is passed by reference or
> > value.  Does anyone know what that is?  I'm guessing that 24 passes
> > that cutoff but 16 does not and that is why I see this bug on amd64
> > and not i386.
> 
> Yes, its an external value.  Consider it a pointer.  It is the same on 
> both ppc and amd64.
> 
> The problem is that vfprintf  "consumes" the values and advances the 
> counters in the structure.  (The argument passing ABI is very complex)
> 
> What you need to do is this:
> myfunc(va_list ap)
> {
> 	va_list apcopy;
> 
> 	va_copy(apcopy, ap);
> 	vprintf(stuff, ap1);
> 	va_copy(apcopy, ap);
> 	do_stuff_with(ap1);
> }
> etc.  Using va_copy is "correct" for all our platforms, but neglecting 
> to use it is only fatal for amd64 and ppc.
> 
> Does that make sense?

Makes sense and is what I tried originally.  I figured this wasn't
correct, however, as it means that a side-effect of the call is
allowable.  What you are indicating is that it is allowable and
expected.  The problem is, the side-effect will only happen on ppc and
amd64 since i386 will pass the va_list by value.

Thanks,
Sean




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1093368559.9914.15.camel>