Расчет размера буфера sprintf ()

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

9
задан Linus Kleen 20 February 2012 в 22:10
поделиться