Laut der Microsoft-Dokumentation für vsnprintf
gehört diese Funktion zum C ( ++) Run-Time Library seit mindestens der Ausgabe 2003 von Visual Studio.
Ich frage: für welche Versionen von Visual Studio ist die vsnprintf
Implementierung der gebündelten C (++) RTL für x86 und x64 in Übereinstimmung mit dem C99 Standard (ISO / IEC 9899: 1999), unter der Annahme
#define _CRT_SECURE_NO_WARNINGS
wird vor #include <stdio.h>
ausgeführt, was für moderne Versionen von Visual Studio RTL erforderlich ist; count
größer als Null ist, dann ist buffer
ein Zeiger auf (mindestens) count
beschreibbare Zeichen; NULL
und entspricht der Formatspezifikationssyntax von Microsoft bestimmte Version des RTL; count
und die Anzahl der zu erzeugenden Zeichen sind beide klein genug, um zum Typ int
; und wir möchten, dass die Konformität (neben der Grundfunktionalität für die nominale Eingabe) diese Anforderungen enthält (impliziert durch die Standardspezifikation von snprintf
, welche vsnprintf
Referenzen):
buffer==NULL
und count==0
, wodurch es dem Pre-Flight ermöglicht wird, die Länge der Ausgabe zu bestimmen; buffer!=NULL
und count>0
und das zurückgegebene Ergebnis nicht negativ ist, einschließlich für abgeschnittene Ausgabe aufgrund kleiner count
. Beachten Sie folgende Kommentare : Ich bin bereit, das Fehlen von restrict
-Qualifikatoren als noch zulässig zuzulassen für meist normkonform.
Die Dokumentation lässt die Übereinstimmung in Bezug auf (3.) mehrdeutig; Die mit der Visual Studio Community 2015 gebündelte Implementierung ist soweit in Ordnung, aber nicht alle.
Wenn am Ende Platz ist (dh wenn die Anzahl der zu schreibenden Zeichen kleiner als
count
ist), wird der Puffer auf Null gesetzt.
In der Dokumentation wird auch eindeutig angegeben, dass vsnprintf
nicht mit dem C99-Standard in Bezug auf (1.) und (2.) übereinstimmt, wenn buffer==NULL
und count==0
; aber diese Teile der Dokumentation entpuppen sich scheinbar als falsch:
Wenn die Anzahl der zu schreibenden Zeichen größer als
count
ist, geben diese Funktionen -1 zurück und geben an, dass die Ausgabe abgeschnitten wurde.Wenn
aufbuffer
oderformat
NULL
ist oder wenncount
kleiner oder gleich Null ist, rufen diese Funktionen den ungültigen Parameterhandler
Testcode:
%Vor%unter meiner Installation von Visual Studio Community 2015 geben
%Vor%und unter einer Installation von Visual Studio 2008 (ich glaube, SP1 + PSDK 7.1)
%Vor% Beachten Sie das Fehlen von abschließenden Nullzeichen insbesondere für count==3
, obwohl die Ausgabe positiv ist.
Tags und Links c c++ visual-studio standards printf