Используя valgrind на очень простом примере из драйвера C ++ mongodb, кажется, что что-то не так, как только мы явно используем GENOID в определении BSONObj. Вот пример, который иллюстрирует проблему:
(протестировано на gcc 4.4.5, boost 1.42, debian 6, mongodb C ++ driver 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)
Если я удалю GENOID из определения BSONObj, проблема исчезнет. Это минималистская версия более сложной, но похожей проблемы, с которой я сталкиваюсь, когда использую mongo :: OID :: gen () в своем проекте.
Приведенный выше пример взят из официального руководства по драйверу C ++ для mongodb: http://www.mongodb.org/pages/viewpage.action?pageId=133415#C%2B%2BTutorial-BSON
Есть идеи, что может быть не так?
Спасибо,
После тщательного анализа с командой mongodb может показаться, что с кодом mongodb все в порядке. Я подозревал проблему выравнивания структуры в union, который используется в oid.h, но он правильно выровнен с директивой #pragma pack (1).
Я склонен думать, что это скорее ложный положительный результат valgrind из-за не очень простой структуры объединения структур, используемого в определении класса mongo :: OID. Если кто-то может воспроизвести проблему и найти окончательный ответ, мне было бы интересно. Спасибо!
Других решений пока нет …