22 Окт в 14:40
6 +1
0
Ответы
1
Эта строка копирует в буфер sss все байты литерала, включая завершающий нулевой символ, поэтому если sss меньше необходимого размера — будет переполнение буфера и неопределённое поведение.
Конкретно: длина литерала "This string is too long for s" равна 292929 символам, плюс терминальный `'\0'` = всего 303030 байт. Если массив sss меньше чем 303030 байт, strcpy приведёт к выходу за пределы.
Что делать (безопасные варианты):
- Выделить буфер нужного размера:
- `char s[30]; strcpy(s, "...");`
- или динамически: `size_t n = strlen(src) + 1; char *s = malloc(n); if (s) strcpy(s, src);`
- Использовать функции, ограничивающие копирование:
- `snprintf(s, sizeof s, "%s", src);`
- `strlcpy(s, sizeof s, src);` (если доступна)
- или `strncpy(s, src, sizeof s - 1); s[sizeof s - 1] = '\0';` (учтите особенности `strncpy`).
- Инструменты для отладки переполнений: AddressSanitizer, valgrind.
Итого: не используйте `strcpy` без гарантии, что буфер вмещает strlen(src)+1strlen(src) + 1strlen(src)+1 байт; иначе — UB и риск безопасности.
22 Окт в 15:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир