A (очень долго), а назад я регулярно использовал следующий код - затем на MSVC 6 - для определения памяти, необходимой для форматирования строки для функции с переменным числом аргументов:Расчет размеров с Sprintf() буфер
void LogPrint(const char *pszFormat, ...)
{
int nBytes;
char *pszBuffer;
va_list args;
va_start(args, pszFormat);
nBytes = vsnprintf(0, 0, pszFormat, va);
va_end(args);
// error checking omitted for brevity
pszBuffer = new char[nBytes + 1];
va_start(args, pszFormat);
vsnprintf(pszBuffer, nBytes, pszFormat, va);
va_end();
// ...
}
Очевидная ошибка вы получаете в более поздней версии MSVC (я использую 2010 в настоящее время) является:
предупреждение C4996: «vsnprintf»: Эта функция или переменная может быть небезопасным. Вместо этого рассмотрите использование vsnprintf_s. Для отключения устаревания используйте _CRT_SECURE_NO_WARNINGS. Смотрите справку для деталей.
Я большой поклонник опции «обрабатывать предупреждения как ошибки» для любого C (++) - компилятора, и, очевидно, моя сборка не выполняется. Мне кажется, что я обманываю, чтобы просто использовать #pragma warning (disable:4996)
и продолжать с этим.
Предлагаемая «безопасная» альтернатива vsnprintf_s()
, однако is doomed to return -1
при возникновении условий ввода ее «небезопасного» предшественника.
TL/DR: Есть ли способ, чтобы реализовать ожидаемое поведение vsnprintf()
вернуть память, необходимую для выполнения своей задачи, используя новые, более безопасные варианты этого?
EDIT: просто определение _CRT_SECURE_NO_WARNINGS
не будет резать; там тоже много strcpy()
. Новый вариант которого не нарушен, поэтому я хотел бы все еще видеть их.
'vsprintf_s' является не только m $ only (и, следовательно, неспортивным), многие говорят, что его единственной целью является ужесточение блокировки вашего поставщика, так что вы подумали об отключении предложения, чтобы заменить все стандартные вызовы по вариантам _s? – PlasmaHH
@PlasmaHH: C11 содержит функции '_s' в качестве рекомендаций в дополнительном приложении K. –
Да. У меня есть. Но, как я уже сказал, это похоже на мошенничество. В конце концов, помимо программного обеспечения для блокировки поставщиков, кто-то должен был подумать о превосходной функции vsnprintf() 'перед тем, как сделать ее недоступной? –