Ab welcher Version von Visual Studio ist vsnprintf meist standardkonform?

9

Laut der Microsoft-Dokumentation für vsnprintf gehört diese Funktion zum C ( ++) Run-Time Library seit mindestens der Ausgabe 2003 von Visual Studio.

%Vor%

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;
  • Wenn count größer als Null ist, dann ist buffer ein Zeiger auf (mindestens) count beschreibbare Zeichen;
  • Das Format
  • ist nicht NULL und entspricht der Formatspezifikationssyntax von Microsoft bestimmte Version des RTL;
  • Der Wert von count und die Anzahl der zu erzeugenden Zeichen sind beide klein genug, um zum Typ int ;
  • zu passen

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):

  1. erzeugt unter den obigen Annahmen kein undefiniertes Verhalten (einschließlich des Aufrufs von ungültigem Parameterhandler von Microsoft );
  2. gibt die Länge zurück, die geschrieben werden soll (ohne abschließendes Nullzeichen), wenn buffer==NULL und count==0 , wodurch es dem Pre-Flight ermöglicht wird, die Länge der Ausgabe zu bestimmen;
  3. füllt die Ausgabezeichenfolge immer mit einem abschließenden Nullzeichen auf, wenn 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 buffer oder format NULL ist oder wenn count kleiner oder gleich Null ist, rufen diese Funktionen den ungültigen Parameterhandler

auf

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.

    
fgrieu 25.01.2016, 15:35
quelle

0 Antworten