aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-08 17:09:54 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-10 23:26:23 +0100
commit41ba12bf8e76ee2c69222c1c3dfb1a3d420a73d9 (patch)
tree3443c2ddb58f39f20efea47d65931ed4925bf39c
parentf9b443940a8515132035435d3b4fec232a26c582 (diff)
downloadsparse-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.c1
-rw-r--r--validation/eval/addressable-degen.c1
-rw-r--r--validation/expand/constant-init-array.c15
3 files changed, 16 insertions, 1 deletions
diff --git a/evaluate.c b/evaluate.c
index c0281e9b..11ad6a22 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -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\\.
+ */