snprintf
最近使用snprintf 遇到了一个坑 , 下面是snprintf 的函数声明。
int snprintf(char *str, size_t size, const char *format, ...);
我使用的场景如下,当items 结构很多的时候,程序就崩溃了,开始查找了很久,最后发现是snprintf的使用问题。snprintf 我先入为主的认为它的返回值 像 read/ write 系统调用一样,返回的值是成功写入buff的值的大小,但是实际上snprintf的值是你格式化后整个字符串的大小并发实际写入buff的大小。又因为 它的第二个参数是size_t ,那么很可能 返回值被减成 复制,然后又把一个 int 转化成 size_t ,这个时候第二个参数 size 就会很大,从而越界。
struct Item {
int id;
}
char buff[2048] = {0};
void AppendItem(std::vector<Item>& items) {
int pos = 0;
for (size_t i = 0; i < items.size(); ++i) {
pos = snprintf(buff, sizeof(buff) - pos, "%d", items[i].id);
}
}
总结
- snprintf 的第二个参数是size_t ,传参数的时候需要小心。
- snprintf 返回值是整个格式化字符串的大小