vsnprintf und NULL input-string argument

Was ist das erwartete Verhalten von vsnprintf wenn es eine Eingabe NULL-Zeichenfolge und/oder Größe=0, z.B.

vsnprintf(NULL, 0, "%d", p);

oder

vsnprintf(NULL, 10, "%d", p);

Ist es zu undefiniertem Verhalten oder gültiges Szenario? Es stürzt nicht ab mit der Eingabe-Zeichenfolge als NULL und seiner Länge 0, und gibt -1 zurück (das gleiche für gilt nicht-NULL-Zeichenfolge und null-Länge), aber es Abstürzen tut die andere Weise herum (NULL input-string und positive Länge).

  • Siehe [MSDN]( msdn.microsoft.com/en-us/library/1kt27hek(v=vs. 110).aspx ) und als erstes argument sollte nicht NULL sein, ist dies ein Undefiniertes Verhalten.
  • sind Sie sicher?
  • OP war klar Fragen, was passiert, wenn NULL übergeben wird, um die vsnprintf Funktion, das Ergebnis nach dem Aufruf undefiniert. Sie scheinen zu denken, ich wurde sagen etwas anderes?
  • jede Bezugnahme? Für C11 sehen Sie bitte meine Antwort. (Ich denke, die Präsenz von 0 und 10 ist ebenfalls von Bedeutung)
  • Ist microsoft-basiert ist, andere C11… kann nicht gewinnen, eh..
  • Mehrere Dinge. 1) Dies gilt für C99, nicht nur C11. 2) Der C-standard erlaubt es, eine Implementierung zur Ausgabe von Diagnose-aus irgendeinem Grund. 3) MSDN ist nicht C-standard. 4) Es gibt nichts auf dieser Seite, die nahelegt, dass Undefiniertes Verhalten. Speziell zu sagen „NULL startet das invalid parameter handler“ klingt wie definiert Verhalten für mich.
  • tatsächlich OP, welche compiler verwenden Sie?

InformationsquelleAutor Mark | 2016-05-11



2 Replies
  1. 4

    vsnprintf(NULL, 0, "%d", p); ist eigentlich definiert Verhalten.

    7.19.6.5/2 Die snprintf Funktion ist äquivalent zu fprintf, außer dass die Ausgabe in ein Feld geschrieben (angegeben durch argument s)
    anstatt einem stream. Wenn n null ist, wird nichts geschrieben,und s können
    ein null-Zeiger. …

    7.19.6.12/2 Die vsnprintf Funktion ist äquivalent zu snprintf

    vsnprintf(NULL, 10, "%d", p); ist nicht. Da n ist nicht null, Sie haben verletzt, eine Einschränkung und du hast nicht definiertes Verhalten. So oder so, werden Sie wahrscheinlich schreiben Ehrerbietung ein NULL-Zeiger ist wieder Undefiniertes Verhalten. Wenn man Glück hat, Ihr Programm abstürzt. Wenn Sie nicht, es wird weiter laufen und tun seltsame Dinge, um Ihr Programm.

  2. 2

    Zitieren C11, Kapitel §7.21.6.12, Die vsnprintf Funktion

    Den vsnprintf Funktion ist äquivalent zu snprintf mit der variable argument list
    ersetzt durch arg, die initialisiert wurden durch die va_start makro (und möglicherweise nachfolgenden va_arg Anrufe). [….]

    und dann, für snprintf(), §7.21.6.5

    […] Wenn n null ist, wird nichts geschrieben, und s kann ein null-Zeiger.

    So, bei deinem ersten Fall definiert ist, während es im zweiten Fall ruft Undefiniertes Verhalten, indem Sie versuchen, Zugriff auf einen ungültigen (NULL) Zeiger.

    • Concerning the return value of snprintf(), SUSv2 and C99 contradict each other: when snprintf() is called with size=0 then SUSv2 stipulates an unspecified return value less than 1, while C99 allows str to be NULL in this case, and gives the return value (as always) as the number of characters that would have been written in case the output string has been large enough.
    • Dennoch, ich werde stick mit der C11, genau wie im Fall von fflush(stdin) im C11 vs MSVC (Sie wissen schon). 🙂
    • Ja, es sei denn, der Durchführung bricht die Norm.
    • Mann Seiten, die C-Bibliotheken, und die Spezifikationen entsprechen Sie unterscheiden sich in den Systemen. Der C-standard ist die einzige maßgebliche Spezifikation. Alles andere ist offen. In der Tat, ich bezweifle stark würden wir bekommen den gleichen text für man 2 vsnprintf. Als ein Beispiel, mir sagt The snprintf() and vsnprintf() functions conform to C99.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.