这是受到这个问题以及对一个特定答案的评论的启发,我strncpy在C 中学到了这不是一个非常安全的字符串处理函数,它会填充零,直到它到达n,我不知道的东西.
具体来说,引用R ..
strncpy不会为null终止,并且会对目标缓冲区的其余部分进行空填充,这是一个巨大的浪费时间.您可以通过添加自己的空填充来解决前者,但不能添加后者.它从未打算用作"安全字符串处理"功能,但是用于处理Unix目录表和数据库文件中的固定大小字段.snprintf(dest,n,"%s",src)是标准C中唯一正确的"安全strcpy",但它可能会慢很多.顺便说一下,截断本身可能是一个主要的错误,并且在某些情况下可能会导致权限提升或DoS,因此抛出"安全"字符串函数会在问题中截断其输出并不是使其"安全"或"安全".相反,您应该确保目标缓冲区的大小合适,并且只需使用strcpy(或者更好的是,如果您已经知道源字符串长度,则使用memcpy).
请注意,strncat()在其接口中比strncpy()更令人困惑 - 这个长度参数到底又是什么?根据你提供的strncpy()等,它不是你所期望的 - 所以它甚至比strncpy()更容易出错.为了复制字符串,我越来越认为有一个强烈的论据,你只需要memmove(),因为你总是提前知道所有的大小,并确保提前有足够的空间.使用memmove()优先于strcpy(),strcat(),strncpy(),strncat(),memcpy()中的任何一个.
所以,我在C标准库上显然有些生疏.因此,我想提出一个问题:
哪些C标准库函数使用不当/可能导致/导致安全问题/代码缺陷/效率低下?
为了客观性,我有一些答案的标准:
请避免:
由于这可能被认为是主观的,并且没有明确的答案,我正在为社区维基立刻做好准备.
我也按照C99工作.