3 Ноя в 19:18
2 +1
0
Ответы
1
Если буфер sss меньше требуемого размера — будет переполнение буфера и неопределённое поведение. Строковый литерал "This string is longer than ten" содержит 303030 символов, значит strcpystrcpystrcpy попытается скопировать strlen(src)+1=31strlen(src)+1 = 31strlen(src)+1=31 байт (включая нуль-терминатор).
Если, например, sss объявлен как char s[10]char\ s[10]char s[10], то копирование приведёт к переполнению и возможному краху или уязвимости.
Безопасные альтернативы:
- Обрезать с гарантией терминатора: let n=sizeofsn = sizeof sn=sizeofs - strncpy(s,src,n−1); s[n−1]=′0′;strncpy(s, src, n-1);\ s[n-1] = '\\0';strncpy(s,src,n1); s[n1]=0; - Использовать snprintfsnprintfsnprintf: snprintf(s,sizeofs,"snprintf(s, sizeof s, "%s", src);snprintf(s,sizeofs," — гарантирует нуль-терминатор и обрезку.
- Если доступна, strlcpy(s,src,sizeofs);strlcpy(s, src, sizeof s);strlcpy(s,src,sizeofs); — удобна и безопасна.
- Выделять память по длине: s=malloc(strlen(src)+1);s = malloc(strlen(src)+1);s=malloc(strlen(src)+1); затем strcpy(s,src);strcpy(s, src);strcpy(s,src); (не забыть free).
Вывод: перед вызовом strcpystrcpystrcpy убедитесь, что размер s≥strlen(src)+1s \ge strlen(src)+1sstrlen(src)+1 (в вашем случае минимум 313131 байт), иначе используйте одну из безопасных альтернатив.
3 Ноя в 20:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир