解决JSONCPP 0.10.2的一个Bug

最近在使用jsoncpp 0.10.2的过程中碰到一个bug,创建的数组,无法超过5个元素,测试代码如下:

int j = 0;

int count = 20;

Json::Value root;

Json::Value item;

for (int i = 0; i < count; i++)

{

root[i] = i;

j = root.size();

}

在我的实际项目中,如果数组只有1个是元素(该元素稍微有点大的JSON对象),也有可能出现这个元素的值错误的故障,超过5个肯定出错。

在github上创建了一个issue,作者响应很快,但由于开发环境不同,他测试各个分支的代码结果都正常,不能重现故障。我在几天里,陆续调试过几次后,终于逐渐发现了故障原因:

在jsoncpp的源码里进行Debug,发现实际创建的数组成员数量并没有少,但 value_.map_ 的键CZString的成员index_是 0,1,2,3,4,0,1,2,3,4, 0,1,2,3,4,0,1,2,3,4,按正确代码应该是从0一直递增到19。而数组的size()函数是按最后一对键值的index_加1来计算大小的:

case arrayValue: // size of the array is highest index + 1

if (!value_.map_->empty()) {

ObjectValues::const_iterator itLast = value_.map_->end();

--itLast;

return (*itLast).first.index() + 1;

}

return 0;

这里我不能理解作者不直接调用map的size()函数,虽然按最后一个元素的index_的值加1来计算数组大小在逻辑上无错误。发现这个环节的故障后,再经过几次调试和思考,发现了故障原因所在:

Value::CZString::CZString(const CZString& other)

: cstr_(other.storage_.policy_ != noDuplication && other.cstr_ != 0

? duplicateStringValue(other.cstr_, other.storage_.length_)

: other.cstr_)

{

storage_.policy_ = (other.cstr_

? (other.storage_.policy_ == noDuplication

? noDuplication : duplicate)

: other.storage_.policy_);

storage_.length_ = other.storage_.length_;

}

以上这个拷贝构造函数里没有处理index_这个成员变量。加上以下1行,解决了故障:

this->index_ = other.index_;

再次更新issue,作者确认是bug,同时对该bug未影响其他用户感到奇怪。

时间: 2024-08-08 01:28:33

解决JSONCPP 0.10.2的一个Bug的相关文章

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器  大 | 中 | 小  [ 2011-3-30 08:40 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.zyan.cc/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 L

Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?

Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win10的一个Bug? 1.问题和现象 右下角菜单点不开,下面的状态栏的右键也没有反应.时间日期也点不开,音频喇叭同样点不开....各种烦人,百度一堆都无果.... 说明:Win10是正式版,已激活:杀毒也全盘扫描过,因为电脑是开发和办公用,几乎不上其他网站,所以中毒的可能性几乎为0. 2.解决方法 晚上

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program

Java内部类this$0字段产生的一个bug

首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类BinomialHeapEntry,这个内部类的对象即二项堆中的每一个结点,除了包含结点对应的关键字外,还记录父节点parent,下一个兄弟结点sibling和第一个孩子结点child三个指针.二项堆的根表通过每棵二项树根节点的sibling指针链接. cloneBinomialTree(BinomialHea

NetBSD-1.0 时间设置的一个bug

每次使用 date 命令设置主机时间,再次重启后时间就和设置的不一样了!查看启动时的日志: 对应的代码为 arch/i386/isa/clock.c 的 startrtclock 函数: /* Check diagnostic status */ outb (IO_RTC, RTC_DIAG); if (s = inb (IO_RTC+1)) printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS); 为什么 RTC 的诊断状态会不

docker 1.0.0发布以及一个bug依赖apparmor_parser

6月10号docker 1.0稳定版本发布,找了台ubuntu的机器,装了下 ubuntu version:12.04 docker version:1.0.0 装docker的步骤可以看官方文档:https://docs.docker.com/installation/ubuntulinux/ 装好之后,运行docker -d尝试启动docker守护进程,报错如下: [0fcb4ed6] +job serveapi(tcp://127.0.0.1:2375) [0fcb4ed6] +job i

文《关于c++与java中文乱码问题分析与解决》中一个bug分析

文<关于c++与java中文乱码问题分析与解决>中一个bug分析 DionysosLai([email protected]) 2014/10/21 在前几篇一博客<关于c++与java中文乱码问题分析与解决>,地址如下:http://blog.csdn.net/dionysos_lai/article/details/38389765.文中详细介绍了c++与java数据传递时,为何会出现中文乱码的原因,并提出了适当的解决方法.方法如下: int CCDirector::GBKTo

AIX6.1/11.2.0.3在有关数据库SWAP一个BUG

昨天南京到客户服务数据库的优化调整,其中新上线,经过审查alert.log当日志现在是在过去一段时间内取得,每隔几个小时的时间滞后,班会报似的内容: Thu Aug 21 09:01:26 2014 WARNING: Heavy swapping observed on system in last 5 mins. pct of memory swapped in [8.42%] pct of memory swapped out [2.16%]. Please make sure there