strlcpy
strlcpy и strlcat — нестандартные функции, созданные в качестве замены часто используемых некорректным образом аналогов стандартной библиотеки языка программирования Си для копирования содержимого нуль-терминированной строки в буфер ограниченного размера с защитой от переполнения буфера.
strlcpy
и strlcat
— безопасная и производительная замена стандартных функций strncpy
и strncat
, соответственно.
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(void)
{
const char *str = "образец строки";
size_t sz;
buf[9] = '\0'; // избыточная инициализация для отладочной печати
printf("строка: \"%s\"\n\n", str);
printf("буфер перед копированием: \"%s\"\n", buf);
sz = strlcpy(buf, str, sizeof(buf));
if (sz >= sizeof(buf))
printf("обнаружено усечение строки с %zu до %lu символов !\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.