複製鏈接
請複製以下鏈接發送給好友

strlcpy

鎖定
C語言函數strlcpy,BSD的自定義函數,是更加安全版本的strcpy函數,在已知目的地址空間大小的情況下,把從src地址開始且含有'\0'結束符的字符串複製到以dest開始的地址空間,並不會造成緩衝區溢出 [1] 
中文名
strlcpy
外文名
strlcpy
功    能
字符串複製
頭文件
string.h
返回值類型
size_t

strlcpyC語言函數

函數原型聲明:size_t strlcpy(char *dest, const char *src, size_t size)
頭文件引用:#include <string.h>
功能: 在已知dest緩衝區大小並不會造成緩衝區溢出前提下,將src地址開始的字符串複製到以dest開始的地址空間
返回值:src字符串的大小
函數參數:參數dest為目的字符串開始的指針,src為源字符串的開始地址,參數size代表dest字符串的大小

strlcpy功能説明

strlcpy函數創建的目的主要是針對strcpy函數緩衝區溢出的問題,因為一旦strcpy調用中src的字符串長度超過了dst的緩衝區大小,就會造成緩衝區安全漏洞問題,這是一類常見也嚴重的計算機安全漏洞。當然strcat函數也有安全版本的strlcat函數。

strlcpy與strncpy區別

類似的函數還有strncpy,但是strlcpy常常是更加安全地選擇,因為strlcpy在複製之後dst字符串一定會以'\0'字符結尾 [2]  。代碼説明如下
#include <string.h>
#include <stdio.h>
int main()
{
    char buf[5];
    char src[10] = "12345678";
    strlcpy(buf, src, sizeof(buf));
    printf("%s\n",buf);//輸出1234
    return 0;
}
上述示例中buf字符串最終結果是“1234\0”,以結束字符結尾,而如果同樣地情況下使用strncpy函數,代碼如下
#include <string.h>
#include <stdio.h>
int main()
{
    char buf[5];
    char src[10] = "12345678";
    strncpy(buf, src, sizeof(buf));
    printf("%s\n",buf);
    return 0;
}

這個時候buf最終結果就是"12345",並沒有以結束字符結尾。
參考資料