Безопасное использование strcpy - PullRequest
0 голосов
/ 07 мая 2018

Обычный старый 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. Спасибо за ваш вклад и опыт.

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

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

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

, например

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

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

0 голосов
/ 07 мая 2018

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

  • При выделении памяти возникает утечка памяти.
  • Использование strcpy() вместо повторного использования длины является неоптимальным. Вместо этого используйте std::copy_n() или memcpy().

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

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

0 голосов
/ 06 июля 2018

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

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

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

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

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

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

...