MSVC'ye yapılan en son güvenlik güncelleştirmelerine uymak için bazı "eski" kodları güncelleştirmeye çalışıyorum ve _vsnprintf
ile _vsnprintf_s
arasında geçiş yapmakta sorun yaşıyorum. Özellikle Gerekli arabellek uzunluğunu güvenli bir şekilde alma _vsnprintf_s
return value + 1
) tahsis sonucu elde sayım/uzunluk için boş bir tampon maddesi ile
_vsnprintf
ve sıfır çağrı ve daha sonra, yeni olarak ayrılmış tamponu ile tekrar
_vsnprintf
çağrı ve bilinen doğru boyutta:
size_t length = _vsntprintf(nullptr, 0, mask, params);
TCHAR *final = new TCHAR [length + 1];
_vsntprintf(final, length + 1, mask, params);
Bu davranış documented on MSDN olup:
sayı ile belirtilen tampon boyutu formatı ve argptr tarafından belirtilen çıkış taşıyacak kadar büyük değilse vsnprintf'nin dönüş değeri, sayımın yeterince büyük olması durumunda yazılacak karakter sayısıdır. Dönüş değeri sayım-1'den büyükse, çıktı kesildi.
_vsnprintf_s
, ancak its documentation does not contain the same ile aynı şeyi yapmaya çalışıyorum. Depolama verileri depolamak için gerekli ve bir sonlandırıcı boş sizeOfBuffer aşarsa yerine Parametre Doğrulama anlatıldığı gibi sayımı _TRUNCATE olmadıkça, geçersiz parametre işleyicisi,, çağrıldığında
diyor dize kadar bu durumda arabellek sığacak şekilde yazılır ve -1 döndürülür.
aşağıdaki zaten dışarı çalışılıyor:
size_t length = _vsntprintf_s(nullptr, 0, 0, mask, params);
Bu sıfır "uzunluğunda" ile sonuçlanır. Eğer _TRUNCATE
yılında geçerseniz (-1) sayımı yerine, aşağıdaki onaylama işlemi başarısız olarak:
İfade:! tampon = nullptr & & buffer_count> 0
Ben _set_invalid_parameter_handler
geçersiz kılmak mümkündür tahmin ve bir şekilde uzunluğun ne olması gerektiğini buluyoruz, ama daha kolay bir yolu olmalı?
Bu, hiçbir C kodudur. – Olaf
@Olaf Üzgünüz, bu C++ olmalıydı. Bu yazım hatası kaçırdığım 'security-enhanced-crt' etiketi hakkında endişeleniyordum. Gerçekten de bunun aşağılayıcı olduğunu düşünmüyor musun? –
'size_t length = _vsntprintf (nullptr, 0, 0, mask, params) satırında, '_vsntprintf_s' demek istediniz? – TriskalJM