@Roo
, который я несколько согласовываю на то, что Вы говорите, но не являетесь им стоящий шифрования данные только для создания немного более трудным для кого-то получить его?
С Вашим обоснованием, было бы бесполезно иметь блокировки или предупреждения в Вашем доме, потому что они могут также легко быть скомпрометированы.
Мой ответ:
я сказал бы, что, если у Вас есть уязвимые данные, что Вы не хотите падать в неправильных руках, необходимо, вероятно, сделать это настолько трудно, как Вы можете для хакера для получения его, даже если это не на 100% надежно.
Вместо sprintf_s
вы можете использовать snprintf
(также известный как _snprintf
в Windows).
#ifdef WIN32
#define snprintf _snprintf
#endif
char buffer[10];
int length = snprintf( buffer, 10, "1234567890.1234567890." );
// unix snprintf returns length output would actually require;
// windows _snprintf returns actual output length if output fits, else negative
if (length >= sizeof(buffer) || length<0)
{
/* error handling */
}
Это задумано. Вся суть sprintf_s
и других функций из семейства * _ s
состоит в том, чтобы отлавливать ошибки переполнения буфера и обрабатывать их как нарушения предварительного условия . Это означает, что на самом деле они не подлежат восстановлению. Это предназначено только для обнаружения ошибок - вам никогда не следует вызывать sprintf_s
, если вы знаете, что строка может быть слишком большой для целевого буфера. В этом случае сначала используйте strlen
, чтобы проверить и решить, нужно ли вам обрезать.
Из MSDN:
Другое главное различие между sprintf_s и sprintf состоит в том, что sprintf_s принимает параметр длины, определяющий размер выходного буфера в символах. Если буфер слишком мал для печатаемого текста, тогда в буфере устанавливается пустая строка и вызывается обработчик недопустимого параметра. В отличие от snprintf, sprintf_s гарантирует, что буфер будет завершен нулем (если размер буфера не равен нулю).
Так что в идеале то, что вы написали, должно работать правильно.
Похоже, вы что-то пишете на MSVC?
Я думаю, что в документации MSDN для sprintf_s написано, что assert dies, поэтому я не уверен, что вы можете программно поймать это.
Как предположил Л.Бушкин, гораздо лучше использовать классы, управляющие строками.
См. Раздел 6.6.1 документа TR24731 , который является версией Комитета ISO C функциональности, реализованной Microsoft. Он предоставляет функции set_constraint_handler ()
, abort_constraint_handler ()
и ignore_constraint_handler ()
.
Есть комментарии Павла Минаева, предполагающие, что реализация Microsoft не поддерживает придерживаться предложения TR24731 (которое является «Техническим отчетом типа 2»), поэтому вы не сможете вмешаться или вам, возможно, придется сделать что-то отличное от того, что указано в TR. Для этого внимательно изучите MSDN.