Hi Eddy,
we just fixed the problem (it was a few days ago reported by another
user using purify). Anyway, many thanks for tracing this problem. The
more people using Purify the better the program will get.
Cheers, Fons.
PS: it was a clear bug, not a compiler issue. Your fix is ok.
>
> Running on "SunOS 5.6 Generic_105181-11 sun4u sparc SUNW,Ultra-Enterprise"
> and using CC compiler : CC: SC4.0 18 Oct 1995 C++ 4.1
>
> My program uses the ROOT libraries but has its own main
> as described in the TROOT class. When distributing it to other machines
> I noticed that it SEGV-ed there. Running "purify" revealed the following:
>
> --------------------------
> **** Purify instrumented RenRoot (pid 1985 at Tue Aug 24 15:13:47 1999)
> * Purify 4.2 Solaris 2, Copyright (C) 1992-1998 Rational Software Corp. All rights reserved.
> * For contact information type: "purify -help"
> * Command-line: RenRoot
> * Options settings: -purify -logfile=./purify_report.%v.%p -first-only \
> -purify-home=/usr/local/pure/purify-4.2-solaris2
>
> **** Purify instrumented RenRoot (pid 1985) ****
> FMR: Free memory read:
> * This is occurring while in:
> strncmp [rtlib.o]
> TGMimeTypes::TGMimeTypes(TGClient*, const char*) [GUI_GMimeTypes.cxx:58]
> TGClient::TGClient(const char*) [libGui.so]
> TRootApplication::TRootApplication(const char*, int*, char**, void*, int) [libGui.so]
> TRootGuiFactory::CreateApplicationImp(const char*, int*, char**, void*, int) [libGui.so]
> TApplication::TApplication(const char*, int*, char**, void*, int) [libBase.so]
> * Reading 1 byte from 0x5dfa00 in the heap.
> * Address 0x5dfa00 is 8 bytes into a freed block at 0x5df9f8 of 17 bytes.
> * This block was allocated from:
> malloc [rtlib.o]
> calloc [rtlib.o]
> __0OnWuI [libNew.so]
> operator new(unsigned int) [rtlib.o]
> Strip(const char*) [libBase.so]
> TGMimeTypes::TGMimeTypes(TGClient*, const char*) [GUI_GMimeTypes.cxx:58]
> * There have been 0 frees since this block was freed from:
> free [rtlib.o]
> __0OdLpV [libNew.so]
> operator delete(void*) [rtlib.o]
> TGMimeTypes::TGMimeTypes(TGClient*, const char*) [GUI_GMimeTypes.cxx:58]
> TGClient::TGClient(const char*) [libGui.so]
> TRootApplication::TRootApplication(const char*, int*, char**, void*, int) [libGui.so]
> --------------------------
>
> Looking in GUI_GMimeTypes.cxx, I could only think of a compiler confused (or purify)
> by the lines "s = Strip(s)". Replacing them, solved indeed the purify problem
> and the segmentation violation !!
>
> GUI_GMimeTypes.cxx:
> --------------------
> if (!strncmp(s, "pattern", 7)) {
> if (!(s = strchr(line, '='))) {
> Error("TGMimeTypes", "malformed pattern line, = missing");
> pattern[0] = 0;
> } else {
> s++;
> //s = Strip(s);
> //strcpy(pattern, s);
> //delete [] s;
> tmp = Strip(s);
> strcpy(pattern, tmp);
> delete [] tmp;
> }
> cnt++;
> }
> if (!strncmp(s, "icon", 4)) {
> if (!(s = strchr(line, '='))) {
> Error("TGMimeTypes", "malformed icon line, = missing");
> icon[0] = 0;
> } else {
> s++;
> //s = Strip(s);
> //strcpy(icon, s);
> //delete [] s;
> tmp = Strip(s);
> strcpy(icon, tmp);
> delete [] tmp;
> }
> cnt++;
> }
> if (!strncmp(s, "action", 6)) {
> if (!(s = strchr(line, '='))) {
> Error("TGMimeTypes", "malformed action line, = missing");
> action[0] = 0;
> } else {
> s++;
> //s = Strip(s);
> //strcpy(action, s);
> //delete [] s;
> tmp = Strip(s);
> strcpy(action, tmp);
> delete [] tmp;
> }
> cnt++;
> }
>
> This issue is maybe resolved in CC 5.0 but it is not straightforward to
> compile ROOT under CC 5.0 (more has to be done than just make).
>
> Best Regards, Eddy
>
--
Org: CERN, European Laboratory for Particle Physics.
Mail: 1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248
WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7677910
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:38 MET