sprintf_s вызвано сбоем - PullRequest
       25

sprintf_s вызвано сбоем

0 голосов
/ 07 августа 2011

Я встречаюсь с проблемой. Пример:

try
{
    char strMes[6];
    sprintf_s(strMes, sizeof(strMes), "%s", "012345678");
    printf(strMes);
}
catch(...)
{
    printf("Wrong\n");
}

В среде отладки это вызвало сообщение отладчика "слишком маленький буфер".

В среде выпуска это вызвало сбой.

Я попытался заменить блок try-catch на блок __try -__, за исключением (EXCEPTION_EXECUTE_HANDLER), но у меня такое же поведение.

У меня около 1K вызовов для функции sprintf_s, поэтому заменить sprintf_s на _snprintf_s не вариант для меня. (см. sprintf_s с слишком маленьким буфером )

Пожалуйста, помогите!

Ответы [ 4 ]

5 голосов
/ 07 августа 2011

Прежде всего, я считаю, что вы должны использовать snprintf вместо sprintf_s.

Во-вторых, существует недопустимый обработчик параметров для ЭЛТ, которыйвызывается.Попробуйте установить это.

1 голос
/ 07 августа 2011

Прочитайте документацию :

.... Если любая из проверок завершается неудачно, вызывается неверный обработчик параметров, как описано в разделе Проверка параметров ...

Поведение по умолчанию - бросание. Вы можете переопределить это.

1 голос
/ 07 августа 2011

Вы должны проверить возвращаемое значение sprintf_s перед дальнейшим использованием strMes. Иначе как узнать, был ли буфер достаточно большим? sprinft_s может ничего не записывать в strMes, и поэтому он все еще не инициализирован. Это то, что вызывает сбой (попробуйте удалить sprintf_s, скорее всего, он тоже вылетает.)

Из sprintf_s документов:

Количество написанных символов или –1, если произошла ошибка. Если буфер или формат имеет нулевой указатель, sprintf_s и swprintf_s возвращают -1 и установите errno на EINVAL.

PS: Вы должны пометить этот вопрос C ++, а не C из-за try / catch.

0 голосов
/ 07 августа 2011

Если ваша версия VS поддерживает, вы должны запустить Code Analysis для нее.

Читать о Об анализе кода

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