辛辛苦苦花了两天时间才学会了 strcpy 的用法,没想到却被 Linux 内核弃用了。
而且听说社区在持续努力,目标是彻底移除内核中所有对 strcpy 的调用。
难道是因为 Linux 内核不需要拷贝字符串吗?并不是,而是 strcpy 不安全。
char *strcpy(char *restrict dst, constchar *restrict src);
strcpy 需要提供两个参数,从哪拷贝数据,把数据拷贝到哪里。
问题就是,如果这里面的数据太多,超过了目标区域能容纳的字节数,strcpy 不会做任何处理,程序直接失控。
于是有同学会说,不要用 strcpy,换成 strncpy 就行了。其实这个函数也不行。
strncpy 比 strcpy 多了一个参数,可以指定拷贝的字节数,但是这个字节数并不一定是目标区域的字节数,所以也存在越界的风险。另外,如果源字符串太长,不会在结尾补 \0;如果源字符串太短,会拷贝多个 \0,效率偏低。
不管是 strcpy 还是 strncpy,他们都不是安全的版本。
strscpy(channel->dev_id, dev_id, sizeof(channel->dev_id));
在比较新的内核源码中,逐渐使用 strscpy 函数取代 strcpy,strscpy 多了一个参数,用于表示目标区域的大小,这样即使需要拷贝的数据太长,也能对其进行截断,防止越界导致异常出现。
需要注意的是,这个函数属于内核函数,在应用层用不了,所以我们平时写代码,还是得用 strcpy。或者微软也有一个函数 strcpy_s,它属于标准 C 可选的扩展,因此,不是所有编译器都支持。
实战延伸___
以上只是 Linux 工程中的一个小技巧,如果你也想真正写出工程级代码,我整理了几个完整项目,这个暑期可以一对一带着做,从0到可运行项目,适合做简历提升。
品牌宣传 | 企业培训 | 技术推广 | 职业提升