diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-08 17:09:54 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2019-12-10 23:26:23 +0100 |
commit | 41ba12bf8e76ee2c69222c1c3dfb1a3d420a73d9 (patch) | |
tree | 3443c2ddb58f39f20efea47d65931ed4925bf39c | |
parent | f9b443940a8515132035435d3b4fec232a26c582 (diff) | |
download | sparse-41ba12bf8e76ee2c69222c1c3dfb1a3d420a73d9.tar.gz |
degenerated arrays & functions are addressable too
Symbols which have their address taken (with the 'addressof'
operator: &) are marked as such (with the modifier MOD_ADDRESSABLE).
But degenerated arrays and functions have their address implicitly
taken.
MOD_ADDRESSABLE is used to prevent to replace a symbol dereference
nto the value used to initialize to it. For example, in code like:
static int foo(void)
{
int x[2] = { 1, 2 };
return x[1];
}
the return expression can be replaced by 2. This is not the case
case if the array is first passed in a function call, like here:
extern void def(void *, unsigned int);
static int bar(void)
{
int x[2] = { 1, 2 };
def(x, sizeof(x));
return x[1];
}
Fix this by marking degenerated arrays (and functions) as also
being addressable.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | evaluate.c | 1 | ||||
-rw-r--r-- | validation/eval/addressable-degen.c | 1 | ||||
-rw-r--r-- | validation/expand/constant-init-array.c | 15 |
3 files changed, 16 insertions, 1 deletions
@@ -1772,6 +1772,7 @@ static struct symbol *degenerate(struct expression *expr) *expr = *expr->unop; ctype = create_pointer(expr, ctype, 1); expr->ctype = ctype; + mark_addressable(expr); default: /* nothing */; } diff --git a/validation/eval/addressable-degen.c b/validation/eval/addressable-degen.c index e1dc5107..d420927e 100644 --- a/validation/eval/addressable-degen.c +++ b/validation/eval/addressable-degen.c @@ -11,7 +11,6 @@ static int bar(void) /* * check-name: eval/addressable-degen * check-command: test-linearize -fdump-ir $file - * check-known-to-fail * * check-output-ignore * check-output-contains: load\\. diff --git a/validation/expand/constant-init-array.c b/validation/expand/constant-init-array.c new file mode 100644 index 00000000..94949be5 --- /dev/null +++ b/validation/expand/constant-init-array.c @@ -0,0 +1,15 @@ +int test_array(int i) +{ + static const int a[3] = { 1, 2, 3, }; + + return a[1]; +} + +/* + * check-name: constant-init-array + * check-command: test-linearize -Wno-decl -fdump-ir $file + * + * check-output-ignore + * check-output-excludes: phisrc\\..*return.*\\$2 + * check-output-contains: load\\. + */ |