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?
Thanks in advance!
#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;
}