Ich versuche, einige "Legacy" -Code zu aktualisieren, um die neuesten Sicherheitsupdates für MSVC zu erfüllen, und stehe vor einigen Problemen bei der Migration von _vsnprintf
zu _vsnprintf_s
.Abrufen erforderlicher Pufferlänge mit Secure _vsnprintf_s
Insbesondere war ich _vsnprintf
mit einem Null-Puffer und Null für die Zählung/Länge Aufruf, das Ergebnis zu erzielen, einen Puffer der benötigten Größe (return value + 1
) Zuordnen und dann _vsnprintf
wieder mit dem neu zugewiesenen Puffer aufrufen und bekannt richtige Größe:
size_t length = _vsntprintf(nullptr, 0, mask, params);
TCHAR *final = new TCHAR [length + 1];
_vsntprintf(final, length + 1, mask, params);
Dieses Verhalten ist documented on MSDN:
Wenn die Puffergröße durch Zählung angegeben ist nicht ausreichend groß, um die Ausgabe von Format und argptr angegeben zu enthalten, die Rückgabewert von vsnprintf ist die Anzahl der Zeichen, die geschrieben würden, wenn die Anzahl ausreichend groß wäre. Wenn der Rückgabewert größer als count - 1 ist, wurde die Ausgabe abgeschnitten.
Ich versuche, das gleiche mit _vsnprintf_s
, aber its documentation does not contain the same zu tun. Er sagt stattdessen
Wenn die Speicherung der Daten zu speichern, erforderlich und eine abschließende Null überschreitet sizeOfBuffer, der ungültige Parameter-Handler aufgerufen wird, wie in Parameter Validation beschrieben, es sei denn Zählung _TRUNCATE, wobei in diesem Fall so viel von der Zeichenfolge Wie passt in Puffer wird geschrieben und -1 zurückgegeben.
Der Versuch, es sowieso mit dem folgenden:
size_t length = _vsntprintf_s(nullptr, 0, 0, mask, params);
Dies führt zu einer "Länge" von Null. Wenn Sie in _TRUNCATE
(-1) als die Zählung statt passieren, wird die folgende Behauptung fehlschlägt:
Expression: Puffer = nullptr & & buffer_count> 0
Ich nehme es möglich ist, _set_invalid_parameter_handler
außer Kraft zu setzen und irgendwie herausfinden, wie lang sein sollte, aber es muss einen einfacheren Weg geben?
Dies ist kein C-Code. – Olaf
@Olaf Sorry, das hätte C++ sein sollen. Ich ärgerte mich über das "Sicherheit-verbessert-CRT" -Tag, dass ich diesen Tippfehler verpasste. Glaubst du wirklich, das war es wert, downvotiert zu werden? –
In der Zeile 'size_t length = _vsntprintf (nullptr, 0, 0, mask, params);', meinst du '_vsntprintf_s'? – TriskalJM