主要观点:strlcpy(3)常被视为strcpy(3)和strncpy(3)的更安全替代品,但作者不喜欢它,认为其效率低且并非最佳选择。
关键信息:
strlcpy存在问题,如src未以空字符结尾时不安全,且效率不高。- 字符串问题可分为截断重要和不重要两类,截断不重要时
memccpy(3)更优,截断重要时应动态分配内存使用strdup(3)或strlen(3)与memcpy(3)。 - 若 stuck with a fixed size buffer 且
src大于缓冲区,应使用memccpy判断截断。 - 用
mem*函数处理字符串并非错误,memccpy(3)和strdup(3)已被接受进入 C2x 草案。
重要细节: - 严格来说,根据 C 标准,字符串是以空字符终止的连续字符序列,“null-terminated string”这一术语冗余。
- 在截断不重要的情况下,
strlcpy效率低,strncpy也有问题,memccpy更合适。 - 在截断重要且需动态分配内存的情况下,
strdup或strlen(3)与memcpy(3)更优。 - 对于 stuck with a fixed size buffer 的情况,
memccpy比strlcpy更高效且更符合逻辑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。