valgrind使用GENOID创建的简单BSON对象报告BSONObj :: toString中的未初始化值

时间:2013-01-06 20:11:09

标签: c++ mongodb bson

在mongodb的C ++驱动程序的一个非常简单的例子中使用valgrind,只要我们在BSONObj的定义中明确使用GENOID,就会出现问题。这是一个说明问题的例子:

(在gcc 4.4.5上测试,增强1.42,debian 6,mongodb C ++驱动2.2)

#include <cstdio>
#include <string>
#include "mongo/db/jsobj.h"

main()
{
  mongo::BSONObj p = BSON( mongo::GENOID << "name" << "Joe" << "age" << 33 );
  std::string s = p.toString();
  std::cout << s;
}

当使用valgrind运行时,我们收到以下消息:

==2506== Use of uninitialised value of size 8
==2506==    at 0x40A66B: mongo::toHexLower(void const*, int) (hex.h:64)
==2506==    by 0x40A73F: mongo::OID::str() const (oid.h:66)
==2506==    by 0x40A798: mongo::operator<<(mongo::StringBuilderImpl<mongo::TrivialAllocator>&, mongo::OID const&) (oid.h:140)
==2506==    by 0x40DCC1: mongo::BSONElement::toString(mongo::StringBuilderImpl<mongo::TrivialAllocator>&, bool, bool, int) const (bson-inl.h:765)
==2506==    by 0x40C898: mongo::BSONObj::toString(mongo::StringBuilderImpl<mongo::TrivialAllocator>&, bool, bool, int) const (bson-inl.h:475)
==2506==    by 0x40C5A5: mongo::BSONObj::toString(bool, bool) const (bson-inl.h:445)
==2506==    by 0x40A1B8: main (mongobug.cc:10)

如果从BSONObj定义中删除GENOID,则问题就消失了。这是我在项目中使用mongo :: OID :: gen()时遇到的更复杂但类似问题的极简主义版本。

上面的示例来自官方mongodb C ++驱动程序教程:http://www.mongodb.org/pages/viewpage.action?pageId=133415#C%2B%2BTutorial-BSON

知道可能出现什么问题吗? 谢谢,

1 个答案:

答案 0 :(得分:1)

经过与mongodb团队的仔细审查,似乎mongodb代码没有任何问题。我怀疑在oid.h中使用的联合中存在结构对齐问题,但是它与#pragma pack(1)指令正确对齐。

我倾向于认为它更像是valgrind的误报,因为在mongo :: OID类的定义中使用的结构联合的结构并不那么简单。如果有人能够重现问题并找到明确的答案,我会感兴趣。谢谢!