Почему strcpy небезопасно в C?

Я новичок, и сейчас я изучаю, как копировать строку в C.

Вот проблема, которую я только что встретил:

Каждый раз, когда я пытаюсь использовать команду «strcpy» для копирования из строки 1 в строку 2, Visual Studio 2013 предоставит мне сообщение об ошибке / предупреждении о том, что «strcpy» является небезопасным и предлагает мне вместо этого использовать strcpy_s.

Не могли бы вы объяснить, почему strcpy небезопасно использовать? И каковы более безопасные альтернативы strcpy?

Вот мой код:

#include #include main() { char str1[] = "Copy a string."; char str2[15]; char str3[15]; int i; /* with strcpy() */ strcpy(str2, str1); /* Without strcpy() */ for (i = 0; str1[i]; i++) str3[i] = str1[i]; str3[i] = '\0'; /* Display str2 and str3 */ printf("The content of str2: %s\n", str2); printf("The content of str3: %s\n", str3); return 0; } 

PS Я использую 64-разрядную версию Visual Studio 2013 для 64-разрядной версии Windows 7. Спасибо за ваше время!

strcpy не имеет возможности узнать, насколько большой буфер назначения (т. е. нет параметра длины), поэтому неаккуратное программирование с его использованием может привести к перегрузке буфера и повреждению другой памяти. Такое переполнение может привести к сбоям, нечетному поведению и может быть использовано для авторов вредоносных программ.

BTW, посмотрите на strncpy, который принимает параметр длины. Одна из проблем, о которых нужно знать, заключается в том, что strncpy не будет прервать строку, если буфер слишком мал, поэтому он опасен по-своему.

В ответ на ваш комментарий / вопрос – это будет зависеть от контекста. Если вы знаете, что буфер достаточно велик (например, вы выделили его в предыдущей строке с правильным размером), используйте команду strcpy. Если есть возможность переполнения, используйте strncpy и убедитесь, что последняя позиция в буфере установлена ​​в нуль. Обратите внимание, что «любая возможность» следует интерпретировать очень щедро – если только предыдущие пять или шесть строк недостаточно для обеспечения безопасности, используйте strncpy.

Также см. Комментарий Андона выше о strncpy_s. Наконец, если вы используете strcpy, вы можете добавить #pragma для подавления предупреждения в этом месте.

Вот ваш исходный код:

 int main() { char str1[] = "Copy a string."; char str2[15]; strcpy(str2, str1); } 

Теперь, через три дня, вы переходите к редактированию этого кода. Вы поняли, что вам действительно нужно написать сообщение "This code is copying a string." вместо.

 int main() { char str1[] = "This code is copying a string."; char str2[15]; strcpy(str2, str1); } 

Однако вы случайно внесли переполнение буфера.

strcpy_s требует дополнительного аргумента длины str2 . Таким образом, хотя вы не можете получить всю строку в своем новом буфере, вы не будете вызывать неопределенное поведение.

В отличие от strncpy и strcpy_s, strcpy не проверяет длину целевого буфера, который может вызвать переполнение стека, позволяющее злоумышленнику выполнять вредоносный код, если он был использован или просто искал ваше приложение