返回信息流由于sprintf会有一些溢出问题,所以希望把手头上的所有sprintf都改为snprintf。 随之而来的问题是,有一些snprintf的buffer size不好确定。
比如说下面这样的,字符串是作为函数参数的情况,
void foo (char *a, uchar *string)
{
sprintf(string, 'format', src);
// snprintf(string, buf_size, 'format', src);
}
想请教各位的是,如果需要将上面的sprintf转成snprintf, 需要怎么确定buf的大小,或者说string允许最大长度? 因为不能确定当调用函数的时候,string到底指向的是一个字符串指针,还是一个字符串数组, 所以不敢用strlen()来获取长度, 同时也不能使用src的大小,因为这样同样有可能会造成buf overflow.
这是一条镜像帖。来源:北邮人论坛 / cpp / #82149同步于 2014/9/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教关于snprintf的buf size 问题
unnugi
2014/9/4镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个只能老老实实的把buff size作为foo的参数一层层传进来
【 在 unnugi (unnugi★旧) 的大作中提到: 】
: 由于sprintf会有一些溢出问题,所以希望把手头上的所有sprintf都改为snprintf。 随之而来的问题是,有一些snprintf的buffer size不好确定。
: 比如说下面这样的,字符串是作为函数参数的情况,
: void foo (char *a, uchar *string)
: ...................
通过『我邮2.0』发布
这是redis中一段关于vsnprintf中buflen的确定策略的源码,vsnprintf是可变参数的版本。
sds sdscatvprintf(sds s, const char *fmt, va_list ap) {
va_list cpy;
char *buf, *t;
size_t buflen = 16;
while(1) {
buf = zmalloc(buflen);
if (buf == NULL) return NULL;
buf[buflen-2] = '\0';
va_copy(cpy,ap);
vsnprintf(buf, buflen, fmt, cpy);
if (buf[buflen-2] != '\0') {
zfree(buf);
buflen *= 2;
continue;
}
break;
}
t = sdscat(s, buf);
zfree(buf);
return t;
}
希望对你有启发
我的想法是,如果能确定是数组传进来,可以直接用sizeof()来取大小,但是指针就完了。同理strlen()没法对数组使用。
【 在 doug 的大作中提到: 】
: 字符串指针和字符串数组除了一个是const 一个不是之外。。。 有啥不一样呢?。。
: 传递字符串的时候不都配合传递长度么。。。
【 在 unnugi 的大作中提到: 】
: 不会。。。打算学学。。
嗯。你遇到的真正的问题是动态的数据,比如字符串的长度不定。接下来的问题就是分配不定长的缓冲区,然后就是把这些动态分配的空间回收掉。这种情况还是有一个有垃圾回收的语言方便,要不然就自己分配内存吧,写一个好的内存分配算法,难度不一定比写一个垃圾回收器低。
谢谢我看一眼
【 在 xuangong 的大作中提到: 】
: 这是redis中一段关于vsnprintf中buflen的确定策略的源码,vsnprintf是可变参数的版本。
: sds sdscatvprintf(sds s, const char *fmt, va_list ap) {
: va_list cpy;
: ...................
目前貌似只有这样了
【 在 hutaow 的大作中提到: 】
: 这个只能老老实实的把buff size作为foo的参数一层层传进来
:
: 通过『我邮2.0』发布