为什么用strlcpy取代strncpy

为什么用strlcpy取代strncpy

标题: 为什么用strlcpy取代strncpy
作者: Demon
链接: http://demon.tw/copy-paste/strlcpy-replace-strncpy.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。

最近看模块代码,发现字符串的拷贝都用的strlcpy,所以就查了查用strlcpy取代strncpy的原因。

详细内容请看:http://www.gratisoft.us/todd/papers/strlcpy.html

简单总结几点: 
1. strcpy是最不安全拷贝字符串函数,因为src串的长度有时会很长。随后strncpy函数为了解决这个问题出现了,但这个函数有些地方实现得也很诡异,它对于字符串末尾的’\0’处理不是很好。

例1: 
char str[11]; 
strncpy(str, "hello world", 11);

在例1中只会把str数组填满,但这个字符串却没有’\0’的结束符。

例2: 
char str[20]; 
strncpy(str, "sample", 15);

在例2中,15远远大于了字符串"sample"的长度,这时strncpy要在剩下的部分补充’\0’。首先说这样会影响效率,其次对于static或者calloc这样已经初始化的数组根本不需要填写’\0’。 
因此在使用strncpy拷贝字符串时,通常要这样写,

例3: 
strncpy(path, homedir, sizeof(path) – 1); 
path[sizeof(path) – 1] = ‘\0′;

2. 而strlcpy可以自动处理末尾’\0’的问题

size_t strlcpy(char *dst, const char *src, size_t size);

然而strlcpy不是ANSI C函数,一般在linux下使用。

原文链接:为什么用strlcpy取代strncpy

时间: 2024-10-19 18:19:26

为什么用strlcpy取代strncpy的相关文章

Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

概述 随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy() 和strncat() .尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的.本文介绍另一种直观的,一致的,天生安全的字符串拷贝API . 当函数 strncpy()和 strncat()作为 strcpy()和 strcat()的安全版本来使用时,仍然存在一些安全隐患. 这两函数以不同的,非直观的方式来处理NUL 结束符和长度参数,即使有经验的程序员也会混淆

内核源码研读预备知识

穿插在代码研读中的细节数据类型:    类型定义:        内核使用typedef来定义各种数据类型,以避免依赖于体系结构相关的特性,比如,各处理器上标准数据类型的位长可能不相同.定义的类型名称如sector_t.pid_t等,这些都是由内核在特定于体系结构的代码中定义的,以确保相关类型的值落在适当的范围内,因此一般无需了解这些类型的具体定义.但如果某个变量类型是typedef而来的,就不能直接访问,而是通过辅助函数.        某些时候必须使用精确定义了位数的变量,例如使用USB时,

strcpy、strncpy和strlcpy的用法

char * strcpy(char *to, const char *from) { char *save = to; for (; (*to = *from) != '\0'; ++from, ++to); return(save); } char * strncpy ( char * destination, const char * source, size_t count ) { char *start = dest; while (count && (*dest++ = *so

C++ 中 strcpy、strcpy_s、strncpy、strlcpy的异同

strncpy的用法:它与strcpy的不同之处就在于复制n个字符,而不是把所有字符拷贝(包括结尾'\0'). 函数原型:char * strncpy(char *dst,const char * src, int n) 当src的长度小于n时,dst内的未复制空间用'\0'填充.否则,复制n个字符到dst,没有加'\0'.这里就要注意在字符串dst结尾处理加'\0'的情况了 strcpy ,strncpy ,strlcpy的用法好多人已经知道利用strncpy替代strcpy来防止缓冲区越界.

查看文章strncpy()功能更好的文章

strncpy()函数 原型:extern char *strncpy(char *dest, char *src, int n); 使用方法:#include <string.h> 功能:把src所指由NULL结束的字符串的前n个字节拷贝到dest所指的数组中. 说明:假设src的前n个字节不含NULL字符,则结果不会以NULL字符结束. 假设src的长度小于n个字节,则以NULL填充dest直到复制完n个字节. src和dest所指内存区域不能够重叠且dest必须有足够的空间来容纳src的

strlcpy和strlcat

strncpy 等主要的问题还是虽然不会溢出,但是满了就不给缓冲区添加0结束符了,以前在项目里面自己还写了个 safe_strcpy 现在发现早就有了 http://blog.csdn.net/linyt/article/details/4383328 找了一下,代码可以在 libbsd 里面有 /*  * Appends src to string dst of size siz (unlike strncat, siz is the  * full size of dst, not spac

[ Perl 6 ] 被取代的钻石操作符(&lt;&gt;)

[ Perl 6 ] 被取代的钻石操作符(<>) There is more than one way to do it. Perl 5中,如果要逐行读取一个文件的内容,你可能会写出下面的代码 while (<>) { chomp; print "It was $_ that I saw.\n"; } $ perl myscript.pl in 但是在Perl 6中,钻石操作符<>已经不再被支持,现在可以用下面的代码来完成上面的功能 for line

sizeof strlen strncpy

sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 int main() 5 { 6 char *p="wangddd"; 7 printf("%d\n",sizeof(p));//输出4,指针类型 8 9 char x[8]; 10 printf("%d

代码重构之以查询取代临时变量

意图 - 使得同一个类中的所有函数都可以获得这份信息,能够为这个类编写更清晰的代码 示例 /** * 以查询取代临时变量之前 * Created by luo on 2017/4/19. */ public class ReplaceTempWithQueryBefore { private double _quantity; private double _itemPrice; public double test() { double basePrice = _quantity * _ite