linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* variable size array declarations
@ 2011-10-31 14:08 Dan Carpenter
  2011-11-17  8:13 ` Dan Carpenter
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2011-10-31 14:08 UTC (permalink / raw)
  To: linux-sparse

[-- Attachment #1: Type: text/plain, Size: 618 bytes --]

I am trying to check something in Smatch with variable size arrays
and I'm running into problems.  Here is the function I'm trying to
parse.

void func(int x)
{
	char buf[x];
}

Array symbols have an ->array_size.  It gets set correctly in parse.c
to expression of type EXPR_SYMBOL.  But by the time I parse it in
Smatch the ->array_size is now an EXPR_PREOP (a dereference).  In
fact all the variables seem to get change to dereferences of the
variables.

So if I have:
	char buf[a + b + *c + 4];
Smatch gets:
	char buf[*a + *b + **c + 4];

I'm not sure where this is getting changed or why.

regards,
dan carpenter


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: variable size array declarations
  2011-10-31 14:08 variable size array declarations Dan Carpenter
@ 2011-11-17  8:13 ` Dan Carpenter
  0 siblings, 0 replies; 2+ messages in thread
From: Dan Carpenter @ 2011-11-17  8:13 UTC (permalink / raw)
  To: linux-sparse

[-- Attachment #1: Type: text/plain, Size: 1161 bytes --]

On Mon, Oct 31, 2011 at 05:08:29PM +0300, Dan Carpenter wrote:
> I am trying to check something in Smatch with variable size arrays
> and I'm running into problems.  Here is the function I'm trying to
> parse.
> 
> void func(int x)
> {
> 	char buf[x];
> }
> 
> Array symbols have an ->array_size.  It gets set correctly in parse.c
> to expression of type EXPR_SYMBOL.  But by the time I parse it in
> Smatch the ->array_size is now an EXPR_PREOP (a dereference).  In
> fact all the variables seem to get change to dereferences of the
> variables.
>

I tracked this down.  In smatch, how I use sparse is that I call
sparse_keep_tokens() and then I parse the resulting symbol list
myself.

In examine_array_type() we call get_expression_value() which changes
the symbols from normal symbols to dereferences.  The call tree is:
examine_array_type()
-> get_expression_value()
   -> __get_expression_value()
      -> evaluate_expression()
         -> evaluate_symbol_expression() <- change happens here.

The problem for me is that not all expressions have been evualated
like this so it's not consistent.

regards,
dan carpenter


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-11-17  8:12 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-31 14:08 variable size array declarations Dan Carpenter
2011-11-17  8:13 ` Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).