我不是 strlcpy(3) 的粉丝

主要观点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更合适。
  • 在截断重要且需动态分配内存的情况下,strdupstrlen(3)memcpy(3)更优。
  • 对于 stuck with a fixed size buffer 的情况,memccpystrlcpy更高效且更符合逻辑。
阅读 24
0 条评论