Macy Gasp writes:
 > Hi everybody,
 > 
 > I'm experiencing a weird behaviour when using va_list with gcc 4.1.2
 > on a x86_64 linux distribution.
 > 
 > Below is my test program (yes, I know about the possible buffer
 > overflows but please, bear with me, this is just a proof of concept):
 > 
 > #include <stdio.h>
 > #include <stdarg.h>
 > 
 > int var(const char* fmt, ...)
 > {
 >     va_list args;
 >     char buf[4096];
 > 
 >     va_start(args, fmt);
 > 
 >     vsprintf(buf, fmt, args);
 >     fprintf(stderr,"\n[%s]", buf);
 > 
 >     vsprintf(buf, fmt, args);
 >     fprintf(stderr,"\n[%s]", buf);
 > 
 >     va_end(args);
 > 
 >     return 0;
 > }
 > 
 > int main()
 > {
 >     var("Hello world: %s %s %s %d", "hdha", "saooh", "kekek", 34);
 >     return 0;
 > }
 > 
 > 
 > The problem arising on x86_64 is that the "args" variable gets somehow
 > modified by the first vsprintf() call, so that when I use it in the
 > second one, it will point to invalid (?) arguments and fprintf will
 > print out junk.
 > What confuses me is that this seems to be 64-bit related, since the
 > same code, on x86 seems to work! (I'm using gcc 4.2.2 on x86
 > though...). Also tested this on a 64bit sparc machine and the code
 > behaves properly, like the one on x86.
 > 
 > Can anyone please explain this behaviour to me? Is it a bug or am I
 > using va_list in a non-standard way?

This is not appropriate for the gcc list, which is for gcc developers.
Please ask such questions on [EMAIL PROTECTED]

Read the Fine Manual:


       int vsprintf(char *str, const char *format, va_list ap);

       The functions vprintf(), vfprintf(), vsprintf(), vsnprintf()
       are equivalent to the functions printf(), fprintf(), sprintf(),
       snprintf(), respectively, except that they are called with a
       va_list instead of a variable number of arguments. These
       functions do not call the va_end macro. Consequently, the value
       of ap is undefined after the call. The application should call
       va_end(ap) itself afterwards.


Andrew.

Reply via email to