2012-02-20 2 views
9

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(). Новый вариант которого не нарушен, поэтому я хотел бы все еще видеть их.

+0

'vsprintf_s' является не только m $ only (и, следовательно, неспортивным), многие говорят, что его единственной целью является ужесточение блокировки вашего поставщика, так что вы подумали об отключении предложения, чтобы заменить все стандартные вызовы по вариантам _s? – PlasmaHH

+1

@PlasmaHH: C11 содержит функции '_s' в качестве рекомендаций в дополнительном приложении K. –

+0

Да. У меня есть. Но, как я уже сказал, это похоже на мошенничество. В конце концов, помимо программного обеспечения для блокировки поставщиков, кто-то должен был подумать о превосходной функции vsnprintf() 'перед тем, как сделать ее недоступной? –

ответ

12

Функция, которую вы хотите посмотреть, это _vscprintf, которая "возвращает количество символов, которые будут сгенерированы, если строка, на которую указывает список аргументов, была отпечатана или отправлена ​​в файл или буфер с использованием указанных кодов форматирования ". Существует широкоформатный вариант (_vscwprintf).

Смежные вопросы