Проанализируйте следующий фрагмент C: char *s = malloc(10); strcpy(s, "This is a long string"); Что здесь происходит и как предотвратить уязвимость?

17 Ноя в 06:52
2 +1
0
Ответы
1
Что происходит
- В строке `char *s = malloc(101010);` выделяется буфер только на 10 \,10\,10 байт.
- `strcpy(s, "This is a long string");` копирует в буфер строку длиной 21 \,21\,21 символ (без учёта завершающего `\0`) плюс завершающий нуль — всего 22 \,22\,22 байта. Это переписывает память за пределами выделенного буфера → heap overflow, неопределённое поведение, возможность повреждения данных или эксплуатации.
Почему опасно
- Переполнение кучи может привести к краху программы, утечке данных или выполнению произвольного кода (безопасностная уязвимость).
Как предотвратить (рекомендации)
1. Всегда выделять достаточно памяти: размер = `strlen(src) + 1`.
Пример:
char *src = "This is a long string";
size_t len = strlen(src);
char *s = malloc(len+1len + 1len+1);
if (s) memcpy(s, src, len+1len + 1len+1); // копируем включая '\0'
2. Использовать удобные/безопасные функции:
- `strdup` (если доступна): `char *s = strdup(src);`
- `asprintf`/`vasprintf` для форматирования.
3. Если приходится использовать ограничение размера, применять функции, гарантирующие терминатор, например `snprintf` или `strlcpy` (где есть), и всегда контролировать длины:
char buf[NNN];
snprintf(buf, NNN, "%s", src); // гарантирует не выйти за пределы буфера
4. Проверять результат `malloc` на `NULL`.
5. Избегать слепого использования `strcpy` для данных неизвестной длины; `strncpy` часто вводит в заблуждение (не гарантирует терминатор), поэтому используйте её осторожно.
Краткий исправленный вариант для исходного фрагмента:
char *src = "This is a long string";
size_t len = strlen(src);
char *s = malloc(len+1len + 1len+1);
if (s) memcpy(s, src, len+1len + 1len+1); else /* обработать ошибку выделения */.
Это устранит переполнение и сделает поведение определённым.
17 Ноя в 06:58
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир