snprintf和朋友可以安全使用吗?

ban*_*ndi 4 c printf buffer-overflow

最近有一个关于SO的问题(为什么有人会使用strncpy而不是strcpy?),这是hade的答案(答案1,答案2),这使我不确定其他字符串函数的名字中带有'n',如snprintf(我一直在广泛使用).snprintf可以安全使用吗?一般来说,'n'家族的安全功能是什么?

Mic*_*urr 13

strncpy()是一个奇怪的函数,它实际上是错误的 - 它的最初目的是确保缓冲区完全用字符串的内容初始化(不会溢出目标)和缓冲区的提示用零.据我了解,最初的目的是处理文件系统目录条目 - 目标缓冲区实际上并不是strxxx()与C库中其他函数相同的字符串.主要问题strncpy()是如果源字符串大于目标缓冲区,则结果将不会以null结尾.

处理字符串的大多数其他'n'函数都可以正确地终止字符串,但是有一些例外,比如微软的混蛋_snprintf().正确的C99 snprintf()将始终为null终止目标字符串(只要目标缓冲区的大小大于0).

有一个"技术报告",TR 24731为处理字符串和内存缓冲区的函数提出了一组边界检查备选方案.TR的目标之一是使函数的参数,结果和错误行为在各个函数中更相似.TR似乎有点混合接受,我不认为除了微软的编译器之外它被广泛实现(我认为MS是TR背后的主要驱动因素).你可以在这里获得更多信息:

即使你不是这些提案的粉丝,我认为他们也会就现有职能的问题进行教育性阅读.