|
最近在 C 环境下编写一些字串转换识别代码,偶然间看到 strncpy 这个函数,感觉 string.h 还挺完善。
随手翻看 MSDN,函数的原型也不意外,比起标准的 strcpy 多了一个拷贝数目,想来可以拷贝指定字节:
char *strncpy( char *dst, const char *src, size_t count );
然而细看 MSDN 才发现这函数并不像表面那样人畜无害,以下分情况讨论:
【count <= strlen(src)】
此时只是拷贝了 src 前 count 个字符,并且不追加 ASCII-NUL(0x00),相当于:
memcpy(dst, src, count);
拷贝完字串依旧是 dst 的长度,只是复制了 src 前 count 个字符。
【count > strlen(src)】
此时的确拷贝了 src 整串,并且向 dst 追加了 count-strlen(src) 个 ASCII-NUL(0x00),相当于:
memset(dst, 0x00, count);
strcpy(dst, src);
拷贝完的确是 src 长度了,但写入一堆没用的 ASCII-NUL 要作何?
-------------------------------------------------------------------
综合上述两种情况,要么是可以被 memcpy 替代,要么是写一堆没用的 NUL,两种情况处理字串都不妥。
搜了搜典型用法: strncpy(dst, src, sizeof(dst)-1)
目标是确保 dst 不发生溢出,但显然依旧有风险:dst非空时,src足够长就会触发“无NUL”的BUG,导致 dst 放飞。
甚至看到坛友用: strncpy(dst, src, strlen(src))
这就不吐槽了,一样有“无NUL”的BUG.
以上,发现 strncpy 是个大坑,发来供大家参考。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|