aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-09 23:35:03 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-09 23:35:03 +0100
commit3243829828c3052efa55fc866e46c4c8d23b4400 (patch)
treef456ec21ab82a507729d96c5df1060bdb655818b
parent82dee2e25887f26df7126d6789a419eaf14beb8c (diff)
parent82d8c05866c84a04cc5ecba74365573b4c29fcbc (diff)
downloadsparse-3243829828c3052efa55fc866e46c4c8d23b4400.tar.gz
Merge branch 'premature-examine' into next
* fix premature examination of dereferenced object
-rw-r--r--evaluate.c2
-rw-r--r--validation/eval/premature-examination.c27
2 files changed, 28 insertions, 1 deletions
diff --git a/evaluate.c b/evaluate.c
index 34578be8..4d08956e 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -1817,7 +1817,6 @@ static struct symbol *evaluate_dereference(struct expression *expr)
ctype = ctype->ctype.base_type;
target = ctype->ctype.base_type;
- examine_symbol_type(target);
switch (ctype->type) {
default:
@@ -1827,6 +1826,7 @@ static struct symbol *evaluate_dereference(struct expression *expr)
*expr = *op;
return expr->ctype;
case SYM_PTR:
+ examine_symbol_type(target);
node = alloc_symbol(expr->pos, SYM_NODE);
node->ctype.modifiers = target->ctype.modifiers & MOD_SPECIFIER;
merge_type(node, ctype);
diff --git a/validation/eval/premature-examination.c b/validation/eval/premature-examination.c
new file mode 100644
index 00000000..bd2ffa90
--- /dev/null
+++ b/validation/eval/premature-examination.c
@@ -0,0 +1,27 @@
+extern int i;
+
+int foo(void)
+{
+ return *i;
+}
+
+int bar(void)
+{
+ return i[0];
+}
+
+int *qux(void)
+{
+ return &i[0];
+}
+
+/*
+ * check-name: premature-examination
+ * check-command: sparse -Wno-decl $file
+ *
+ * check-error-start
+eval/premature-examination.c:5:16: error: cannot dereference this type
+eval/premature-examination.c:10:17: error: cannot dereference this type
+eval/premature-examination.c:15:18: error: cannot dereference this type
+ * check-error-end
+ */