[Bug c++/31484] New: va_list handeling different in 64bit vs 32 bit.

Klaas dot Vantournhout at UGent dot be gcc-bugzilla@gcc.gnu.org
Thu Apr 5 09:23:00 GMT 2007


Hi,

It seems that a va_list is messed up when doing multiple functioncalls
containing the va_list.  This only occurs in the 64bit versions of g++ and does
NOT occur in the 32bit versions.

This has been seen in versions 4.1.1 and 4.1.2

Below is all the suff you need (buildparameters, testcode and output)

Regards
Klaas

64 bit version
[klaas]$ g++ -v
Using built-in specs.
Target: x86_64-mandriva-linux-gnu
Configured with: ../configure --prefix=/usr --libexecdir=/usr/lib
--with-slibdir=/lib64 --mandir=/usr/share/man --infodir=/usr/share/info
--enable-checking=release
--enable-languages=c,c++,ada,fortran,objc,obj-c++,java
--host=x86_64-mandriva-linux-gnu --with-cpu=generic --with-system-zlib
--enable-threads=posix --enable-shared --enable-long-long --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-clocale=gnu --enable-java-awt=gtk
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --enable-gtk-cairo
--disable-libjava-multilib --enable-ssp --disable-libssp
Thread model: posix
gcc version 4.1.2 20070302 (prerelease) (4.1.2-1mdv2007.1)

The compiled code
<start code>
#include <iostream>
#include <cstdarg>

void f1(int,...);
void f1b(int, ...);
void f2(va_list);


int main(void) {
  std::cout << "f1" << std::endl;
  f1(3,1.2,3.6,5.9);
  std::cout << "f1b" << std::endl;
  f1b(3,1.2,3.6,5.9);
  return 0;
}
/* this function fails */
void f1(int n, ...) {
  va_list va;
  va_start(va, n);

  for (int i = 0; i < 2; ++i)
    f2(va);

  va_end(va);
}
/* this is a solution */
void f1b(int n, ...) {
  va_list va;

  for (int i = 0; i < 2; ++i) {
    va_start(va,n);
    f2(va);
    va_end(va);
  }
}

void f2(va_list va) {
  double arg1 = va_arg(va,double);
  double arg2 = va_arg(va,double);
  double arg3 = va_arg(va,double);

  std::cout << arg1 << "\t" << arg2 << "\t" << arg3 << std::endl;
}
<end code>

The 64bit output is given by
[klaas@x86_64]$ g++ bug.cpp
[klaas@x86_64]$ ./a.out
f1
1.2     3.6     5.9
3.95253e-323    2.3528e-310     2.3528e-310
f1b
1.2     3.6     5.9
1.2     3.6     5.9

The 32 bit output is given by
[klaas@i586]$ g++ bug.cpp
[klaas@i586]$ ./a.out
f1
1.2     3.6     5.9
1.2     3.6     5.9
f1b
1.2     3.6     5.9
1.2     3.6     5.9


-- 
           Summary: va_list handeling different in 64bit vs 32 bit.
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: Klaas dot Vantournhout at UGent dot be


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31484



More information about the Gcc-bugs mailing list