[ROOT] TDataMember::GetMaxIndex() return large negative number!

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Mon Aug 14 2000 - 17:48:51 MEST


Hi ROOT'ers, 

First some info:
ROOT version: 2.25/01
CINT version: 5.14.44
OS:           Redhat Linux 6.1
Architecture: i386 (PIII)

There seems to be a bug in "TDataMember::GetMaxIndex(int)", or maybe it's
in int "G__DataMemberInfo::MaxIndex(int dim)", because it returns a
large negative number for size of the index if, in my class I have
have a static const Char_t* array of unknown size. Here's a reall
simple example showing whats going on:

File foo.hh
-----------------------------------------------------------------
#ifndef FOO_H
#define FOO_H

#include <TObject.h>

class Foo : public TObject 
{
public:
  static const Int_t   fBar;
  static const Char_t* fBaz[]; //[fBar]

  ClassDef(Foo,1) // Foo object
}
;

#endif 

File foo.cc
-----------------------------------------------------------------
#include "foo.hh"
#include <iostream>

ClassImp(Foo);

const Int_t   Foo::fBar = 3;
const Char_t* Foo::fBaz[Foo::fBar] = { "Foo", "Bar", "Baz" };

File fooLinkDef.hh
-----------------------------------------------------------------
#ifndef __CINT__
#error "Not for compiling"
#endif

#pragma link off all classes;

#pragma link C++ class Foo;

File fooMake.sh
-----------------------------------------------------------------
#!/bin/sh 

rootcint -f fooCint.cc -c foo.hh fooLinkDef.hh  
g++ `root-config --cflags` -g -fPIC -Wall -c fooCint.cc  
g++ `root-config --cflags` -g -fPIC -Wall -c foo.cc    
g++ -shared -Wl,-soname,libFoo.so -o libFoo.so fooCint.o foo.o 

When I do:

 prompt% root  
   *******************************************
   *                                         * 
   *        W E L C O M E  to  R O O T       *
   *                                         *
   *   Version   2.24/05       16 May 2000   *
   *                                         *
   *  You are welcome to visit our Web site  *
   *          http://root.cern.ch            *
   *                                         *
   *******************************************
 
 Compiled with thread support.
 
 CINT/ROOT C/C++ Interpreter version 5.14.38, May 5 2000
 Type ? for help. Commands must be C++ statements.
 Enclose multiple statements between { }.
  root [0] gSystem->Load("./libFoo.so")
 (int)0
 root [1] TClass* c = Foo::Class()
 root [2] TDataMember* m = c->GetDataMember("fBaz")
 root [3] m->GetMaxIndex(0)
 (const Int_t)(-2147483648)
 root [4]  

To me it looks like over flow of some variable, since looking in
/usr/include/limits.h gimme (on a i386)

  #  define INT_MIN       (-INT_MAX - 1)
  #  define INT_MAX       2147483647
  #   define LONG_MAX     2147483647L
  #  define LONG_MIN      (-LONG_MAX - 1L)

The consequence of this (bug!?) is that THtml will produce a very
large file, because of a loop inside THtml::Class2Html, that goes
something like 

  for( w = 0; w < ( maxLen2[j]-len2 ); w++ )
    classFile << " "

where len2 = TMath::Log10(-2147483648) = nan. The file is only closed
when it reaches the 2 GB file limit on the EXT2 filesystem. 

I hope you know what's going on, 'cause I've got the faintest. 

Yours, 

Christian  -----------------------------------------------------------
Holm Christensen                             Phone:  (+45) 35 35 96 91 
  Sankt Hansgade 23, 1. th.                  Office: (+45) 353  25 305 
  DK-2200 Copenhagen N                       Web:    www.nbi.dk/~cholm    
  Denmark                                    Email:       cholm@nbi.dk



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:31 MET