PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sprintf und Argument=NULL



rarup
29-01-2004, 14:45
Hallo !
Ich muß eine recht komplexe Software nach Linux portieren.
Dabei bin ich über ein dummes Problem mit sprintf gestolpert:
Der Code ist sowas wie :

void test(char *b)
{
char *a;
a = malloc(strlen(b) + 1); // nachträglich einen Tippfehler korrrigiert
sprintf(a, "%s", b);
}

Jetzt lassen wir b mal NULL sein.

Auf AIX, Linux und NT liefert strlen(b) == 0
Auf AIX und NT wird in a auch wirklich nur `\x0`reingeschrieben. Auf Linux dagegen wird da "(null)" (im Klartext) reingeschrieben.

Jetzt stehe ich ratlos vor meinem Suse 8.2 und frag mich was das soll und wie ich das Problem lösen kann ohne eine Wrapperfunktion für das Linux-sprintf zu schreiben. (wie gesagt: der Codzeilen gibt es viele - auch mit sprintf !)
(Ach ja .. der Code ist auch nicht wirklich so wie oben, sondern mit variablen Argumentenlisten, etc. ...)

Wenn man sich das Codebeispiel (welches auf HPUX, Sinix, Aix und NT läuft) oben ansieht ist auch unmittelbar klar, dass es eine schlechte Idee ist sprintf in a was reinschreiben zu lassen, weils nämlich abstürzt .. aber was solls.


Danke, Rainer

wraith
29-01-2004, 15:25
Original geschrieben von rarup

Jetzt lassen wir b mal NULL sein.

Auf AIX, Linux und NT liefert strlen(b) == 0

Undefiniertes Verhalten,strlen mit Nullpointer aufrufen.
Im Normalfall wirst du einen Seg-Fault bekommen,also da mußt du auf jedenfall vorher abtesten.
Btw,das hier is hoffentlich nur ein Tippfehler


a = malloc(strlen(b)) + 1; //<-- ) falsch gesetzt



Auf AIX und NT wird in a auch wirklich nur `\x0`reingeschrieben. Auf Linux dagegen wird da "(null)" (im Klartext) reingeschrieben.

Auch hier undefiniertes Verhalten.Viele Library Schreiber haben es sich wohl aber angewöhnt,für eine Nullpointer bei *printf ein (null) auszugeben.
Ansonsten würde man selber immer so was schreiben müssen


printf("%s\n",s ? s : "(null)");

rarup
30-01-2004, 08:25
@wraith
Erwischt! Ja, das war ein Tippfehler (mit dem malloc).

Das Problem ist: ich schreibe nicht Code für Linux, ich portiere bestehenden Code. Und der sieht nunmal so (ähnlich) aus und läuft seit 10 Jahren im Dauereinsatz (recht stabil). (obwohl ich deiner Kritik mit strlen 100% recht gebe)
Der Code muß auch weiterhin unter NT und AIX Compilierbar und ausführbar sein, so daß ich mir jede Änderung sehr sehr genau überlegen muß!

Aber wahrscheinlich muß ich wohl eine Wrapper-Funktion für Linux schreiben?!

peschmae
30-01-2004, 11:19
Kommt drauf an, was dir weniger Aufwand macht.

Ne Wrapper-Funktion für eine Funktion wie printf - mit variabler Variablenzahl - zu schreiben stelle ich mir allerdings nicht sehr einfach vor.

MfG Peschmä

rarup
30-01-2004, 14:22
Schwierig ist relativ. Ich mag die va_arg Listen in c nicht weil's unkonfortabel, unübersichtlich und daher Fehleranfällig ist - letztendlich ist das aber auch nicht schwieriger als jede beliebige andere Funktion die zu schreiben ist.

anda_skoa
30-01-2004, 16:06
Original geschrieben von rarup

Der Code muß auch weiterhin unter NT und AIX Compilierbar und ausführbar sein, so daß ich mir jede Änderung sehr sehr genau überlegen muß!


Sicherer Code, also ein Check auf != 0 vor dem Zugriff auf strlen sollte überall gehen :)

Ciao,
_

peschmae
30-01-2004, 16:07
Schwierig == mühsam - zumindest hier.

MfG Peschmä