Следующий код вызывает ошибку и убивает мое приложение. Это имеет смысл, поскольку буфер составляет всего 10 байтов, а текст - 22 байта (переполнение буфера).sprintf_s с слишком маленьким буфером
char buffer[10];
int length = sprintf_s(buffer, 10, "1234567890.1234567890.");
Как я могу уловить эту ошибку, чтобы я мог сообщить об этом, вместо того, чтобы разбивать мое приложение?
Edit:
После прочтения комментариев ниже я пошел с _snprintf_s. Если он возвращает значение -1, буфер не обновлялся.
length = _snprintf_s(buffer, 10, 9, "123456789");
printf("1) Length=%d\n", length); // Length == 9
length = _snprintf_s(buffer, 10, 9, "1234567890.1234567890.");
printf("2) Length=%d\n", length); // Length == -1
length = _snprintf_s(buffer, 10, 10, "1234567890.1234567890.");
printf("3) Length=%d\n", length); // Crash, it needs room for the NULL char
Передача размера буфера и размера буфера минус одна, является тупой и подверженной ошибкам. Вы должны предпочесть вариант, который я описываю ниже: length = _snprintf_s (buffer, _TRUNCATE, "1234567890.1234567890."); Поскольку параметр первого размера не указан, компилятор использует перегрузку шаблона, которая задает размер. _TRUNCATE - это особое значение, которое делает то, что он говорит. Никаких магических чисел, и теперь ваш код безопасен, поддерживается и является хорошим примером. Если вам понравился этот комментарий и _snprintf_s, тогда вы должны выбрать мой ответ, а не опасный ответ snprintf/_snprintf. –