Приведён код на C: "char *s = malloc(10); strcpy(s, \"This is a long string\"); printf(\"%s\", s);" — объясните, какие ошибки и уязвимости здесь присутствуют и как их устранить

2 Мар в 08:35
27 +1
0
Ответы
1
Кратко — что не так и как исправить.
Ошибки/уязвимости
- Буфер-переполнение: выделено `malloc(101010)`, а копируется строка `"This is a long string"` длиной 21\,2121\ (без '\0') → нужно как минимум 22\,2222\ байта. Переполнение вызывает неопределённое поведение, повреждение кучи и потенциальное выполнение кода.
- Отсутствует проверка результата `malloc` → возможный NULL-указатель.
- Используется небезопасная `strcpy` (не контролирует длину источника).
- Утечка памяти (нет `free`).
- (Опционально) отсутствие необходимых заголовков и отсутствие защитных проверок размера при работе с внешними данными.
Как исправить (варианты, коротко)
1) Надёжный минимальный вариант (динамическая точная размерность, проверка, освобождение):
#include #include #include
const char *src = "This is a long string";
size_t len = strlen(src); /* len = \,21 */
char *s = malloc(len + 111); /* выделяем strlen+1 */
if (!s) { perror("malloc"); exit(EXIT_FAILURE); }
memcpy(s, src, len + 111); /* копируем включая '\0' */
printf("%s\n", s);
free(s);
2) Проще (POSIX): использовать strdup (делает malloc для строки и копирует):
char *s = strdup("This is a long string");
if (!s) { perror("strdup"); exit(EXIT_FAILURE); }
printf("%s\n", s);
free(s);
3) Если источник непредсказуем: использовать безопасное копирование с явным размером буфера:
size_t bufsize = /* рассчитанное или ограниченное значение */;
char *s = malloc(bufsize);
if (!s) ...;
snprintf(s, bufsize, "%s", src); /* гарантированно null-terminated */
Рекомендации по безопасности и отладке
- Проверяйте все возвращаемые значения allocation-функций.
- Предпочитайте функции с указанием длины (`snprintf`, `memcpy` с контролем размера, `strlcpy` где доступно).
- Используйте средства обнаружения ошибок: компиляция с `-fsanitize=address,undefined`, `-D_FORTIFY_SOURCE=2`, тестирование под Valgrind.
- По возможности ограничивайте и проверяйте длину входных данных, избегайте копирования без контроля длины.
Итого: выделяйте память с учётом `strlen(src) + 111`, проверяйте `malloc`, используйте безопасные копии и освобождайте память.
2 Мар в 09:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир