Bug (?) in TBuffer::ReadClass

From: George Heintzelman (gah@bnl.gov)
Date: Thu Aug 26 1999 - 23:07:37 MEST


Hi,

I was trying to use TObject::Clone() to copy an object which included a TArrayF, which gave me the following messages twice, followed somewhat later by a segmentation violation.

Error in <TExMap::Add>: key 2 is not unique

I tracked it back to TBuffer::ReadClass, appended (in edited form) below.  My comments are noted with //** at the left.  Is this a bug or am I missing something?  I'm using 2.22/10 on RedHat 6.0.  And is this likely to be causing my Segvio later on?

TClass *TBuffer::ReadClass(const TClass *clReq, UInt_t *objTag)
{
[...]

   // read byte count and/or tag (older files don't have byte count)
   UInt_t bcnt, tag, startpos = 0;
   *this >> bcnt;
   if (!(bcnt & kByteCountMask) || bcnt == kNewClassTag) {
      tag  = bcnt;
      bcnt = 0;
   } else {
      fVersion = 1;
      startpos = UInt_t(fBufCur-fBuffer);
      *this >> tag;
   }
//** It appears that this TArrayF at least 
//** has bcnt == kNewClassTag = 0xffffffff, so
//** startpos is still zero after this if.

   // in case tag is object tag return tag
   if (!(tag & kClassMask)) {
      if (objTag) *objTag = tag;
      return 0;
   }
//** Since tag is now ffffffff, it & kClassMask are true of course, so this is 
//** skipped.

   TClass *cl;
   if (tag == kNewClassTag) {

//** It enters here...

      // got a new class description followed by a new object
      // (class can be 0 if class dictionary is not found, in that
      // case object of this class must be skipped)
      cl = TClass::Load(*this);

      // add class to fReadMap for later reference
      if (fVersion > 0) {
         // check if class was already read
         TClass *cl1 = (TClass *)fReadMap->GetValue(startpos+kMapOffset);
//** But startpos is still 0... kMapOffset = 2, so this is is then causing
//** the error message of '2' having multiple readings. This has apparently
//** happened once before already to cause the error message, that I didn't see.
         if (cl1 != cl)
            MapObject(cl ? cl : (TObject*) -1, startpos+kMapOffset);
      } else
         MapObject(cl, fMapCount);

[... rest snipped... ]



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:38 MET