记一hiredis redisCommand坑
2015-07-13 11:01
537 查看
实际上应该说是redisvFormatCommand的坑,代码如下:
[cpp] view
plaincopyprint?
case 'b':
<span style="white-space:pre"> </span>arg = va_arg(ap,char*);
size = va_arg(ap,size_t);
if (size > 0)
newarg = sdscatlen(curarg,arg,size);
break;
就是%b的时候的格式化命令,调用如下(修正后的):
[cpp] view
plaincopyprint?
reply = (redisReply*)redisCommand(redis_context, "SET %b%b%b %b",
g_preffix, (size_t)preffix_len, key, (size_t)key_len, g_suffix, (size_t)suffix_len,
value, (size_t)value_len);
调用代码中preffix_len,key_len,suffix_len,value_len都是int类型的数据,我的开发环境为centos 6.6 x64位(如果是32位开发机的话都不会碰到这个问题),在gcc 4.4.7上,我的size_t是64位,int是32位,这样在vFormatCommand中va_arg取出size的时候就会出错了,修正方案也比较简单,如上,在调用代码中,将所有size的变量转为size_t之后再调用。
不修正的话最可能碰到的问题就是Out of memory....
[cpp] view
plaincopyprint?
case 'b':
<span style="white-space:pre"> </span>arg = va_arg(ap,char*);
size = va_arg(ap,size_t);
if (size > 0)
newarg = sdscatlen(curarg,arg,size);
break;
就是%b的时候的格式化命令,调用如下(修正后的):
[cpp] view
plaincopyprint?
reply = (redisReply*)redisCommand(redis_context, "SET %b%b%b %b",
g_preffix, (size_t)preffix_len, key, (size_t)key_len, g_suffix, (size_t)suffix_len,
value, (size_t)value_len);
调用代码中preffix_len,key_len,suffix_len,value_len都是int类型的数据,我的开发环境为centos 6.6 x64位(如果是32位开发机的话都不会碰到这个问题),在gcc 4.4.7上,我的size_t是64位,int是32位,这样在vFormatCommand中va_arg取出size的时候就会出错了,修正方案也比较简单,如上,在调用代码中,将所有size的变量转为size_t之后再调用。
不修正的话最可能碰到的问题就是Out of memory....
相关文章推荐
- 坑爹的hiredis API使用
- 使用RedisTemplate的操作类访问Redis(转)
- Redis+Django(Session,Cookie、Cache)的用户系统
- 深入理解Spring Redis的使用 (四)、RedisTemplate执行Redis脚本
- redis配置文件redis.conf详细说明
- Redis安装教程
- Redis 事件(2) -- 时间事件
- 深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
- 【转】关于redis.conf的参数配置
- #redis redis-php安装配置
- 安装redis及python redis模块
- 深入浅出Redis04使用Redis数据库(lists类型)
- Windows Azure 系列-- Azure Redis Cache的配置和使用
- 深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
- 深入浅出Redis03 使用Redis数据库(hashes类型)
- Redis内存分配简单分析
- tomcat利用redis实现session共享
- [你必须知道的NOSQL系列]专题二:Redis快速入门
- Redis 事件(1) -- 文件事件
- linux下redis安装