学生:我怎样才知道对于任意的 sprintf 调用需要多大的目标缓冲区?怎样才能避免 sprintf() 目标缓冲区溢出?
小林:当用于 sprintf() 的格式串已知且相对简单时, 你有时可以预测出缓冲区的大小。如果格式串中包含一个或两个 %s, 你可以数出固定字符的个数再加上对插入的字符串的 strlen() 调用的返回值。
当格式串更复杂或者在运行前未知的时候, 预测缓冲区大小会变得跟重新实现 sprintf 一样困难, 而且会很容易出错。有一种最后防线的技术, 就是 fprintf() 向一块内存区或临时文件输出同样的内容, 然后检查 fprintf 的返回值或临时文件的大小,并提防写文件错误。
如果不能确保缓冲区足够大, 你就不能调用 sprintf(), 以防缓冲区溢出后改写
其它的内存区。如果格式串已知, 你可以用 %.Ns 控制 %s 扩展的长度, 或者使用%.*s。
要避免溢出问题, 你可以使用限制长度的 sprintf() 版本, 即 snprintf()。
正文完