va_list unter x64



  • Hallo,

    ich habe eine Funktion mit variabler Parameterliste.
    In diesen Parametern stehen u.a. Zeiger auf Objektinstanzen.
    Diese Funktion gibt die Parameter als va_list an mehrere Funktionen weiter.
    Unter x86 funtioniert das wunderbar.
    Unter x64 steht nur noch Murks in den Parameten.
    (Linux x64 g++/gcc)

    Hat jemand Erfahrungen mit dem geänderten Verhalten der va_list, etc. unter X64?

    Danke und Gruß
    Xeno



  • Wenn Du sauber programmiert hast, sollte es keine Probleme geben. Zeig mal code.

    mfg Martin



  • Im Vergleich zu x86 hat die glibc unter x86-64 eine weitere Indirektion in der va_list. Das führt dazu, dass bestimmte Dinge, die unter x86 zufällig liefen, unter x86-64 nicht laufen, und diese Dinge drehen sich in der Regel um die Mehrfachverwendung einer va_list, wo vom Standard die Verwendung von va_copy vorgeschrieben ist. Einfaches Beispiel:

    #include <stdio.h>
    #include <stdarg.h>
    
    void foo(int p, ...) {
      va_list v1;
      va_start(v1, p);
    
      vprintf("%d\n", v1);
      vprintf("%d\n", v1);
    
      va_end(v1);
    }
    
    int main(void) {
      foo(2, 3, 4);
    }
    

    Liefert

    $ gcc foo.cc && ./a.out
    3
    4
    $ gcc -m32 foo.cc && ./a.out
    3
    3
    

    Ich vermute, dass etwas in dieser Art dein Problem ist. Die Lösung ist, vor der Verwendung einer va_list eine Kopie der va_list zu ziehen, also

    #include <stdio.h>
    #include <stdarg.h>
    
    void foo(int p, ...) {
      va_list v1;
      va_list v2;
    
      va_start(v1, p);
      va_copy(v2, v1);
    
      vprintf("%d\n", v1);
      vprintf("%d\n", v2);
    
      va_end(v2);
      va_end(v1);
    }
    
    int main(void) {
      foo(2, 3, 4);
    }
    

    Das sollte dann überall funktionieren. Ansonsten: Da du in C++ unterwegs bist, geht das mit variadischen Templates alles angenehmer und typsicher.



  • Hallo,

    mein Problem war zwar schon gelöst,
    aber ich danke für die prima Erklärung.
    Gerade auf der Punkt "die unter x86 zufällig liefen" war mein Problem, bei unsauberer Weitergabe und Auswertung der Liste.

    Gruß

    EDIT- Ich seh gerade, daß meine Markierung und die Antwort ) ein paar Stunden nach der Fragestellung) in der ich das Thema als gelöst gemeldet habe, nicht "angekommen" ist...


Log in to reply