Безопасное использование strcpy

Обычный старый strcpy запрещен к использованию в стандарте кодирования нашей компании из-за его потенциальной возможности переполнения буфера. Я искал источник для какой-то сторонней библиотеки, на которую мы ссылаемся в нашем коде. Исходный код библиотеки использует strcpy, например:

for (int i = 0; i < newArgc; i++)
{
newArgv[i] = new char[strlen(argv[i]) + 1];
strcpy(newArgv[i], argv[i]);
}

Поскольку strlen используется при выделении памяти для буфера для копирования, это выглядит хорошо. Есть ли какой-нибудь возможный способ использовать этот нормальный strcpy, или это безопасно, как мне кажется?

Я видел наивное использование strcpy, которое приводит к ситуациям переполнения буфера, но, похоже, этого не происходит, поскольку он всегда выделяет нужное количество места для буфера, используя strlen, а затем копирует в этот буфер, используя argv [] в качестве источник, который всегда должен быть нулевым.

Мне, честно говоря, любопытно, может ли кто-то запустить этот код с помощью отладчика или использовать какие-то другие тактики, которые кто-то пытается взломать наш двоичный файл (с этим источником библиотеки, на который мы ссылаемся в его скомпилированной версии), может использовать это использование из strcpy. Спасибо за ваш вклад и опыт.

2

Решение

это возможный использовать strcpy безопасно — это просто довольно тяжелая работа (именно поэтому ваши стандарты кодирования запрещают это).

Однако размещенный вами код не является уязвимостью. Нет способа перезаписать биты памяти этим; Я бы не стал переписывать его. (Если ты делать решите переписать его, используйте std::string вместо.

3

Другие решения

Ну, есть несколько проблем с этим кодом:

  • Если распределение выбрасывает, вы получаете утечку памяти.
  • С помощью strcpy() вместо повторного использования длина является неоптимальной. использование std::copy_n() или же memcpy() вместо.

Предположительно, нет данных гонок, не то, что мы можем сказать.

В любом случае, это небольшое снижение производительности — единственное, что «неправильно» использовать strcpy() там. По крайней мере, если вы настаиваете на ручном управлении своими строками самостоятельно.

2

Отклонение от стандарта кодирования всегда должно быть возможным, но затем хорошо документируйте, почему вы решили это сделать.

Основная проблема с strcpy заключается в том, что он не имеет ограничения по длине. При работе с ним это не проблема, но это означает, что strcpy всегда должен сопровождаться каким-то защитным кодом. Многие менее опытные программисты попали в эту ловушку, поэтому руководство по кодированию вошло в практику.

Возможные способы безопасного выполнения копирования строк:

  • Проверьте длину строки
  • Используйте безопасный вариант, например strlcpy, или на старых компиляторах Microsoft, strncpy_s.
0

В качестве общей замены strcpy, предполагая, что вы в порядке с небольшими накладными расходами на функции форматирования печати, используйте snprintf:

snprintf(dest, dest_total_buffer_length, "%s", source);

например

snprintf(newArgv[i], strlen(argv[i]) + 1, "%s", argv[i]);

Это безопасно, просто, и вам не нужно думать о настройке размера + 1 / -1.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector