Autor Thema: printf() Bug  (Gelesen 5053 mal)

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« am: 02. October 2005, 00:00 »
Auch wenn das nicht gerade LowLevel Code ist, habe ich hier ein kleines Problem mit meinem printf () Code. Ich finde einfach den Fehler nicht, warscheinlich sehe ich einfach den Wald vor lauter Bäumen nicht.

Hier ist mein relevanter Code:
// stdarg.h
typedef char *va_list;

#define va_start(AP, LASTARG) (AP = ((char *) &(LASTARG)))
#define va_end(AP)
#define va_arg(AP, TYPE) (AP += 4,  *((TYPE *) (AP)))

//debug.c
void kernelFormatString (char *fmt, va_list args)
{
char buffer[1024];
char *ptr = buffer;

while (*fmt != 0)
{
if (*fmt == '%')
{
fmt++;
if (*fmt == 's') {
char *string = va_arg (args, char *);

while (*string != 0) {
*ptr++ = *string++;
}
}
}else{
*ptr++ = *fmt;
}

fmt++;
}

*ptr = 0;


// debugOut gibt den string aus, debugOut funktioniert aber richtig
debugOut (buffer);
}

void kernelPrint (char *fmt, ...)
{
va_list args;
va_start (args, fmt);

kernelFormatString (fmt, args);

va_end (args);

}

void debugInfo (char *system, char *fmt, ...)
{
va_list args;
va_start (args, fmt);

kernelPrint ("(%s)", system);
kernelFormatString (fmt, args);

va_end (args);

}


Falls ich nun die Funktion so aufrufe:
debugInfo ("kernel", "ein string\n");
erhalte ich eine solche ausgabe:
"(<einige sonderzeichen>) ein string\n"
eigentlich sollte ich aber
"(kernel) ein string\n"
erhalten.
Die Sonderzeichen entstehen warscheinlich daraus, das irgentein Pointer auf eine falsche Stelle zeigt.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 02. October 2005, 00:53 »
Hast du mal getestet ob die Variable string auf das gewünschte zeigt?
*post*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 02. October 2005, 10:37 »
Nein, die Variable string zeigt auf eine falsche Stelle, ich weiß aber nicht, woran das liegt :(.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #3 am: 02. October 2005, 12:12 »
Deine var_args implementierung funktioniert aber?
*post*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 02. October 2005, 14:46 »
Ja, der folgende Code funktioniert komischerweise auch:
void testPrint2 (char *fmt, va_list args)
{
debugOut (va_arg (args, char *));
}

void testPrint (char *fmt, ...)
{
va_list args;
va_start (args, fmt);

testPrint2 (fmt, args);

va_end (args);
}

Wenn ich ihn so aufrufe:
testPrint ("abc", "xyz");
gibt er richtig
"xyz" aus.

Wenn ich jedoch folgendes mache:
void kernelPrint (char *fmt, ...)
{
va_list args;
va_start (args, fmt);

debugOut (va_arg (args, char *));

va_end (args);
}

void debugInfo (char *system, char *fmt)
{
kernelPrint ("%s", system);
}

Kommt bei debugInfo ("kernel", "test"); wieder nur Müll heraus :(

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 02. October 2005, 22:25 »
Hm, das liegt wohl an der Optimierung vom GCC.
Wenn ich -O1 statt -O3 verwende, habe ich das Problem nicht.
Dann werd ich wohl mal im Manual nachsehen müssen, welche Optimierung dafür verantwortlich ist.

 

Einloggen