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

17 Ноя в 09:51
3 +1
0
Ответы
1
Что происходит
- Выделяется буфер `malloc(101010)` — то есть всего 101010 байт.
- Затем `strcpy` копирует строку `"This is a long string"`. Эта строка содержит 212121 символа + терминатор `'\0'` → всего 222222 байта.
- Следствие: при копировании происходит переполнение буфера на \(22 - 10 = \(12\)\) байт → неопределённое поведение, повреждение кучи.
Ошибки и уязвимости
- Буферное переполнение (heap overflow) — приводит к краху программы, повреждению метаданных кучи и потенциальной возможности выполнения произвольного кода.
- Использование `strcpy` без проверки границ — небезопасно для данных неизвестной/большей длины.
- Нет проверки результата `malloc` на `NULL`.
- Нет освобождения памяти (`free`).
Как правильно исправить (кратко, безопасные варианты)
1) Выделить нужный размер и проверить результат:
```
const char *src = "This is a long string";
size_t len = strlen(src); /* len == 212121 */
char *s = malloc(len + 111); /* +1 для '\0' */
if (!s) { /* обработать ошибку */ }
memcpy(s, src, len + 111); /* копируем вместе с '\0' */
/* ... */
free(s);
```
2) Использовать `strdup` (удобно, но тоже проверять `NULL`):
```
char *s = strdup("This is a long string");
if (!s) { /* обработка */ }
/* ... */
free(s);
```
3) Если нужно ограничивать длину — использовать безопасные функции (`strlcpy` где доступна) или `snprintf`:
```
char *s = malloc(100100100); /* пример буфера большего размера */
if (s) {
snprintf(s, 100100100, "%s", src); /* гарантированная NUL-терминация */
}
```
4) Для фиксированных литералов можно сразу объявить массив:
```
char s[] = "This is a long string"; /* компилятор выделит массив размером 222222 */
```
Дополнительные рекомендации
- Не использовать `strcpy` без гарантий размера; избегать `strncpy` без понимания его особенностей (она не гарантирует NUL-терминацию при усечении).
- Всегда проверять возврат `malloc`.
- Освобождать выделенную память (`free`) и по возможности избегать «магических» чисел — вычислять размеры через `strlen`/`sizeof`.
17 Ноя в 09:58
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир