Обычный старый 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. Спасибо за ваш вклад и опыт.
это возможный использовать strcpy
безопасно — это просто довольно тяжелая работа (именно поэтому ваши стандарты кодирования запрещают это).
Однако размещенный вами код не является уязвимостью. Нет способа перезаписать биты памяти этим; Я бы не стал переписывать его. (Если ты делать решите переписать его, используйте std::string
вместо.
Ну, есть несколько проблем с этим кодом:
strcpy()
вместо повторного использования длина является неоптимальной. использование std::copy_n()
или же memcpy()
вместо.Предположительно, нет данных гонок, не то, что мы можем сказать.
В любом случае, это небольшое снижение производительности — единственное, что «неправильно» использовать strcpy()
там. По крайней мере, если вы настаиваете на ручном управлении своими строками самостоятельно.
Отклонение от стандарта кодирования всегда должно быть возможным, но затем хорошо документируйте, почему вы решили это сделать.
Основная проблема с strcpy заключается в том, что он не имеет ограничения по длине. При работе с ним это не проблема, но это означает, что strcpy всегда должен сопровождаться каким-то защитным кодом. Многие менее опытные программисты попали в эту ловушку, поэтому руководство по кодированию вошло в практику.
Возможные способы безопасного выполнения копирования строк:
В качестве общей замены strcpy, предполагая, что вы в порядке с небольшими накладными расходами на функции форматирования печати, используйте snprintf:
snprintf(dest, dest_total_buffer_length, "%s", source);
например
snprintf(newArgv[i], strlen(argv[i]) + 1, "%s", argv[i]);
Это безопасно, просто, и вам не нужно думать о настройке размера + 1 / -1.