Hello Philippe,
Oops, you are right.
This code was introduced with G__OLDIMPLEMENTATION1910
to prevent uninitialized memory access for things like '&a'. But, it turns
out it is not working. As you found out, the test is always false. I'll
turn it off by defining G__OLDIMPLEMENTATION1910 in G__ci.h.
However, this means you will continue to see valgrind error for '&a'.
By the way, this access is harmless because contents of uninitialized
memory is never used. But anyway, from your observation, this does
not make any difference.
Thank you
Masa Goto
----- Original Message -----
From: "Philippe Canal" <pcanal@fnal.gov>
To: "Masaharu Goto" <MXJ02154@nifty.ne.jp>
Sent: Tuesday, November 25, 2003 6:37 AM
Subject: weird code in CINT's expr.c
> Hi Masa,
>
>
> Around lines 543 and 591, there is code like
>
> ebuf[lenbuf] = '\0'; \
> if(up && '&'==unaopr[up] && ')'!=ebuf[lenbuf-1]) { \
> int store_var_type=G__var_type; \
> G__var_type = 'P'; \
> vstack[sp++] = G__getitem(ebuf); \
> G__var_type=store_var_type; \
> --up; \
> } \
>
> Valgrind claimed that the execution of unaopr[up] was reading unitialized
> memory. My reading of the code comes the same conclusion. I __thought__
> that it should be 'unaopr[up-1]' but make this change breaks the follwoing
code:
> Event *e;void *p = &e;
> After reading the code more carefully this makes sense. I do observe than
> p is set to the VALUE of e and not its address (this is what the code
> snippets does).
>
> So my questions are:
> why do we have this test to begin with?
> why is it suppose to do?
> Is it ever activated (I claim that currently the test is NEVER true).
>
> I am actually proposing to remove the lines (in 2 places in expr.c)
>
> if(up && '&'==unaopr[up] && ')'!=ebuf[lenbuf-1]) { \
> int store_var_type=G__var_type; \
> G__var_type = 'P'; \
> vstack[sp++] = G__getitem(ebuf); \
> G__var_type=store_var_type; \
> --up; \
> } \
>
> Cheers,
> Philippe.
>
>
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:17 MET