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.
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.