- strlcpy
-
strlcpy и strlcat — нестандартные функции, созданные в качестве замены часто используемых некорректным образом аналогов стандартной библиотеки языка программирования Си для копирования содержимого нуль-терминированной строки в буфер ограниченного размера с защитой от переполнения буфера.
strlcpy— безопасная замена стандартной функцииstrcpy;strlcat— безопасная замена стандартной функцииstrcat.strlcpyиstrlcatпоявились и поддерживаются в OpenBSD. Позднее их начали использовать и в некоторых других операционных системах. В системах, не поддерживающихstrlcpy/strlcat, возможна их кустарная реализация, например из исходного кода, распространяемого по лицензии BSD.Содержание
Описание
Прототипы, описанные в заголовочном файле
string.h:size_t strlcpy (char *dst, const char *src, size_t size);size_t strlcat (char *dst, const char *src, size_t size);dst— указатель на буфер назначения.src— указатель на исходную строку.size— размер буфера назначения.
Функция
strlcpyкопирует из строкиsrcв буферdstне более чемsize - 1символов и гарантированно устанавливает в конец строки нулевой символ.strlcatделает то же самое, однако копирование ведётся не в началоdst, а таким образом, чтобы продолжить строку, на которую указываетdst. В случае, когдаdstуказывает на нуль-символ, поведение функций эквивалентно.Возвращаемое значение
strlcpyвозвращает размер строки по адресуsrc.strlcatвозвращает суммарную длину строк по адресамsrcиdst. Возвращаемое значение не зависит от того, удалось скопировать строку полностью или нет; это позволяет легко определить что буфер назначения слишком мал для копируемой строки.Пример использования
#include <string.h> #include <stdio.h> /* для printf() */ char buf[10]; // буфер размером меньше строки int main() { char *str = "образец строки"; size_t sz; buf[0] = '\0'; // избыточная инициализация для отладочной печати printf("строка: \"%s\"\n\n", str); printf("буфер перед копированием: \"%s\"\n", buf); sz = strlcpy(buf, str, sizeof(buf)); if (sz >= sizeof(buf)) // пример определения усечения строки printf("обнаружено усечение строки с %d до %d символов !\n", sz, sizeof(buf)-1); printf("буфер после копирования: \"%s\"\n", buf); return 0; }
Вывод:
строка: "образец строки" буфер перед копированием: "" обнаружено усечение строки с 14 до 9 символов ! буфер после копирования: "образец с"
(строка при копировании была усечена до размера буфера - 9 символов + нулевой)
Ссылки
- strlcpy and strlcat — consistent, safe, string copy and concatenation — Презентация
strlcpyиstrlcatна конференции USENIX 1999 года. - strlcpy(1) (англ.) — Руководство по функциям
strlcpyиstrlcatна сайте OpenBSD - strlcpy.c (англ.) — Исходный код функции
strlcpyв CVS-репозитории OpenBSD.
Проект OpenBSD Люди Тэо де Раадт · Боб Бек · Миод Валлат · Марк Эспи · Дамьен Миллер · OpenBSD Foundation Связанные проекты OpenSSH · PF · spamd · CARP · OpenBGPD/OpenOSPFD · OpenCVS · OpenNTPD · Xenocara · relayd Технологии strlcat/strlcpy · ProPolice Категории:- OpenBSD
- Язык программирования Си
Wikimedia Foundation. 2010.