Re: [ROOT] compiler warning

From: Victor Perevoztchikov (perev@bnl.gov)
Date: Mon Jun 07 2004 - 21:14:38 MEST


> Is the following code allowed in other compilers:
>     const Int_t kBufSize = 512; //in global space
>     char option[kBufSize];  // in different functions
This is legal. But this array will disapeared after return or outside of
scope.
Anyway you can use new char[size]. But then somewhere you must delete it, to
avoid memory leak;
Victor


Victor M. Perevoztchikov   perev@bnl.gov
Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY 11973-5000
tel office : 631-344-7894; fax 631-344-4206;

----- Original Message ----- 
From: "cstrato" <cstrato@aon.at>
To: "Victor Perevoztchikov" <perev@bnl.gov>
Cc: <fine@bnl.gov>; "'Elias Athanasopoulos'" <elathan@phys.uoa.gr>;
<roottalk@pcroot.cern.ch>
Sent: Monday, June 07, 2004 3:02 PM
Subject: Re: [ROOT] compiler warning


> Dear all
>
> Thank you all for giving me some more information.
>
> Sorrowly, Victor´s statement is really bad news.
> Is the following code allowed in other compilers:
>     const Int_t kBufSize = 512; //in global space
>     char option[kBufSize];  // in different functions
>
> To reply to Valeri:
> Suppose, I have the following code with the input:
>     "options = "myopt1:myopt2"
>
>     MyFunction(const char *option)
>     {
>        Int_t csize = strlen(options) + 1;
>        char *opt  = new char[csize];
>        char *opt1 = new char[csize];
>        char *opt2 = new char[csize];
>
>        opt = strtok(strcpy(opt, options),":");
>        opt1 = strcpy(opt1, opt);
>
>        opt = strtok(NULL, ":");
>        opt2 = strcpy(opt2, opt);
>
>        myClass->MyMethod(opt1, opt2)
>        {
>           fString1 = opt1;   //TString fString1;
>           fString2 = opt2;   //TString fString2;
>        }
>
>        delete [] opt2;
>        delete [] opt1;
>        delete [] opt;
>     }
> Is this code safe as long as I use TString and not char?
>
> BTW, this is the reason, why I always hated C which I
> have never used, and why I try to use the TString class
> whenever possible, :-)
>
> Best regards
> Christian
>
>
> Victor Perevoztchikov wrote:
>
> > In addition to Valery, construction
> >
> >>>    char option[csize];
> >
> > allowed only in gcc.
> >
> > Victor
> >
> > Victor M. Perevoztchikov   perev@bnl.gov
> > Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY 11973-5000
> > tel office : 631-344-7894; fax 631-344-4206;
> >
> > ----- Original Message ----- 
> > From: "Valeri Fine" <fine@bnl.gov>
> > To: "'cstrato'" <cstrato@aon.at>; "'Elias Athanasopoulos'"
> > <elathan@phys.uoa.gr>
> > Cc: <roottalk@pcroot.cern.ch>
> > Sent: Sunday, June 06, 2004 5:47 PM
> > Subject: RE: [ROOT] compiler warning
> >
> >
> >
> >>>Dear Elias, dear Valeri
> >>>
> >>>Thank you for your explanation.
> >>>I have now solved the problem by using:
> >>>    Int_t csize = strlen(opt) + 1;
> >>>    char option[csize];
> >>>
> >>
> >>[Valeri Fine]
> >> Let me call your attention that your solution is still error prone
> >>
> >> You allocated the needed space on stack.
> >> This means the space will be automatically de-allocated and (it can be
> >>allocated for other purpose) as soon as your code leaves the "option"
> >>variable scope. Because you did not provide your source I have no clue
> >>what this scope is. May be it is what you wanted . . .
> >>
> >>
> >>>I hope that this does not only work with gcc but also with
> >>>other compilers.
> >>
> >>[Valeri Fine]
> >>I hope thee smart compiler will warn as soon as you try using this
> >>variable out of scope, however the smart guy always can defeat any
> >>compiler :-)
> >>
> >>Hope this helps.
> >>
> >>
> >>>Best regards
> >>>Christian
> >>>
> >>>
> >>>Valeri Fine wrote:
> >>>
> >>>
> >>>>Hello Christian
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>>Dear Rooters
> >>>>>
> >>>>>I apologize for a simple non-root question, but sorrowly I have
> >>>>>nobody else to ask:
> >>>>>Sometimes I have statements such as the following:
> >>>>>   if (strcmp(name, "option") == 0) {
> >>>>>      char *option;
> >>>>>      option = strcpy(option, opt);
> >>>>>   }
> >>>>>
> >>>>>Although it is correct, I get the following compiler warning:
> >>>>>"warning: `char*option' might be used uninitialized in this
> >>
> >>function"
> >>
> >>>>
> >>>>[Valeri Fine] It looks like the compiler pointed you to your bug to
> >>
> >>be
> >>
> >>>>fixed. That must lead to the memory corruption. "strcpy"  alone
> >>>>allocates NO extra memory.
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>>How can I prevent such compiler warnings?
> >>>>
> >>>>[Valeri Fine]
> >>>>
> >>>>
> >>>>>Would it be save to write:
> >>>>>      char *option = "";
> >>>>>(If this is not save, why?)
> >>>>
> >>>>[Valeri Fine]
> >>>>Not it is NOT safe !!!
> >>>>
> >>>>To avoid the memory corruption you need
> >>>>
> >>>>  char *option = new char[strlen(opt)+1];
> >>>>
> >>>> or something like this to make sure the memory the POINTER "option"
> >>>>points to is allocated and it is enough to accommodate the entire
> >>
> >>string
> >>
> >>>>pointed by "opt" pointer.
> >>>>
> >>>>  Hope this helps.
> >>>>
> >>>>   Valeri
> >>>>
> >>>>
> >>>>>Thank you in advance
> >>>>>Best regards
> >>>>>Christian
> >>>>>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> >>>>>C.h.r.i.s.t.i.a.n. .S.t.r.a.t.o.w.a
> >>>>>V.i.e.n.n.a.         .A.u.s.t.r.i.a
> >>>>>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> >>>>
> >>>>
> >>>>
> >>>>
> >
> >
> >
>



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:08 MET