Вычисление размера буфера sprintf () - PullRequest
9 голосов
/ 21 февраля 2012

A (очень давно), в то время как я регулярно использовал следующий код - затем на MSVC 6 - для определения памяти, необходимой для форматирования строки для функции с переменными аргументами:

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(), однако обречена на возврат -1 при вводевозникают условия его «небезопасного» предшественника.

TL / DR: Есть ли способ реализовать ожидаемое поведение vsnprintf() для возврата памяти, необходимой для выполнения его задачи, с использованием нового, более безопасные варианты этого?


РЕДАКТИРОВАТЬ: просто определение _CRT_SECURE_NO_WARNINGS не будет сокращать его;там тоже много strcpy() летающих.Новый вариант, который не сломан, так что я бы хотел увидеть их.

1 Ответ

12 голосов
/ 21 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...